postMessage隐患

Posted rainsw0rd

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了postMessage隐患相关的知识,希望对你有一定的参考价值。

postMessage漏洞

函数

postMessage是一个多窗口间的跨域传输方法。

发送
otherWindow.postMessage(data,origin)

otherWindow其他窗口的一个引用,data传递数据,origin指定哪些窗口能接收到消息事件。

一般接收及处理
window.addEventListener("message", receiveMessage, false);

function receiveMessage(event)
{
  // For Chrome, the origin property is in the event.originalEvent
  // object. 
  // 这里不准确,chrome没有这个属性
  // var origin = event.origin || event.originalEvent.origin; 
  var origin = event.origin
  if (origin !== "http://example.org:8080")
    return;

  // ...
}

message 的属性有:

  • data

    从其他 window 中传递过来的对象。

  • origin

    调用 postMessage 时消息发送方窗口的 origin . 这个字符串由 协议、“??/“、域名、“ : 端口号”拼接而成。例如 “https://example.org (隐含端口 443)”、“http://example.net (隐含端口 80)”、“http://example.com:8080”。请注意,这个origin不能保证是该窗口的当前或未来origin,因为postMessage被调用后可能被导航到不同的位置。

  • source

    对发送消息的窗口对象的引用; 您可以使用此来在具有不同origin的两个窗口之间建立双向通信。

漏洞

一般会出现两种情况:

接收端:

如果向如window.opener或者其他可以伪造的到的otherWindow发送敏感消息,且origin可绕过或者*的时候。

直接

window.addEventListener("message",function(e){
alert(e.data);
})

(这种情况一般很少..感觉没什么用)

发送端:

目标对message的origin没限制,且接收信息在网站中输出的时候可能造成xss。这个时候直接iframe包含这个页面,或者弹出窗口与他通信,然后发payload给他。

iframe

<script>   
   var opener = window.open("https://www.example.com","opener", "scrollbars=no,resizable=no,status=no,location=no,toolbar=no,menubar=no,width=500,height=1");

   setTimeout(function(){
        var message = //payload;
        opener.postMessage(message, ‘*‘);
    },‘4000‘);
</script>

弹窗

<script>
function qwqLoaded() {
  var qwq = document.getElementById(‘qwq‘);
  var message = //payload;
  qwq.contentWindow.postMessage(message, ‘*‘);
};
</script>
<iframe id="qwq" src="https://www.example.com" onload="qwqLoaded(this)"></iframe>

参考链接:
https://xz.aliyun.com/t/7783 "facebook洞"
https://www.freebuf.com/news/123284.html "addthis插件洞"
https://www.secpulse.com/archives/56637.html "大佬分析"




以上是关于postMessage隐患的主要内容,如果未能解决你的问题,请参考以下文章

dephi线程中postmessage报错

无法使用 Google 代码在“DOMWindow”上执行“postMessage”

C# PostMessage 到 Spotify

PostMessage 的字节数组封送处理

postMessage和onmessage的使用

delphi 中 postmessage 和sendmessage用法