CSRF与SSRF

Posted xiangbing123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CSRF与SSRF相关的知识,希望对你有一定的参考价值。

CSRF介绍:

跨站点请求伪造(cross site request forgery)是一种经典的昂罗攻击方式。尽管听起来和跨站脚本攻击很相似,但它与跨站脚本攻击非常不同,并且攻击方式几乎完全不一样,CSRF与XSS最大的区别在于,CSRF并没有盗取cookie而是直接利用。跨站脚本攻击利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与跨站脚本攻击相比,CSRF攻击往往不大流行,因此对其进行防范的措施也相当稀少,另外对于CSRF的防范难度更大,所以被认为比跨站脚本攻击更具危险性。

攻击过程:

  CSRF攻击过程有以下两个重点:

    1、目标用户已经登录了网站,能够执行网站的功能

    2、目标用户访问了攻击者够着的URL

漏洞检测:

  常用的方法就是抓取一个正常请求的数据包,去掉Referer字段后在重新提交,如果提交有效,那么基本上可以确定存在CSRF漏洞。

  常用检测工具:CSRFTester,CSRF Request Builder。

漏洞修复建议:

  目前防御CSRF攻击主要有三种策略:验证HTTP Referer 字段,在请求地址中添加token并验证,在HTTP头中自定义属性并验证。

 

验证HTTP Referer字段

根据 HTTP 协议,在HTTP头中有一个字段叫Referer,它记录了该 HTTP 请求的来源地址。在通常情况下,访问一个安全受限页面的请求来自于同一个网站,比如需要访问 http://bank.example/withdraw?account=bob&amount=1000000&for= Hacker,用户必须先登陆bank.example,然后通过点击页面上的按钮来触发转账事件。这时,该转帐请求的Referer值就会是转账按钮所在的页面的URL,通常是以bank.example域名开头的地址。而如果黑客要对银行网站实施 CSRF 攻击,他只能在他自己的网站构造请求,当用户通过黑客的网站发送请求到银行时,该请求的 Referer 是指向黑客自己的网站。因此,要防御CSRF攻击,银行网站只需要对于每一个转账请求验证其Referer值,如果是以bank.example开头的域名,则说明该请求是来自银行网站自己的请求,是合法的。如果Referer是其他网站的话,则有可能是黑客的CSRF攻击,拒绝该请求。

这种方法的显而易见的好处就是简单易行,网站的普通开发人员不需要操心CSRF的漏洞,只需要在最后给所有安全敏感的请求统一增加一个拦截器来检查Referer的值就可以。特别是对于当前现有的系统,不需要改变当前系统的任何已有代码和逻辑,没有风险,非常便捷。

然而,这种方法并非万无一失。Referer的值是由浏览器提供的,虽然 HTTP协议上有明确的要求,但是每个浏览器对于Referer的具体实现可能有差别,并不能保证浏览器自身没有安全漏洞。使用验证 Referer 值的方法,就是把安全性都依赖于第三方(即浏览器)来保障,从理论上来讲,这样并不安全。事实上,对于某些浏览器已经有一些方法可以篡改 Referer值。如果bank.example网站支持 IE6 浏览器,黑客完全可以把用户浏览器的Referer值设为以bank.example域名开头的地址,这样就可以通过验证,从而进行 CSRF 攻击。

即便是使用最新的浏览器,黑客无法篡改Referer值,这种方法仍然有问题。因为Referer值会记录下用户的访问来源,有些用户认为这样会侵犯到他们自己的隐私权,特别是有些组织担心Referer值会把组织内网中的某些信息泄露到外网中。因此,用户自己可以设置浏览器使其在发送请求时不再提供 Referer。当他们正常访问银行网站时,网站会因为请求没有Referer值而认为是CSRF攻击,拒绝合法用户的访问。

 

在请求地址中添加token并验证

攻击之所以能够成功,是因为黑客可以完全伪造用户的请求,该请求中所有的用户验证信息都是存在于Cookie中,因此黑客可以在不知道这些验证信息的情况下直接利用用户自己的Cookie来通过安全验证。要抵御CSRF,关键在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于Cookie之中。可以在HTTP请求中以参数的形式加入一个随机产生的token,并在服务器端建立一个拦截器来验证这个token,如果请求中没有token或者token内容不正确,则认为可能是CSRF攻击而拒绝该请求。

