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隐患的主要内容,如果未能解决你的问题,请参考以下文章