个人博客原文链接:http://www.ltang.me/2015/10/26/csrf-attack-study/
原理
CSRF(Cross-site request forgery)跨站请求伪造,由于目标站无token/referer限制,导致攻击者可以用户的身份完成操作达到各种目的
CSRF攻击是源于WEB的隐式身份验证机制!WEB的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器,但却无法保证该请求是用户批准发送的!
简单来说,一个接口url被访问时,后台没有对调用者进行认证,或者认证为授权用户,但其实是攻击者伪造的请求(比如请求中通过uid这样的简单参数分别用户,攻击者可以获取到uid之后可以在自己的访问中添加uid参数,后台不能识别是不是真的该用户的操作)。
复杂一点点地说,用户在访问某正常网站A时候获得授权的cookie,并且未过期,这时候他再打开一个包含了攻击代码的网页,这个网页偷偷地调用了A的接口,由于该用户使用的是自己的浏览器并且授权未过期,那么这个攻击网页中的恶意代码就可以成功调用网站A的接口,并且用户完全不知道。
网站是通过cookie来识别用户的,当用户成功进行身份验证之后浏览器就会得到一个标识其身份的cookie,只要不关闭浏览器或者退出登录,以后访问这个网站会带上这个cookie。如果这期间浏览器被人控制着请求了这个网站的url,可能就会执行一些用户不想做的功能(比如修改个人资料)。因为这个不是用户真正想发出的请求,这就是所谓的请求伪造;因为这些请求也是可以从第三方网站提交的,所以前缀跨站二字。
参考案例:
检测
检测CSRF漏洞是一项比较繁琐的工作,最简单的方法就是抓取一个正常请求的数据包,去掉Referer字段后再重新提交,如果该提交还有效,那么基本上可以确定存在CSRF漏洞。
随着对CSRF漏洞研究的不断深入,不断涌现出一些专门针对CSRF漏洞进行检测的工具,如CSRFTester,CSRF Request Builder等。
以CSRFTester工具为例,CSRF漏洞检测工具的测试原理如下:使用CSRFTester进行测试时,首先需要抓取我们在浏览器中访问过的所有链接以及所有的表单等信息,然后通过在CSRFTester中修改相应的表单等信息,重新提交,这相当于一次伪造客户端请求。如果修改后的测试请求成功被网站服务器接受,则说明存在CSRF漏洞,当然此款工具也可以被用来进行CSRF攻击。
防御
Token
在页面表单中添加一个隐藏的随机值参数token,表单提交到后台后,服务器对该值进行校验,确认该请求确实是由用户发出的。由于攻击者不知道Token,因此无法构造出合法的请求进行攻击。验证码…你懂的
检测refer
常见的互联网页面与页面之间是存在联系的,比如你在www.baidu.com应该是找不到通往www.google.com的链接的,再比如你在论坛留言,那么不管你留言后重定向到哪里去了,之前的那个网址一定会包含留言的输入框,这个之前的网址就会保留在新页面头文件的Referer中
通过检查Referer的值,我们就可以判断这个请求是合法的还是非法的,但是问题出在服务器不是任何时候都能接受到Referer的值,所以Refere Check 一般用于监控CSRF攻击的发生,而不用来抵御攻击。
这个星期被安排学习spring security,里面就有防止csrf攻击的功能,后面再记录。