参考博客 :
1. 概念
CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。
2. 什么危害
你这可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账……造成的问题包括:个人隐私泄露以及财产安全。
3. CSRF漏洞现状
CSRF这种攻击方式在2000年已经被国外的安全人员提出,但在国内,直到06年才开始被关注,08年,国内外的多个大型社区和交互网站分别爆出CSRF漏洞,如:NYTimes.com(纽约时报)、Metafilter(一个大型的BLOG网站),YouTube和百度HI……而现在,互联网上的许多站点仍对此毫无防备,以至于安全业界称CSRF为“沉睡的巨人”。
到目前,这也是一些重要站点需要重点防护的攻击,与XSS攻击占有相同的比例。
4. CSRF的原理
5. 实例
一个银行转账的操作作为例子(仅仅是例子,真实的银行网站没这么傻:>)
1. 实例1
银行网站A,它以GET请求来完成银行转账的操作,如:http://www.mybank.com/Transfer.php?toBankId=11&money=1000
危险网站B,它里面有一段HTML的代码如下:
<img src=http://www.mybank.com/Transfer.php?toBankId=11&money=1000>
首先,你登录了银行网站A,然后访问危险网站B,噢,这时你会发现你的银行账户少了1000块……
为什么会这样呢?原因是银行网站A违反了HTTP规范,使用GET请求更新资源。在访问危险网站B的之前,你已经登录了银行网站A,而B中的以GET的方式请求第三方资源(这里的第三方就是指银行网站了,原本这是一个合法的请求,但这里被不法分子利用了),所以你的浏览器会带上你的银行网站A的Cookie发出Get请求,去获取资源:
“http://www.mybank.com/Transfer.php?toBankId=11&money=1000”
,结果银行网站服务器收到请求后,认为这是一个更新资源操作(转账操作),所以就立刻进行转账操作……
2. 实例2
网站该用接受POST请求,但是,攻击者可以利用iframe去构造post请求发给被攻击网站,同样中招。
6. 防御
1. 规范化网站请求方法
GET方法只获取资源,不更改服务器上的内容。
2. 在表单中增加伪随机数,服务同步校验
这是在其他危险页面拿不到信任网站的cookie为前提,否则,依然可以发起攻击。
3. 验证码校验
有的时候,对用户不友好。
4. 验证 HTTP Referer 字段
并不能确保万无一失,因为在一些有漏洞的浏览器,referer可能会被篡改。
5. 在 HTTP 头中自定义属性并验证
和上一种方法不同的是,这里并不是把 token 以参数的形式置于 HTTP 请求之中,而是把它放到 HTTP 头中自定义的属性里。通过 XMLHttpRequest 这个类,可以一次性给所有该类请求加上 csrftoken 这个 HTTP 头属性,并把 token 值放入其中。这样解决了上种方法在请求中加入 token 的不便,同时,通过 XMLHttpRequest 请求的地址不会被记录到浏览器的地址栏,也不用担心 token 会透过 Referer 泄露到其他网站中去。
然而这种方法的局限性非常大。