从业者-缓存实现缺陷-参数伪装
# 实验室:参数伪装
# 题目
此实验室容易受到 Web 缓存投毒的攻击,因为它从缓存键中排除了某个参数。缓存和后端之间的参数解析也不一致。用户定期使用 Chrome 访问该网站的主页。
若要解决实验室问题,请利用 参数伪装技术 来毒害缓存响应,并在受害者的浏览器中执行alert(1)
。
提示
网站通常会从缓存键中排除某些 UTM 分析参数。
- 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-param-cloaking
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
# 实操
点击 “ACCESS THE LAB” 进入实验室。
一个博客站点。
# 请求分析
访问网站主页,看看产生了哪些请求。
第一个请求,用户访问网站主页。
第二个请求,主页加载 js 文件/js/geolocate.js
并传递了一个参数callback
,参数值为setCountryCookie
。
能否往callback
参数注入 XSS 载荷?
失败,特殊符号都被过滤了。无法构造直接的反射型 XSS。
# 利用资源导入
虽然无法直接在/js/geolocate.js
网页上构造反射型 XSS,但它是 js 资源文件啊!会被主页导入并自动执行!
最重要的是,这个 js 资源文件具有缓存特性,有被投毒的风险。
添加一个查询参数id
,发送请求。
没有命中缓存,而是生成了一个独立的新缓存。说明查询参数id
是一个缓存键(有键)。
将参数id
修改为utm_content
,发送请求。
这次没有产生独立的新缓存,而是命中了原有的缓存响应。说明查询参数utm_content
不是缓存键(无键)。
根据所学,利用缓存系统 和 后端系统之间的解析差异,在utm_content
参数中隐藏另一个callback
参数:
utm_content=1;callback=alert(1)//
/js/geolocate.js?callback=setCountryCookie&utm_content=1;callback=alert(1)//
2
3
对于缓存系统,它只认参数分隔符&
,所以它会识别到两个参数:
callback=setCountryCookie
utm_content=1;callback=alert(1)//
对于后端系统,它认得参数分隔符&
和;
,所以它会识别到三个参数:
callback=setCountryCookie
utm_content=1
callback=alert(1)//
- 同时,后端系统会优先考虑最后一个同名参数,所以前一个
callback
会被覆盖为alert(1)//
缓存系统 和 后端系统都认得callback=setCountryCookie
参数,而缓存系统又会排除utm_content
参数。所以:
以下两个请求会命中同一个缓存响应,因为它们具有相同的缓存键 callback=setCountryCookie
/js/geolocate.js?callback=setCountryCookie
/js/geolocate.js?callback=setCountryCookie&utm_content=1;callback=alert(1)//
2
3
4
先请求/js/geolocate.js?callback=setCountryCookie&utm_content=1;callback=alert(1)//
,对 js 文件投毒。
然后再请求/js/geolocate.js?callback=setCountryCookie
,看看能否获取到有毒的响应。
在投毒之后,如果访问网站主页,则会加载有毒的 js 资源文件,并执行其中的alert()
。
实验完成。