一、漏洞原理
本质:攻击的是未失效的会话。(同一浏览器打开不同页面)
原理图如下:
二、DVWA靶场演示
1、low级别
当我们修改密码为1234时,发现提交方式为get类型
那我们就可以尝试复制url,在同一浏览器中打开一个新的网页,并修改密码值为45678,发现同样能够成功修改密码。
可借助暴力破解模块验证是否成功修改密码。
而在实际的攻击场景中,我们不会点击轻易点击一个长链接,所以这时候就要利用社会工程学,在站长工具中,将长链接生成一个短链接,诱骗受害者点击短链接。
2、medium级别
同样的,将url复制打开新链接,发现这次修改密码失败。
bursuite抓包分析区别
发现数据包中一个含有referer字段,另一个没有。查看源码,原来时对referer字段进行了校验
在本靶场中,最简单的解决思路就是把referer复制过来,填在第二个数据包中即可。
还有另一个思路,就是在同靶场目录下,创建一个html文件,访问该html页面同样可以成功修改密码。这里需要借助burpsuite生成CSRF POC。如图所示:
复制其中的html代码,编写html文件(这里文件名可以任意,因为文件与靶场环境在同一hosts主机,referer中的IP是相同的)
点击submit request,显示成功修改密码!!
3、high级别
在数据包中发现了token字段信息。
尝试复制url修改密码,页面无回显,验证登录发现密码并未修改成功。可见token不能复用。
这里也是参见的一个大佬 的博客找到的解决方案,我们需要结合存XSS漏洞获取token值。进入存储型xss low级别(哪个级别都行,low级别过滤较少)上传下面的js代码
<iframe src="../csrf/" οnlοad="alert(frames[0].document.getElementsByName('user_token')[0].value)"></iframe>
会弹出这样的页面,点击其中的 DVWA security ,会弹出一个token值,不要着急点确定,否则token失效还需要重新获取token。
构造payload,将获取的token值添加在末尾,密码修改成功。
三、CSRF漏洞的挖掘及利用思路
注:
CSRF需要出现在重要的位置才能构成危害(付款、修改密码等场景)
CSRF需要受害者点击才能完成攻击过程(90%)
CSRF需要受害者拥有被攻击网站的cookie才可以,且session会话未失效。
1、关于referer校验,是在实际攻击场景中,我们是无法对用户的referer进行复制的。常规的方法就是我们首先对referer中的内容进行增删,发现其过滤规则是http包头的referer参数的值中必须与host相同。然后借助burpsuite中的模块,生成一个CSRF POC,将代码内容复制到一个新的html文件中,该html文件的名字要含有referer中的关键信息。如果是域名a.com,那么我们可以对html文件命名a.com.html或者b.com.a.com.html;如果是IP,例如在DVWA靶场中,我们发现只要referer中含有192.168.109.130,就可以修改密码成功。那么我们可以将html文件命名为192.168.109.130.html。诱导用户点击该html页面,点击其中按钮,就可以成功修改密码。
2、除此之外,CSRF一般结合XSS漏洞一起使用,因为XSS代码能够使浏览器产生歧义,获取用户cookie、IP、token等信息。对于XSS漏洞原理的理解,感兴趣的小伙伴可以自行查阅其他相关资料学习。
四、修复建议
验证HTTP Referer字段(并不能完全防御)
添加Token字段并验证
添加自定义字段并验证