69

一种新型的Web缓存欺骗攻击技术

 5 years ago
source link: https://www.freebuf.com/articles/web/187538.html?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

为了减少WEB响应时延并减小WEB服务器负担,现在WEB缓存技术已经用的非常普遍了,除了专门的CDN,负载均衡以及反向代理现在也会缓存一部分的网页内容。这里我要介绍一种WEB缓存欺骗攻击技术,这种攻击技术针对Paypal有成功的攻击案例。

背景原理

先简单介绍一下WEB缓存技术,它主要是缓存一些静态的,公开的文件,如CSS文件,JS文件,图片等。缓存分两类,一类是本地缓存,通过在浏览器上缓存实现,缓存之后通过F5刷新是不会重新获取已缓存文件的,通过Ctrl +F5强制刷新才会重新获取。另一类是在服务端实现,也就是在CDN、负载均衡、反向代理(后面统称缓存服务器)上实现,这次介绍的攻击技术就是针对这一种缓存。服务端的缓存原理是:客户端请求一个静态文件,如果缓存服务器没有缓存过这个文件,就会像WEB服务器请求,获取到静态文件返回给客户端,同时将这个文件缓存下来,下次再遇到同样的请求时就直接返回,直到这个缓存文件过期。

接下来讲一下WEB服务器解析的问题。假设客户端请求 http://www.example.com/home.php/nonexistent.css 这个URL,其中home.php是真实存在的,而nonexistent.css不存在,那WEB服务器会怎么处理呢?针对这种情况的处理跟WEB服务器用的技术以及配置相关,有的会返回404 not found,有的会返回200 OK,然后把home.php返回回来。如果服务器返回200 OK就要注意了,这时缓存服务器拿到的请求是 http://www.example.com/home.php/nonexistent.css ,是一个静态页面,而WEB服务器返回给缓存服务器的结果是 http://www.example.com/home.php ,不是一个静态页面,但是缓存服务器并不知道。

攻击方法

根据上面的背景原理介绍,攻击方法也很容易总结出来了:

1.攻击者引诱已登录的用户(受害者)访问 https://www.bank.com/account.do/logo.png

2.受害者请求 https://www.bank.com/account.do/logo.png

3.缓存服务器接收到请求,没查到这个页面,于是向WEB服务器请求

4.WEB服务器返回 https://www.bank.com/account.do ,状态码是200 OK

5.缓存服务器收到结果,由于状态码是200 OK,会认为URL保持不变,然后由于这个URL以.png结尾,认为它是一个静态文件,于是会缓存这个文件

6.受害者得到正常结果

7.攻击者访问 https://www.bank.com/account.do/logo.png ,请求到达缓存服务器,缓存服务器直接返回受害者的缓存账户页面给攻击者,攻击完成。

6NzYNf6.jpg!web

这里有一个问题,就是HTTP header里面有一个Cache-Control,用于指示是否要缓存该页面,但是很多情况下,缓存服务器是不看这个的,直接根据文件后缀判断。

这种攻击的结果就是将受害者的个人页面变为了一个缓存在服务器上,可以公开访问的页面。这个页面可能包含受害者敏感信息,如银行卡号,也可能有这个受害者的会话标识、密保问题答案、CSRF token等,有可能让攻击者获取到受害者账号的控制权。

攻击成功的条件

我们再来梳理一下这个攻击的条件:

1.WEB服务器会将类似 http://www.example.com/home.php/nonexistent.css 这种页面解析为home.php

2.缓存服务器会无视http header,只根据文件后缀来判断是否缓存该文件

3.受害者访问该页面时必须已登录

那么,那些组件满足这些条件呢?(以下具体的配置请参见文末所附链接)

符合条件1的WEB服务器有:

l  原生的PHP
l  通常配置下的基于python的WEB框架Django
l  某些配置下的ASP.NET

符合条件2的缓存服务器有:

l  某些配置下的Nginx
l  某些配置下的Cloudflare
l  某些配置下的IIS ARR

从这个总结可以看出,多数情况下这个是可以通过配置避免的,所以有些人认为这不算是个漏洞,所以也并没有什么补丁来解决这个问题,估计这个问题在很多地方都存在。

防御建议

根据触发条件我们给出的修改建议如下:

1.配置缓存服务器根据http header来判断是否缓存页面;

2.将所有静态文件放在指定的目录,只缓存这个目录里的文件;

3.配置WEB服务器在解析类似 http://www.example.com/home.php/nonexistent.css 这种页面时返回404或者302。

原文信息

本文根据Omer Gil的文章翻译而成。他创新地颠覆了WEB缓存欺骗利用方式,通过控制 Web 缓存可以保存其它用户的敏感数据,并成功在 Paypal 中实现了攻击复现。从 Omer Gil 的演讲和报告中可以看到,Web 缓存欺骗是一项厉害且有想像力的技术,这种技术可以在多种主要的缓存机制中利用实现,为未来的深入研究提供一个很好的基础平台。

随着应用程序安全性的不断成熟,寻找真正的新技术变得越来越难,所以在不断的演化过程中,能看到这种可证实的安全隐患,非常令人耳目一新。因此,这种攻击技术被评为2017十大WEB黑客技术榜单的第二名。

演示视频:

原文链接: https://www.blackhat.com/docs/us-17/wednesday/us-17-Gil-Web-Cache-Deception-Attack-wp.pdf

*参考来源: blackhat ,本文作者:lex1993,转载请注明来自FreeBuf.COM


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK