CSRF(Cross-Site Request Forgery)跨站请求伪造攻击。CSRF 是伪造请求,冒充用户在站内的正常操作。我们知道,绝大多数网站是通过Cookie等方式辨识用户身份(包括使用服务器端Session的网站,因为Session ID也是大多保存在Cookie里面的),再予以授权的。所以,要伪造用户的正常操作,最好的方法是通过XSS或链接欺骗等途径,让用户在本机(即拥有身份Cookie的浏览器端)发起用户所不知道的请求。
CSRF这种攻击方式在2000年已经被国外的安全人员提出,但在国内,直到2006年才开始被关注,2008年,国内外的多个大型社区和交互网站分别爆出 CSRF 漏洞,如NYTimes.com(纽约时报)、Metafilter(一个大型的博客网站)、Youtube和百度HI。
1. 分类
CSRF漏洞的攻击一般分为站内和站外2种类型。
CSRF站内类型的漏洞在一定程度上是由于程序员滥用$_REQUEST类变量造成的,一些敏感的操作本来是要求用户从表单提交发起 POST 请求传参给程序,但是由于使用了$_REQUEST等变量,程序也接收GET请求传参,这样就给攻击者使用CSRF攻击创造了条件,一般攻击者只要把预测好的请求参数放在站内一个帖子或留言的图片链接里,受害者浏览了这样的页面就会被强迫发起请求。
CSRF 站外类型的漏洞其实就是传统意义上的外部提交数据问题,一般程序员会考虑给一些留言评论等的表单加上水印以防止SPAM问题,但是为了用户的体验性,一些操作可能没有做任何限制,所以攻击者可以先预测好请求的参数,在站外的Web页面里编写Javascript脚本伪造文件请求或和自动提交的表单来实现GET、POST请求,用户在会话状态下单击链接访问站外的Web页面,客户端就被强迫发起请求。
2. 原理
CSRF的原理如图1所示。
图1 CSRF原理
这就相当于受害者需要在登录A网站之后,再去访问B网站,而B网站往往就是一些钓鱼网站或诈骗网站。
3. 攻击场景
可以用一个例子来说明CSRF的攻击在生活中的应用。
如果银行A允许以GET请求的形式来转账,这里大多指的不是实际生活中的,因为实际生活中银行不可能只用GET请求转账。