为了降低WEB响应延迟,减轻WEB服务器的负担,WEB缓存技术现在已经很普遍了。除了专用的CDN,负载均衡和反向代理也会缓存网页的一些内容。这里我想介绍一种WEB缓存欺骗攻击技术,它有针对Paypal的成功攻击案例。背景原理简单介绍一下WEB缓存技术,主要是缓存一些静态的、公共的文件,比如CSS文件、JS文件、图片等,缓存有两种。一种是本地缓存,通过缓存在浏览器上实现。缓存后,F5刷新不会重新获取缓存的文件。只有按Ctrl+F5刷新才会重新获取。另一种是在服务器端实现的,即在CDN、负载均衡、反向代理(以下统称缓存服务器)上实现。本次介绍的攻击技术就是针对这类缓存的。服务器端缓存的原理是:客户端请求一个静态文件。如果缓存服务器还没有缓存文件,就会获取静态文件,像web服务器请求一样返回给客户端。同时将该文件缓存起来,下次遇到。相同的请求会直接返回,直到缓存文件过期。接下来说一下WEB服务器解析的问题。假设客户端请求的URL为http://www.example.com/home.p...,其中home.php实际存在,而nonexistent.css不存在,那么web服务器将如何处理呢?这种情况的处理与Web服务器使用的技术和配置有关。有的会返回404notfound,有的会返回200OK,然后返回home.php。如果服务器返回200OK,就要注意了。此时缓存服务器获取到的请求是http://www.example.com/home.p...,是一个静态页面,而web服务器返回给缓存服务器的结果是http://www.example.com/home.php,不是静态页面,但是缓存服务器不知道。攻击方式根据上面的背景原理,攻击方式也很容易总结:1.攻击者引诱登录用户(受害者)访问https://www.bank.com/account....2.受害者用户请求https://www.bank.com/account....3.缓存服务器收到请求但是没有找到这个页面,于是请求WEB服务器4.WEB服务器返回https://www.bank.com/account.do,状态码为200OK5。缓存服务器收到结果,因为状态码是200OK,它会认为URL保持不变,然后因为URL以.png结尾,它认为是静态文件,所以会缓存这个文件6.受害者得到正常的结果。7、攻击者访问,请求到达缓存服务器https://www.bank.com/account....,缓存服务器直接返回受害者的缓存账户页面给攻击者,攻击完成。这里有个问题,就是HTTP头中有一个Cache-Control,用来表示是否缓存页面,但是很多时候缓存服务器是不看这个的,直接根据判断文件后缀。这种攻击的结果是将受害者的个人页面更改为缓存在服务器上的可公开访问的页面。该页面可能包含受害者的敏感信息,如银行卡号,还可能包含受害者的sessionID、密保问题答案、CSRFtoken等,可能让攻击者获得对受害者账户的控制权.攻击成功的条件我们再梳理一下这次攻击的条件:1.WEB服务器会发送类似http://www.example.com/home.p...2.缓存服务器会忽略http头,并且只根据文件后缀判断是否缓存文件3.受害者在访问页面时必须已经登录了满足条件1的WEB服务器。有:正常配置下的原生PHP,基于python的WEB框架Django,一定配置下的ASP.NET,以及满足条件2的缓存服务器是:一些配置下的Nginx一些配置下的Cloudflare一些配置下的IISARR来自这个总结,我们可以看到在大多数情况下,这可以通过配置来避免,所以有人认为这不是一个漏洞。所以没有补丁可以解决这个问题。估计很多地方都存在这个问题。防御建议根据触发条件,我们给出如下修改建议:1、配置缓存服务器,根据http头判断是否缓存页面;2、将所有静态文件放在指定目录下,只缓存该目录下的文件;3、配置WEB服务器在解析http://www.example.com/home.p等页面时返回404或302。希望本文对您有所帮助。我也是做前端开发的。欢迎来到我的web前端q-u-n-交流学习,共同进步。731771211
