前言
现在大多数网站为了提高响应速度,都会在各地节点设置一些缓存服务器,这些服务器会缓存一些后端服务器的内容,如果收到了相同的请求则直接响应给客户端缓存的内容,如我们最常见的CDN就属于这种格式,这种方式提高了响应的速度,可也带来新的一些新的攻击方式,今天就来认识一下web缓存投毒。
由于本人水平有限,文章中可能会出现一些错误,欢迎各位大佬指正,感激不尽。如果有什么好的想法也欢迎交流~~
什么是web缓存?
先来了解一下什么是web缓存,Web缓存就是服务器会先将之前没见过的请求对应的响应缓存下来,然后当有认为是相同请求的时候直接将缓存发给用户,这样可以减轻服务器的负荷。
这里面有几个需要关注的点
1)什么样的请求被认为是相同的请求?
这个主要是根据请求包的几个关键特征(参数)来确定的,如认为host头,请求行,Referer,query参数消息头完全一致,则认为是相同的请求,缓存服务器如果有这个请求的缓存则会直接发送给客户端。这几个关键特征也被叫做缓存键,其它的字段被称作非缓键了。
2)缓存的信息是否会因为请求的不同而改变?
实际情况也是会的,如果开发过程中取请求的某些内容动态的填充到页面中,那么我们也就有可能改变缓存的内容,如果后端取X-Forwarded-Host的值填充到页面中。
web缓存投毒的利用条件?
1)页面被缓存服务器缓存
2)页面存在某个内容是根据非缓存键的值来生成的。例如存在非缓键X-Forwarded-Host,而页面存在一个a标签,它的href是根据X-Forwarded-Host来生成的
#正常请求 GET / HTTP/1.1 Host: test.com X-Forwarded-Host: www.demo.com #正常响应 <a href='www.demo.com'></a> #我们就可以利用web投毒构造XSS GET / HTTP/1.1 Host: test.com X-Forwarded-Host: #'></a><script>alert(1)</script> // #响应变成了 <a href='#'></a><script>alert(1)</script> // '></a>
web缓存投毒可以造成的危害?
看了上面的介绍,大家对web缓存投毒应该有了基本的了解,那么web缓存投毒可以造成什么危害呢?
web缓存投毒只要是将带有payload的缓存发送给其它请求该页面的人,那么它跟xss就很相似,可以通过payload获取客户端的敏感信息或者修改页面内容。但是从影响范围来看,一旦成功缓存被投毒的响应,会影响到大量的用户,比起以往某些只能针对某个用户发起的攻击,危害大很多很多。
工具
上面的说了web缓存中毒的一个重点就是要找到非缓键对页面的影响,这点可以通过burp的一个插件param miner来实现。
param miner可以帮助我们找到影响页面响应的非缓键。
如下图,选择一个请求,右键->Extensions->Param Miner->Guess Params->Guess headers
默认配置即可
实际利用
接下来通过portswigger上面的靶场来进行实际利用
靶场地址:https://portswigger.net/web-security/web-cache-poisoning
1.一个非缓键导致的web缓存中毒
打开这个实验,抓取首页的数据包,将X-Forwarded-Host的值改为baidu.com,看到影响也发生了改变
这一步也可以通过上面的工具来完成,如下,可以探测到X-Forwarded-Host是一个可以影响页面结果的非缓存键。
在服务器上修改创建一个脚本,内容如下
然后将页面的内容修改如下,多点击几次,让缓存生效,如下图,x-cache显示hit表示缓存已经生效。
然后刷新页面,可以看到弹窗