为了减少WEB响应时延并减小WEB服务器负担,现在WEB缓存技术已经用的非常普遍了,除了专门的CDN,负载均衡以及反向代理现在也会缓存一部分的网页内容。这里我要介绍一种WEB缓存欺骗攻击技术,这种攻击技术针对Paypal有成功的攻击案例。
背景原理
先简单介绍一下WEB缓存技术,它主要是缓存一些静态的,公开的文件,如CSS文件,JS文件,图片等。缓存分两类,一类是本地缓存,通过在浏览器上缓存实现,缓存之后通过F5刷新是不会重新获取已缓存文件的,通过Ctrl +F5强制刷新才会重新获取。另一类是在服务端实现,也就是在CDN、负载均衡、反向代理(后面统称缓存服务器)上实现,这次介绍的攻击技术就是针对这一种缓存。服务端的缓存原理是:客户端请求一个静态文件,如果缓存服务器没有缓存过这个文件,就会像WEB服务器请求,获取到静态文件返回给客户端,同时将这个文件缓存下来,下次再遇到同样的请求时就直接返回,直到这个缓存文件过期。
接下来讲一下WEB服务器解析的问题。假设客户端请求
http://www.example.com/home.p... 这个URL,其中home.php是真实存在的,而nonexistent.css不存在,那WEB服务器会怎么处理呢?针对这种情况的处理跟WEB服务器用的技术以及配置相关,有的会返回404 not found,有的会返回200 OK,然后把home.php返回回来。如果服务器返回200 OK就要注意了,这时缓存服务器拿到的请求是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,状态码是200 OK
5.缓存服务器收到结果,由于状态码是200 OK,会认为URL保持不变,然后由于这个URL以.png结尾,认为它是一个静态文件,于是会缓存这个文件
6.受害者得到正常结果
7.攻击者访问,请求到达缓存服务器https://www.bank.com/account....,缓存服务器直接返回受害者的缓存账户页面给攻击者,攻击完成。
这里有一个问题,就是HTTP header里面有一个Cache-Control,用于指示是否要缓存该页面,但是很多情况下,缓存服务器是不看这个的,直接根据文件后缀判断。
这种攻击的结果就是将受害者的个人页面变为了一个缓存在服务器上,可以公开访问的页面。这个页面可能包含受害者敏感信息,如银行卡号,也可能有这个受害者的会话标识、密保问题答案、CSRF token等,有可能让攻击者获取到受害者账号的控制权。
攻击成功的条件
我们再来梳理一下这个攻击的条件:
1.WEB服务器会将类似http://www.example.com/home.p...
2.缓存服务器会无视http header,只根据文件后缀来判断是否缓存该文件
3.受害者访问该页面时必须已登录
符合条件1的WEB服务器有:
原生的PHP通常配置下的基于python的WEB框架Django
某些配置下的ASP.NET
符合条件2的缓存服务器有:
某些配置下的Nginx某些配置下的Cloudflare
某些配置下的IIS ARR
从这个总结可以看出,多数情况下这个是可以通过配置避免的,所以有些人认为这不算是个漏洞,所以也并没有什么补丁来解决这个问题,估计这个问题在很多地方都存在。
防御建议
根据触发条件我们给出的修改建议如下:
1.配置缓存服务器根据http header来判断是否缓存页面;
2.将所有静态文件放在指定的目录,只缓存这个目录里的文件;
3.配置WEB服务器在解析类似http://www.example.com/home.p... 这种页面时返回404或者302。
希望本文对你有帮助,同样是做前端开发的,欢迎到我的web前端q-u-n-交流学习,共同进步。731771211
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。