什么是CSRF?
CSRF(Cross Site Request Forgery 跨站域请求伪造),是一种对网站的恶意利用,他通过伪装来自受信任用户的请求来利用受信任的网站,与XSS攻击相比,CSRF不大流行且难以防范。
CSRF能够做到:以你的名义发送邮件、发消息、盗用账号、购买商品、转账等等。
造成的问题包括:个人隐私泄露和财产安全。
原理:
由上可知,要完成一次CSRF攻击,必须满足两个条件
- 登录受信任的网站A,并在本地生成cookie
- 在不登出A的情况下访问危险网站B(关闭浏览器本地cookie不一定会过期)
GET类型的CSRF
get类型的CSRF一般这样利用,用户在访问了含有这个<img src=http://wooyun.org/csrf?xx=11 />的页面后,成功向wooyun网站发出了一次http请求,如果该网址为存在get型的CSRF地址,则完成了攻击。
POST类型的CSRF
post类型的CSRF通常使用一个自动提交的表单,访问该页面后,表单自动提交,相当于模拟用户完成一次post操作。如下
<form action=http://wooyun.org/csrf.php method=POST>
<input type="text" name="xx" value="11" />
</form>
<script> document.forms[0].submit(); </script>
如何防御CSRF?
- 验证HTTP Referer字段
http头中有个referer字段,记录了该http请求的来源地址。如果存在安全网站A,攻击网站B。A限制了在访问A的时候必须要先访问C网站(如登录验证),即A只有在referer字段值为C域名才可放行,用户再打开B网站时,对A发起了一次CSRF攻击,A识别到referer是B域名,则可拒绝请求。
缺点:此方法需要依赖浏览器来保障,某些浏览器(IE6、FF2)可支持篡改referer值。
- 在请求地址中添加token并验证
在http请求中以参数形式加上一个token,并在服务端验证这个token,如果请求中没有token或token不正确,则可以认为是CSRF攻击而拒绝该请求。这个方法比检查referer安全。
缺点:黑客网站可以通过referer来得到这个token值发起csrf攻击。
- 在http头中自定义属性并验证
不再将token放在http的请求参数中,而将token放至自定义的http头中。
缺点:此方法需要通过XMLHttpRequest请求,如果没有进行CSRF防御的遗留系统如果要用此方法,需要改写整个网站。