专家-缓存实现缺陷-内部缓存投毒
# 实验室:
# 题目
此实验室容易受到 Web 缓存投毒的攻击,它使用了多层缓存。用户定期使用 Chrome 访问该网站的主页。
若要解决实验室问题,请毒害内部缓存,当受害者访问主页时,在其浏览器中执行alert(document.cookie)
。
- name: 实验室-专家
desc: 内部缓存投毒 >>
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-implementation-flaws/lab-web-cache-poisoning-internal
bgColor: '#001350'
textColor: '#d112fe'
2
3
4
5
6
# 实操
点击 “ACCESS THE LAB” 进入实验室。

一个博客站点。

# 文件geolocate.js
和之前的实验室类似,网站主页引入了一个 js 文件geolocate.js
并传递了参数callback=loadCountry
。

查看geolocate.js
文件,一个用于设置 Cookie 的简单功能。

# 文件analytics.js
发现无键标头X-Forwarded-Host
,该标头的值会反馈在响应中的两个地方。其中一个地方是引入analytics.js
文件的域。
但此时,我所注入的域xxx.oastify.com
并没有收到来自受害域的带外请求。

查看analytics.js
文件,一个统计功能:
function randomString(length, chars) {
var result = '';
for (var i = length; i > 0; --i) result += chars[Math.floor(Math.random() * chars.length)];
return result;
}
var id = randomString(16, '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ');
fetch('/analytics?id=' + id)
2
3
4
5
6
7

该功能会在用户访问时,在页面上生成一个访问 id,然后请求/analytics?id=...
以进行统计。

# 内部缓存投毒
通过X-Forwarded-Host
标头,连续注入相同的值两次,就会在响应中发现第三个反馈点。
第三个反馈点位于引入geolocate.js
文件资源的域。

此时,我所注入的域xxx.oastify.com
收到了来自受害域的带外请求。
这是内部缓存投毒成功的一个迹象。

继续测试,连续注入相同的域两次(两次请求),引出具有三个反馈点的响应。

然后删除X-Forwarded-Host
标头,再次发送请求。
成功命中内部缓存,前两个反馈点已经消失,但是第三个反馈点依然存在,我所注入的域xxx.oastify.com
反馈在了文件geolocate.js
的资源引入 URL 中。
这和理论知识中所说的一样:
- 内部缓存没有 “缓存键” 的概念
- 内部缓存通常不会缓存整个响应,而是缓存响应中的某个部分

通过浏览器访问网站主页,也成功命中了内部缓存,获得了带有恶意域的有害响应。

# 利用
访问漏洞利用服务器,将文件路径修改为geolocate.js
的资源引入路径。
添加所需的响应标头 以及 响应主体。

添加X-Forwarded-Host
标头,标头的值为漏洞利用服务器的域,然后连续发送两次请求,通过两次注入来毒害内部缓存。

删除X-Forwarded-Host
标头,再次发送请求。
如果出现了第三个反馈点,则说明成功毒害了内部缓存,并命中了有害的响应。

此时,如果你通过浏览器访问网站主页,则会弹出一个警告窗口。

看看产生了哪些请求。
第一个请求,由于内部缓存已经被我们毒害,所以当受害者访问网站主页时,会获得有害的响应。资源引入 URL 的域名已经被污染。
第二个请求,主页从攻击者的域加载恶意 js 文件,并执行alert()
。

实验完成。
