天天看点

Web安全之CSRF攻击

csrf是什么?

csrf(cross site request forgery),中文是跨站点请求伪造。csrf攻击者在用户已经登录目标网站之后,诱使用户访问一个攻击页面,利用目标网站对用户的信任,以用户身份在攻击页面对目标网站发起伪造用户操作的请求,达到攻击目的。

举个例子

简单版:

假如博客园有个加关注的get接口,bloguserguid参数很明显是关注人id,如下:

那我只需要在我的一篇博文内容里面写一个img标签:

那么只要有人打开我这篇博文,那就会自动关注我。

升级版:

假如博客园还是有个加关注的接口,不过已经限制了只获取post请求的数据。这个时候就做一个第三方的页面,但里面包含form提交代码,然后通过qq、邮箱等社交工具传播,诱惑用户去打开,那打开过博客园的用户就中招了。

在说例子之前要纠正一个iframe问题,有人会直接在第三方页面这样写。如下:

Web安全之CSRF攻击
Web安全之CSRF攻击

这样是用问题的,由于同源策略的原因,iframe内容根本加载不出来,所以里面form提交当然不会执行。

ps:我尝试了chrome、ie11、firefox,情况都是这样。

所以可以用嵌多一层页面方式解决,如下:

第一个展示页面(test):

Web安全之CSRF攻击
Web安全之CSRF攻击

第二个隐藏页面(test2):

Web安全之CSRF攻击
Web安全之CSRF攻击

这样就可以解决了,有人会问为什么要加多一层iframe,因为不嵌iframe页面会重定向,这样就降低了攻击的隐蔽性。另外我们test页面不使用xmlhttprequest发送post请求,是因为有跨域的问题,而form可以跨域post数据。

进阶版:

假如博客园还是有个加关注的接口,已经限制post,但博文内容是直接贴进html(未过滤),那就遭受xss攻击。那么就可以直接把上面代码嵌入博文,那么只要有人打开我这篇博文,还是会自动关注我,这组合攻击方式称为xsrf。

csrf攻击的本质原因

csrf攻击是源于web的隐式身份验证机制!web的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器,但却无法保证该请求是用户批准发送的。csrf攻击的一般是由服务端解决。

csrf工具的防御手段

1. 尽量使用post,限制get

get接口太容易被拿来做csrf攻击,看第一个示例就知道,只要构造一个img标签,而img标签又是不能过滤的数据。接口最好限制为post使用,get则无效,降低攻击风险。

当然post并不是万无一失,攻击者只要构造一个form就可以,但需要在第三方页面做,这样就增加暴露的可能性。

2. 浏览器cookie策略

ie6、7、8、safari会默认拦截第三方本地cookie(third-party cookie)的发送。但是firefox2、3、opera、chrome、android等不会拦截,所以通过浏览器cookie策略来防御csrf攻击不靠谱,只能说是降低了风险。

ps:cookie分为两种,session cookie(在浏览器关闭后,就会失效,保存到内存里),third-party cookie(即只有到了exprie时间后才会失效的cookie,这种cookie会保存到本地)。

ps:另外如果网站返回http头包含p3p header,那么将允许浏览器发送第三方cookie。

3. 加验证码

验证码,强制用户必须与应用进行交互,才能完成最终请求。在通常情况下,验证码能很好遏制csrf攻击。但是出于用户体验考虑,网站不能给所有的操作都加上验证码。因此验证码只能作为一种辅助手段,不能作为主要解决方案。

4. referer check

referer check在web最常见的应用就是“防止图片盗链”。同理,referer check也可以被用于检查请求是否来自合法的“源”(referer值是否是指定页面,或者网站的域),如果都不是,那么就极可能是csrf攻击。

但是因为服务器并不是什么时候都能取到referer,所以也无法作为csrf防御的主要手段。但是用referer check来监控csrf攻击的发生,倒是一种可行的方法。

5. anti csrf 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泄露。

注意:

csrf的token仅仅用于对抗csrf攻击。当网站同时存在xss漏洞时候,那这个方案也是空谈。所以xss带来的问题,应该使用xss的防御方案予以解决。

总结

csrf攻击是攻击者利用用户的身份操作用户帐户的一种攻击方式,通常使用anti csrf token来防御csrf攻击,同时要注意token的保密性和随机性。

参考文献:

2. 《白帽子讲web安全》

本文为原创文章,转载请保留原出处,方便溯源,如有错误地方,谢谢指正。

转载:http://www.cnblogs.com/lovesong/p/5233195.html

继续阅读