从业者-客户端原型链污染-浏览器APIs
# 实验室:通过浏览器APIs实现客户端原型链污染
# 题目
此实验室容易受到客户端原型链污染以及 DOM型XSS (opens new window) 的影响。该网站的开发人员已经注意到了一个潜在的小工具,并试图修补它。然而,你可以绕过他们采取的措施。
若要解决实验室问题,请:
- 找到一个可以向全局
Object.prototype
添加任意属性的源。 - 确定一个允许你执行任意 JavaScript 的小工具属性。
- 将它们组合起来以调用
alert()
。
你可以在浏览器中手动解决此实验,或使用 DOM Invader (opens new window) 来帮助你。
该实验室基于 PortSwigger Research 发现的真实漏洞。有关更多详细信息,请查看由 Gareth Heyes (opens new window) 所著《广泛存在的原型污染小工具》 (opens new window)。
- name: 实验室-从业者
desc: 通过浏览器APIs实现客户端原型链污染 >>
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/prototype-pollution/client-side/browser-apis/lab-prototype-pollution-client-side-prototype-pollution-via-browser-apis
bgColor: '#001350'
textColor: '#4cc1ff'
1
2
3
4
5
6
2
3
4
5
6
# 实操
(目前只有图,文字后面有时间补)
点击 “ACCESS THE LAB” 进入实验室。
/?__proto__[恶意属性]=值
1
/resources/js/searchLoggerConfigurable.js
async function logQuery(url, params) {
try {
await fetch(url, {method: "post", keepalive: true, body: JSON.stringify(params)});
} catch(e) {
console.error("Failed storing query");
}
}
async function searchLogger() {
let config = {params: deparam(new URL(location).searchParams.toString()), transport_url: false};
Object.defineProperty(config, 'transport_url', {configurable: false, writable: false});
if(config.transport_url) {
let script = document.createElement('script');
script.src = config.transport_url;
document.body.appendChild(script);
}
if(config.params && config.params.search) {
await logQuery('/logger', config.params);
}
}
window.addEventListener("load", searchLogger);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Object.defineProperty() 参考链接 (opens new window)
函数Object.defineProperty()
接受以下 options 对象:
value
:实际的属性值configurable
该属性是否可配置writable
该属性是否可写enumerable
该属性是否可枚举(遍历)
{
value: "我是属性值",
configurable: false
writable: false,
enumerable: false,
}
1
2
3
4
5
6
2
3
4
5
6
由于上面的函数Object.defineProperty()
没有设置实际的value
值,所以我们可以污染全局value
值,从而形成:
Object.defineProperty(config, 'transport_url', {
configurable: false,
writable: false,
value: "恶意值"
});
1
2
3
4
5
2
3
4
5
恶意的value
会被赋值给transport_url
变量。
/?__proto__[value]=恶意值
1
/?__proto__[value]=data:,alert(1)
1
编辑 (opens new window)