这种方法要比检查Referer要安全一些,token可以在用户登陆后产生并放于session之中,然后在每次请求时把token从session中拿出,与请求中的token进行比对,但这种方法的难点在于如何把token以参数的形式加入请求。对于 GET 请求,token将附在请求地址之后,这样 URL 就变成 http://url?csrftoken=tokenvalue。 而对于 POST 请求来说,要在 form 的最后加上 <input type=”hidden” name=”csrftoken” value=”tokenvalue”/>,这样就把 token 以参数的形式加入请求了。

但是,在一个网站中,可以接受请求的地方非常多,要对于每一个请求都加上token 是很麻烦的,并且很容易漏掉,通常使用的方法就是在每次页面加载时,使用javascript遍历整个dom树,对于dom中所有的a和form标签后加入token。这样可以解决大部分的请求,但是对于在页面加载之后动态生成的html代码,这种方法就没有作用,还需要程序员在编码时手动添加token。

该方法还有一个缺点是难以保证token本身的安全。特别是在一些论坛之类支持用户自己发表内容的网站,黑客可以在上面发布自己个人网站的地址。由于系统也会在这个地址后面加上token,黑客可以在自己的网站上得到这个 token,并马上就可以发动 CSRF 攻击。为了避免这一点,系统可以在添加 token的时候增加一个判断,如果这个链接是链接到自己本站的,就在后面添加 token,如果是通向外网则不加。不过,即使这个csrftoken不以参数的形式附加在请求之中,黑客的网站也同样可以通过Referer来得到这个token值以发动CSRF攻击。这也是一些用户喜欢手动关闭浏览器Referer功能的原因。

在HTTP头中自定义属性并验证

这种方法也是使用token并进行验证,和上一种方法不同的是,这里并不是把token以参数的形式置于HTTP请求之中,而是把它放到HTTP头中自定义的属性里。通过 XMLHttpRequest这个类,可以一次性给所有该类请求加上 csrftoken这个HTTP头属性,并把token值放入其中。这样解决了上种方法在请求中加入token的不便,同时,通过XMLHttpRequest请求的地址不会被记录到浏览器的地址栏,也不用担心token会透过Referer泄露到其他网站中去。

然而这种方法的局限性非常大。XMLHttpRequest 请求通常用于Ajax方法中对于页面局部的异步刷新,并非所有的请求都适合用这个类来发起,而且通过该类请求得到的页面不能被浏览器所记录下,从而进行前进,后退,刷新,收藏等操作,给用户带来不便。另外,对于没有进行CSRF防护的遗留系统来说,要采用这种方法来进行防护,要把所有请求都改为 XMLHttpRequest 请求,这样几乎是要重写整个网站,这代价无疑是不能接受的。

 

 

SSRF介绍:

SSRF(server-site request forgery,服务端请求伪造)是一种由攻击者构造请求,由服务器端发起请求的安全漏洞。一般情况下,SSRF攻击的目标是外网无法访问的内部系统。

原理:

  SSRF形成的元婴大都是由于服务器提懂了从其他服务器应用获取数据的功能,并且没有对目标地址做过滤与限制。例:黑客操作服务端从指定URL地址获取网页文本内容,加载指定地址的图片等,利用的是服务器点请求伪造,SSRF利用存在缺陷的WEB应用作为代理攻击和本地的服务器。

 

SSRF危害:

  1、扫内网

  2、向内网任意主机的任意端口发送精心构造的payload

  3、DOS攻击(请求大文件,始终保持连接keep-alive always)

  4、攻击内网的web应用,主要使用get参数就可以实现的攻击(struts2,sqli等)

  5、利用file协议读取本地文件等 。

SSRF漏洞修复建议:

  

通常有以下5个思路:

  1、过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。

  2、统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。

  3、限制请求的端口为http常用的端口,比如,80,443,8080,8090。

  4、黑名单内网ip。避免应用被用来获取获取内网数据,攻击内网。

  5、禁用不需要的协议。仅仅允许http和https请求。可以防止类似于file:///gopher://、ftp:// 等引起的问题

 

以上是关于CSRF与SSRF的主要内容,如果未能解决你的问题,请参考以下文章

CSRF攻击与防御

CSRF攻击与防御

Django CSRF 说明与配置

防止CSRF攻击与针对CSRF方法接口测试的调整

CSRF攻击与防御

浅谈CSRF原理与案例