先来看一个例子,index.php需要登录后才可以看到个人信息,在a浏览器登录后然后访问http://192.168.81.210/web/csrf/source/cors/index.php/123.css切换到b浏览器,访问a浏览器的链接,可以发现不需要经过登录也可以看到个人信息。以上例子就是一个web缓存欺骗攻击
漏洞介绍
Web缓存欺骗(Web Cache Deception)是一种新的web攻击方法,包括web框架以及缓存机制等在内的许多技术都会受到这种攻击的影响。攻击者可以使用这种方法提取web用户的私人及敏感信息,在某些场景中,攻击者利用这种方法甚至可以完全接管用户账户。 Web应用框架涉及许多技术,这些技术存在缺省配置或脆弱性配置,这也是Web缓存欺骗攻击能够奏效的原因所在。 如果某个用户访问看上去人畜无害、实际上存在漏洞的一个URL,那么该Web应用所使用的缓存机制就会将用户访问的具体页面以及用户的私人信息存储在缓存中。
背景介绍
很多网站都会使用web缓存功能来减少web服务器的延迟,以便更快地响应用户的内容请求。为了避免重复处理用户的请求,web服务器引入了缓存机制,将经常被请求的文件缓存起来,减少响应延迟。通常被缓存的文件都是静态文件或者公共文件,如样式表(css)、脚本(js)、文本文件(txt)、图片(png、bmp、gif)等等。通常情况下,这些文件不会包含任何敏感信息。 有多种方法能够实现缓存,比如,浏览器端也可以使用缓存机制:缓存文件后,一段时间内浏览器不会再次向web服务器请求已缓存的文件。这类缓存与web缓存欺骗攻击无关。实现缓存的另一种方法就是将一台服务器部署在客户端和web服务器之间,充当缓存服务器角色,这种实现方法会受到web缓存欺骗攻击影响。这类缓存有各种表现形式,包括:
- CDN(Content Delivery Network,内容分发网络)。CDN是一种分布式代理网络,目的是快速响应内容请求。每个客户端都有一组代理服务器为其服务,缓存机制会选择离客户端最近的一个节点来提供服务。
- 负载均衡(Load balancer)。负载均衡除了能够通过多台服务器平衡网络流量,也能缓存内容,以减少服务器的延迟。
- 反向代理(Reverse proxy)。反向代理服务器会代替用户向web服务器请求资源,然后缓存某些数据。
工作过程
假设我们要访问的某个网站使用了服务器缓存技术,架构如下: 举个例子,网站(Apache+PHP)配置了一个反向代理服务器(Nginx)作为web缓存。与其他网站类似,这个网站使用了公共文件,如图片、css文件以及脚本文件。这些文件都是静态文件,该网站的所有或绝大部分用户都会用到这些文件,对每个用户来说,此类文件返回的内容没有差别。这些文件没有包含任何用户信息,因此从任何角度来看,它们都不属于敏感文件。 某个静态文件第一次被请求时,该请求会直接穿透代理服务器。缓存机制没见过这个文件,因此会向服务器请求这个文件,然后服务器会返回文件内容。现在,缓存机制需要识别所接收的文件的类型。不同缓存机制的处理流程有所不同,但在大多数情况下,代理服务器会根据URL的尾部信息提取文件的扩展名,然后再根据具体的缓存规则,决定是否缓存这个文件。 如果文件被缓存,下一次任何客户端请求这个文件时,缓存机制不需要向服务器发起请求,会直接向客户端返回这个文件。
利用条件
1、缓存服务器根据后缀进行缓存 2、访问xx.php/1.js等不存在的的静态文件,返回对应的xx.php的内容。 3、受害者必须登录了网站
利用流程
当注册的用户成功登入了该网站,会跳转到自己的账户页面index.php,该Nginx反向代理服务器会将css、js、jpg等静态资源缓存到nginx设定的目录下。受害者不小心在浏览器中输入了如下的url:http://victim.com/index.php/123.css, 123.css 并不存在,此时会发什么神奇的事情呢? Nginx反向代理服务器发现url以静态文件的扩展名(.css)结尾,由于123.css 不存在,它的缓存机制会将 index.php 缓存到缓存目录中,这时攻击者访问了:http://victim.com/index.php/123.css,之前 缓存的帐户页面便成功返回给了攻击者。
最后贴一个phpstudy的nginx的配置,网上基本所有的文章都只是贴了文字,对于配置都是一笔带过,因为并不是很熟悉nginx的配置,只是勉强配置能复现,配置文件nginx.conf:首先在http模块下添加
proxy_cache_path D:/Software/PHPStudy/PHPTutorial/nginx/cache levels=1:2 keys_zone=SLoan:500m inactive=10d max_size=10g;
proxy_temp_path D:/Software/PHPStudy/PHPTutorial/nginx/cache/temp;
然后在server模块下添加了两个location
location ~ .*\.(gif|jpg|png|css|js)(.*) {
proxy_pass http://192.168.81.210:8070;#图中的源服务器地址
proxy_cache SLoan;#keys_zone的值
proxy_redirect default;
proxy_ignore_headers Cache-Control Expires;
proxy_set_header Host $host;
#proxy_set_header X-Forwarded-For $remote_addr;
proxy_cache_valid 200 304 5m;
proxy_cache_valid any 1m;
proxy_cache_key $host$uri$is_args$args;
add_header Nginx-Cache "$upstream_cache_status";
expires 10d;
}
location ~ \.php$ {
proxy_pass http://192.168.81.210:8070;
}
参考文章
https://www.anquanke.com/post/id/86516
|