CSRF
1.简介
CSRF是指跨站请求伪造。可以这样理解,攻击盗用目标身份,以目标的名义进行违法操作。与XSS不同的是,CSRF不用获取目标的cookie,而是直接利用目标用户当前会话信息,向服务器发送非法请求,完成自己的目的。
CSRF攻击有两个重点:
CSRF的攻击建立在浏览器与Web服务器的会话中;
欺骗用户访问URL。
2. 攻击场景(GET)
这里我们用pikachu靶机来举列说明:
首先进入CERF模块,选择”CSRF(GET)“进行登录,之后可以看到有修改界面:
点击Submit,进行抓包:
拿到GET请求包中的URL连接:
/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=boy&phonenum=1779505414&add=china&email=666666%40pikachu.com&submit=submi
对参数的value值进行修改,(攻击者诱导目标用户)访问该链接
转会到原网页,发现性别被修改:
至此一次完整的CSRF漏洞利用过程完成
3. 攻击场景(POST)
从上面的列子我知道GET型CSRF的利用依靠了URL链接中的参数“xxx.php?id=122”这样,而当请求包为POST时,无法构造这样的URL链接,是不是就没有CSRF漏洞了呢?可以看看下面的列子:
还是pikachu平台,选择“CSRF(POST)”模块,登录后选择修改信息,点击”Submit“进行抓包:
这是我们发现在POST包中没有将参数放在URL中提交,而是在下面的表单中提交,所以我们构造一个post.html页面,伪造表单页面:
接下来只要将这个POST页面发送给目标,诱使目标点击即可完成修改:
4. 检测
检测CSRF漏洞是一项比较繁琐的工作,最简单的方法就是抓取一个正常请求的数据包,去掉Referer字段后再重新提交,如果该提交还有效,那么基本上可以确定存在CSRF漏洞。
随着对CSRF漏洞研究的不断深入,不断涌现出一些专门针对CSRF漏洞进行检测的工具,如CSRFTester,CSRF Request Builder。
以CSRFTester工具为例,CSRF漏洞检测工具的测试原理如下:
使用CSRFTester进行测试时,首先需要抓取我们在浏览器中访问过的所有链接以及所有的表单等信息,然后通过在CSRFTester中修改相应的表单等信息,重新提交,这相当于一次伪造客户端请求。如果修改后的测试请求成功被网站服务器接受,则说明存在CSRF漏洞,当然此款工具也可以被用来进行CSRF攻击
5. 预防
5.1 二次确认
在调用某些功能时进行二次验证,如:删除某用户时,产生一个提示对话框,提示“确认删除用户吗?”。转账操作时,要求用户输入二次密码。
设置验证码。
5.2 Token 认证
目前主流的对CSRF的防御,一致的做法是使用一个Token(Anti CSRF Token)。
例子:
1、用户访问某个表单页面。
2、 服务端生成一个Token,放在用户的Session中,或者浏览器的Cookie中。
3、在页面表单附带上Token参数。
4、用户提交请求后, 服务端验证表单中的Token是否与用户Session(或Cookies)中的Token一致,一致为合法请求,不是则非法请求。
这个Token的值必须是随机的,不可预测的。由于Token的存在,攻击者无法再构造一个带有合法Token的请求实施CSRF攻击。另外使用Token时应注意Token的保密性,尽量把敏感操作由GET改为 POST,以form或AJAX形式提交,避免Token泄露。