一、概述
1、CSRF定义
CSRF是一个web安全漏洞,该漏洞通过引诱用户来执行非预期的操作。该漏洞使得攻击者能够绕过同源策略,同源策略是一种用来阻止不同网站相互干扰的一种技术。
CSR跨站请求伪造,攻击者利用服务器对用户的信任,从而欺骗受害者去服务器上执行受害者不知情的请求。在CSRF攻击场景中,攻击者会伪造一个请求(一般为链接),然后欺骗用户进行点击,用户一旦点击,整个攻击也就完成了。所以CSRF攻击也被称为”one click"攻击。
2、CSRF与XSS的区别
CSRF | XSS |
CSRF是利用服务器对用户的信任。 | XSS是利用用户对服务器的信任。 |
CSRF攻击,攻击者会伪造一个用户发送给服务器的正常链接,其核心是要让已登录(已认证)的用户去发请求。CSRF不需要知道用户的cookie,CSRF自己并不会发送请求给服务器,一切交给用户。 | XSS攻击,主要是让脚本在用户浏览器上执行,服务器端仅仅只是脚本的载体,本身服务器端不会受到攻击利用 |
CSRF是攻击者将预先在自己攻击服务器的页面植入恶意代码,诱使受害者访问。在受害者不知情的情况下执行了恶意代码。而攻击服务器是独立的域名 和IP地址。 | XSS是将恶意代码 植入被攻击的服务器,利用用户对服务器的信任完成攻击。 |
3、CSRF攻击的影响
攻击者能够使用户无意中执行一些操作。例如,可能改变用户的邮箱地址、改变用户的账户密码,或者转移用户资金 。根据操作的本质,攻击者可能获取对账户的完全控制。如果受害者是应用的特权账户,那么攻击者可能拥有对应用程序数据和功能的全面控制。
4、CSRF攻击条件
CSRF攻击必须满足以下三个关键条件:
- 服务器端没有对操作的来源进行判断 。IP地址,refer页面
- 受害者处于登录状态,但是攻击者无法拿到cookie。
- 攻击者需要找到一条可以修改或获取敏感信息的请求。
一个相关的行动。应用程序中存在一个攻击者有理由诱导的操作。这可能是一个特权操作(例如修改其他用户的权限),也可能是针对用户特定数据的任何操作(例如更改用户自己的密码)。
基于cookie的会话处理。执行该操作涉及发出一个或多个HTTP请求,应用程序仅依赖会话cookie来识别发出请求的用户。没有其他机制可以跟踪会话或验证用户请求。
没有不可预测的请求参数。执行该操作的请求不包含任何攻击者无法确定或猜测其值的参数。例如,当导致用户更改密码时,如果攻击者需要知道现有密码的值,则该功能不容易受到攻击。
5、攻击场景
1)用户A正常购物
A在购物网站修改个人资料,正常情况下修改资料的第一步是登录个人账号,A登录后对相关参数进行 修改:
收件人:A
收件人电话:13423452345
收件地址 :花田镇211号
A编辑好修改的内容,点击提交。
此时提交的URL为
http://www.pxx.com/member/edit.php?name=A&phone=13423452345&addr="花田镇211号"&submit=submit
2)攻击者尝试截获A购买商品
这时,B想要截获A的包裹,所以他要去修改A的地址,可是B没有A的账号权限。
B发现该网站存在CSRF漏洞
B先确定A处于登录状态
接着B修改个人信息的请求伪造,然后引诱A在登录状态下点击。
此时,A提交的url请求是:
http://www.pxx.com/member/edit.php?name=B&phone=15354325432&addr="欢乐镇345号"&submit=submit
这个请求跟正常修改请求一模一样,而且是A自己账号操作的,所以修改成功,B达到了攻击目的。
3)为什么攻击者能够成功呢 ?
- 条件1:购物网站没有对个人请求进行CSRF防护处理,导致该请求很容易伪造。因此,我们判断一个网站是否存在CSRF漏洞 ,其实就是判断其对关键信息(尤其是密码等敏感信息)的操作(增删改)是否容易被伪造。
- 条件2:A处于登录状态,并且点击了B发送的埋伏 链接。
4)CSRF+钓鱼
CSRF漏洞单看之下的利用比较局限,亦或是用户根本不点这个链接,那么攻击不会成功。
B觉得直接发链接太明显,会被 A轻易识破,于是考虑其他方法。B利用Burpsuit的功能模块做了一个钓鱼网站:
使用burpsuit的engagement tools制作一个CSRF攻击的钓鱼网站
B发给A这个页面,引诱A在 没有退出购物网站的情况下访问钓鱼页面;
A点击了钓鱼网站中的恶意表单,从而在不知情的情况下提交了修改信息的请求。
CSRF是借助受害者的权限完成攻击,攻击者全程没有拿到受害者的权限 。而XSS一般直接通过获得用户权限实施破坏。CSRF比起XSS来说不是很流行,所以对于CSRF的防护措施比较少 ,因此CSRF 比XSS更具有危险性。
二、攻击流程
1、DVWA初级演示
1)存在CSRF漏洞
进入DVWA将DVWA Security设为 low,然后进入CSRF这里。
- 页面功能点:修改密码,直接输入新密码并再次输入新密码确认即可修改。
- 漏洞利用条件:这里没有对旧密码的验证,因此,攻击者B才有伪造请求的可能。如果有旧密码的验证,B并不知道A的账号密码,此时B无法伪造一个完整的请求。
- 攻击防护:验证旧密码或者采用短信验证
2)登录admin账户
登录无效账户或错误密码可以观察下页面回显
3)触发修改密码功能点
4)抓包分析数据报文
GET请求为当前登录的用户修改密码,PHPSESSIONID用于用户身份校验。
5)burp生成CSRF POC
右击engagement tools->generate CSRF poc
6)构造链接并引诱用户点击
将生成的HTML页面复制到攻击服务器下,访问地址http://192.168.254.2/csrf.html
让登录的用户去点击攻击者构造的链接,就可以在用户不知情的情况下修改密码。
Fiddler抓包看到:编号221的是攻击者在攻击服务器上 构造的钓鱼页面。用户在已登录或已认证状态下点击了钓鱼页面,触发了攻击者构造的链接,触发用户修改密码请求,攻击者成功修改了用户密码。
根据Refer我们可以看到是从192.168.1.108跳转过来的。
如何引诱A去点击呢?
比如做个广告、搞点活动、用社会工程学原理,或者说攻击者B和用户A是微信好友,直接微信发链接给A,A恰好是登录状态又在浏览器点了B发过来的链接。或者说你和在线客服聊着天,让在线客服帮忙点下链接,帮忙投投票,投票链接。
可能失败的点
有可能当前的用户并没有登录某服务器或者它压根就没有服务器的账号。
这个就是广撒网了,真实的攻击情况就是广撒网。比如我去改QQ登录密码、163邮箱登录密码。
当然前提是我得找得到CSRF漏洞。CSRF 漏洞怎么体现呢,就是请求比较容易构造并且没有 做校验。找到了CSRF漏洞我就构造修改密码的请求并 通过制作钓鱼网站发给用户诱使用户点击。
如果用户恰好处于登录状态并点击了钓鱼网站链接。
7)CSRF结合XSS 漏洞
只是学习演示下XSS+CSRF漏洞的结合利用,实际中如果有XSS漏洞通过XSS能够直接获取用户cookie,没必要再用CSRF。
- XSS payload
<a href="http://192.168.254.1:8080/vulnerabilities/csrf/?password_new=123123321&password_conf=123123321&Change=Change">
<img src="http://192.168.1.108/111.gif"/></a>
修改前端页面文本框字数限制并将XSS payload粘贴进去
- XSS钓鱼
只要用户点了这张图,密码自动就修改了。
也可将攻击服务器的页面地址通过DVWA的XSS存储型漏洞植入页面中
当DVWA的 当前登录账户去查看XSS漏洞页面时,点击即可完成攻击。
主要是获取到用户的SESSIONID,让服务器去信任用户。引诱用户去点击。
注意:
正常情况下我们有XSS漏洞直接利用XSS漏洞就好,正是因为没有XSS 漏洞我们才需要CSRF,我们就需要自己制作一个钓鱼页面,可以搞个图片,整个 超链接,还可以写一段文字 或者整一些优惠卷领取、礼品赠送等诱使用户点击,比如点此按钮可能领取10元红包,或者 领优惠卷链接,为了答谢新老用户,公司推出XXX活动,加入 粉丝群即可领取优惠卷20元。核心在于诱使用户主动 点。
2、DVWA Security 中级
1)中级于低级的区别
看看源代码,看看medium做了什么限制,发现是加了REFERER的判断
在页面源码中,使用 stripos()
函数来检查当前请求的 HTTP Referer 头部(即来源页面的 URL)是否包含当前服务器的域名。
stripos()
是 PHP 中的一个字符串查找函数,用于在字符串中查找子字符串(不区分大小写)第一次出现的位置。如果找到子字符串,则返回它在主字符串中的位置;如果没有找到,则返回 false
。
2)burp改REFERER绕过
绕过限制,通过Burp改包,修改REFERER
虽然我们改掉了密码 ,但是这是不对的。 我们是自己本地在模拟,所以使用burpsuit抓包改下REFERE就好了 。但是实际情况下,用户不可能访问的时候去Burp抓包改REFERE。
CSRF的目标是把链接交给用户去点,而不是我们自己在这儿点,如果把链接交给用户,用户是不会去帮我们改REFERE的。
所以我们得想另外的办法让REFERE包含服务器端的IP地址(这里是192.168.254.1)。
3)正确解决思路
构造的攻击页面命名包含受害者主机IP名,这样REFERE就能包含主机名。只要REFERE中包含受害者主机的IP就能绕过。
在源码中stripos()函数是若匹配,只要REFERE中包含受害者主机IP就可以通过验证。
攻击页面构造poc
在 攻击服务器上创建一个新的HTML页面,并命名 为:change_192.168.254.1.html,内容为:
<a href="http://192.168.254.1:8080/vulnerabilities/csrf/?password_new=123123321&password_conf=123123321&Change=Change">
<img src="http://192.168.1.108/111.gif"/></a>
受害者访问恶意网页
- 表单方式
此操作需要使用超链接的形式,用Burp生成的基于表单的提交方式将会失效 。
如果我们使用表单方式将之前攻击服务器csrf.html文件名修改为change_192.168.254.1.html
- 使用超链接形式
这里,没有成功,原因是浏览器自动过滤了REFERE中的文件名。