`
jsntghf
  • 浏览: 2478135 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

浅谈CSRF

阅读更多

一、什么是CSRF
先看看CSRF的原文说明,如下:
Cross Site Reference Forgery works by including malicious code or a link in a page that accesses a web application that the user is believed to have authenticated. If the session for that web application has not timed out, an attacker may execute unauthorized commands.

 

二、CSRF案例说明和分析
自然,这里拿Rails程序来举例子说明这些问题,大家知道Rails2之前是把session放在服务器端(文件或者DB或者缓存中),客户端在cookie中保存sessionid;而到了Rails2后,还有一种方式是把session放在基于cookie的客户端中。当然这两样都各有道理,各有优劣。当我们向一个域名发送一个请求的时候,如果存在这个域名的cookie,浏览器会自动把cookie附带上。这样本来没有啥问题,也是我们为了解决http无状态记录的解决方案,但是有个问题出现了,如果出现一个到其他域名的请求,浏览器在加载的时候,也把cookie给带上了,会有什么问题?我们举个简单的也很常见的例子来说明这个问题。
1、Bob在自己的电脑上刚刚查看完自己的银行A账户余额,然后比较无聊就跑到一个公开的BBS上灌水,当他看到一篇“银行A的内部照片”的帖子,很有兴趣的打开这个帖子想看看自己信任的银行A的内部图片是啥样子的,殊不知,这其实是一个attacker精心设计的骗局。
2、在这个帖子中确实有几个图片,看上去真的像是银行A的照片,但是其中有个图片没显示出来,Bob以为是自己网速太慢,导致这个图片没有加载进来,也没在意。只是对这些并不是十分满意的照片摇摇头,就关了这个帖子。
3、几天后,Bob猛然发现自己在银行A的账户上少了1000元,到底是怎么了?
分析:
为什么钱少了呢?我们得分析一下上面这个案例,还记得当时Bob说有个图片没显示么,是的,我们来看看这个图片的地址,惊奇的发现是:<img .src="http://www.banka.com/transfer?account=myself&amount=1000&destination=attacker">,这是一个什么地址?聪明的您一定很快就能明白,这个地址是邪恶的,看上去,他的意思是打开这个地址的人,给attacker转了1000元。
这怎么可能?你肯定急了,我怎么能随便给一个人转1000元呢,而且我都不知道呀!但是,注意了,这其实是完全有可能的。还记得当时Bob刚刚查看完帐号信息,基于银行A的cookie并不过期,当出现如上链接出现在src的时候(note that .src is meant to be src),浏览器尝试着按照本地的cookie去加载上面这个URL,而银行A验证了来源请求的cookie是可以的,所以就这样事情就悄悄的发生了。
ok,看明白了么,这就是CSRF,一句话给他下个定义就是:借你的cookie在你不知道的时候悄悄的做了一些你不愿意做的事情。这里有个更要命的是,这个包含上述URL的图片或者链接,并不需要一定是放在银行A的服务器上,相反可以在任一地方,比如blog,公开的BBS,或者一些群发的Mail中等等,如此多的场合下,这些都有可能存在陷阱。

 

三、CSRF的预防
看上去很恐怖吧,是的,确实恐怖,意识到恐怖是个好事情,这样会促使你接着往下看如何改进和防止类似的漏洞出现。
总体来说,预防CSRF主要从2个方面入手,分别是:
1、正确使用GET,POST和Cookie;
2、在non-GET请求中使用Security token;

一般,大家知道的浏览器发送请求的方式有GET或者POST,但是还有一种比较常用的是Cookie,至于其他的HTTP协议请求方式,你可以google,一般按照W3C的规范:
1、GET常用在查看,列举,展示的时候;
2、POST常用在下达订单,改变一个资源的属性或者做其他一些事情;

ok,我们这里拿Rails按照前面列举的2种预防手段做说明,首先,我们可以在Rails的控制器中(controller)将一些方法(action)限定(verify)为只能使用POST或者GET,例如:

verify :method => :post, :only => [ :transfer ], :redirect_to => { :action => :list } 

 

恩,很好,这样做下限制以后,前面案例中的方法就失效了,因为这里我们限定了transfer必须使用POST来提交请求,当GET请求来的时候并不会被响应。
万事大吉了?NO!因为POST的请求也是可以被构造出来后自动发送的,如何实现,看下面吧,你肯定会吃惊的。

<a .href="http://www.1sters.com/" onclick="var f = document.createElement('form'); f.style.display = 'none'; this.parentNode.appendChild(f); f.method = 'POST'; f.action = 'http://www.example.com/account/destroy'; f.submit();return false;">点我试试</a> 

 

是的,这就是一个活生生的例子(.href is meant to be href),使用link的href或者img的src都可以,再想想一个Attacher放了一个图片,然后写了一个onmouseover方法,执行上述的那段JS,如下,或者使用AJAX。

<img .src="http://www.harmless.com/img" width="400" height="400" onmouseover="…" />

 

所以,限定为POST后还不是非常的保险,怎么办?不急,我们还有第二步,给non-GET的请求设置security token,如何实现,在Rails2以后非常简单(也是默认的),我们只需要在environment.rb中添加如下代码:

config.action_controller.session = {   
  :session_key => '_csrf_session',   
  :secret      => 'ae4b43dda38ff78bb50898b2935da76d1e224061ab72a9399d34cea4c6178eee6dae815fff920a20642f27abda83b793da4e9b6cf20c4838805e80abf53e318a'   
}

 然后在application controller中包含如下security token设置:

protect_from_forgery  :secret => 'ae4b43dda38ff78bb50898b2935da76d1e224061ab72a9399d34cea4c6178eee6dae815fff920a20642f27abda83b793da4e9b6cf20c4838805e80abf53e318a' 

 

ok,基本上安全了,如果这时POST请求过去,但是security token和session计算出来的secret和服务端的secret匹配不上的话,就会返回一个ActionController::InvalidAuthenticityToken错误,防止该类缺陷的出现。
安全了,也许你要说,那我如果能破解出protect_from_forgery,不就OK了么,按照理论上是,但是实际破解是基本上不可能的,因为有人曾计算过,暴力破解该串大概需要2的11次方时间。

分享到:
评论
2 楼 helloqidi 2010-12-12  
同样感谢你的解惑
1 楼 lovetysx 2010-09-30  
谢谢!解决了我很多困惑!
能多说说security token的运行过程或原理吗?

相关推荐

    浅谈CSRF攻击方式

    浅谈CSRF攻击方式浅谈CSRF攻击方式浅谈CSRF攻击方式浅谈CSRF攻击方式浅谈CSRF攻击方式

    从开发角度浅谈CSRF攻击及防御

    CSRF可以叫做(跨站请求伪造),咱们可以这样子理解CSRF,攻击者可以利用你的身份你的名义去发送(请求)一段恶意的请求,从而导致可以利用你的账号(名义)去--购买商品、发邮件,恶意的去消耗账户资源,导致的一些列恶意...

    【ASP.NET编程知识】浅谈ASP.NET MVC 防止跨站请求伪造(CSRF)攻击的实现方法.docx

    【ASP.NET编程知识】浅谈ASP.NET MVC 防止跨站请求伪造(CSRF)攻击的实现方法.docx

    浅谈ASP.NET MVC 防止跨站请求伪造(CSRF)攻击的实现方法

    下面小编就为大家分享一篇浅谈ASP.NET MVC 防止跨站请求伪造(CSRF)攻击的实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    10-CSRF的攻击与防御1

    1、论安全响应中心的初衷 2、安全应急响应中心之威胁情报探索 3、论安全漏洞响应机制扩展 4、企业级未授权访问漏洞防御实践 5、浅谈企业SQL注入漏洞的危害与防

    PHP开发中常见的安全问题详解和解决方法(如Sql注入、CSRF、Xss、CC等)

    浅谈Php安全和防Sql注入,防止Xss攻击,防盗链,防CSRF 前言: 首先,笔者不是web安全的专家,所以这不是web安全方面专家级文章,而是学习笔记、细心总结文章,里面有些是我们phper不易发现或者说不重视的东西。所以...

    浅谈Django前端后端值传递问题

    前端后端传值问题总结 前端传给后端 通过表单传值 1、通过表单get请求传值 在前端当通过get的方式传值时,表单中的标签的name值将... {% csrf_token %} &lt;select class=select&gt; 类别 name=class&gt;类别&lt;/opti

    浅谈laravel框架与thinkPHP框架的区别

    2、在Laravel框架里,由于其考虑到了跨站请求伪造, 所以如果使用form表单以post方式进行传值时,如果不再form表单中加入{{csrf_field()}}则会报出TokenMethodnotfound的语法错误; 而TP框架则需要自己手动完成防止跨站...

    php表单加入Token防止重复提交的方法分析

    Token浅谈 Token,就是令牌,最大的特点就是随机性,不可预测。一般黑客或软件无法猜测出来。 那么,Token有什么作用?又是什么原理呢? Token一般用在两个地方——防止表单重复提交、anti csrf攻击(跨站点请求伪造...

    1.初探安全.pptx

    浅谈渗透测试前的信息收集 00:34:39 【五、漏洞讲解】 1.文件泄露 00:08:01 2.SQL注入 00:42:41 3.XSS 01:05:58 4.CSRF 00:21:27 5.暴力破解 00:32:11 6.文件上传 00:22:40 7.逻辑漏洞 00:07:47 【六、漏洞扫描工具...

Global site tag (gtag.js) - Google Analytics