从业者-缓存设计缺陷-多标头Web缓存投毒
# 实验室:多标头 Web 缓存投毒
# 题目
此实验室包含一个 Web 缓存投毒漏洞,仅当你使用多个标头构建恶意请求时,该漏洞才可被利用。用户大约每分钟访问一次主页。要解决此实验,请毒害缓存响应,并在访问者的浏览器中执行alert(document.cookie)
。
提示
此实验室支持X-Forwarded-Host
和X-Forwarded-Scheme
标头。
- name: 实验室-从业者
desc: 多标头 Web 缓存投毒 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/web-cache-poisoning/exploiting-design-flaws/lab-web-cache-poisoning-with-multiple-headers
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
# 实操
点击 “ACCESS THE LAB” 进入实验室。
一个购物站点。
# 双标头造成了有毒的重定向
捕获一个首页的请求数据包,发现该页面具有缓存,缓存时效为30
秒。
根据题目中的提示,添加X-Forwarded-Host
标头并再次发送请求,没有发生任何事情......
根据提示,再添加X-Forwarded-Scheme
标头,值为http
,发送请求。
在第二个标头的作用下,请求发生了跳转。目标服务器以为客户端正在通过 HTTP 协议访问站点,强制将请求跳转至 HTTPS 协议。
在标头X-Forwarded-Host
的作用下,将要跳转的目标域变为了相应的值qweasdzxc
。
一个值得注意的地方,该响应具有缓存!缓存时效为30
秒。
除了控制跳转的域名以外,还可以控制路径。
(经过测试,当X-Forwarded-Scheme
标头的值为https
时不会发生任何事情)
访问漏洞利用服务器,将路径设置为你喜欢的值,例如/exploit/
。
同时,由于此次的漏洞不是 “在原站点上导入恶意资源”,而是 “跳转至恶意站点”。
- 所以要将响应标头
Content-Type
从text/javascript
修改为text/html
- 并为正文的
alert()
添加script
标签,使其作为 HTML 的一部分来执行
记得点击 “Store” 保存。
测试一下配置,访问漏洞利用 URL,成功触发了alert()
。
接着,将X-Forwarded-Host
标头的值修改为恶意 URL,然后发送请求,尝试毒害缓存。
没有发生跳转,X-Forwarded-Host
貌似不能带有协议https://
。
将协议去掉,只保留域名和路径,再次发送请求,尝试毒害缓存。
响应标头Location
将客户端重定向到了我们的恶意域。响应标头Age
从0
开始,说明生成了新的缓存响应。(图片里的Age
已经到了8
,说明距离失效还剩22
秒)
此时如果你访问实验室主页,则会被重定向至恶意域,并执行alert()
。
以下是一个动图,演示了受害者访问主页时的视角:
我查看了访问记录,受害者明明被重定向了,也访问了恶意路径。
可实验室依然没有得到解决,难道我遗漏了什么?
# 利用资源导入(毒害js文件)
一番寻找,发现网站主页会导入一个 js 文件。
请求该 js 文件,发现也存在 “有毒的重定向” 问题。
好吧,访问漏洞利用服务器,将路径修改为/resources/js/tracking.js
。
- 由于该路径将被作为 js 资源提供,所以将
Content-Type
标头的text/html
重新改为text/javascript
- 为正文中的
alert()
去掉script
标签,保留纯 js 代码
记得点击 “Store” 保存。
此次的X-Forwarded-Host
标头只需要提供恶意域,不需要提供路径,因为跳转时会自动加上 js 文件的路径。
毒害 js 文件,确保Location
跳转到了我们的恶意域,根据Age
判断是否生成了新缓存。
此时,如果你访问网站主页,则会命中有毒的缓存响应,导入恶意 js 资源并执行其中的alert
。
来分析下请求。
第一个请求,受害者访问网站主页,主页会加载所需的 js 文件。
第二个请求,主页请求并加载所需的 js 文件。但这个 js 文件已经被我们提前毒害,所以请求会命中有毒的缓存响应,被重定向至恶意域。
第三个请求,主页的资源加载请求 被 重定向至恶意域,然后加载了恶意域上的 js 文件资源,并在主页上执行了恶意 js 代码alert()
。
实验完成。