优秀的编程知识分享平台

网站首页 > 技术文章 正文

一个关于postMessage跨域漏洞经典案例

nanyue 2024-07-23 13:34:54 技术文章 8 ℃

背景

价值: $3000

漏洞原因:postMessage跨域漏洞导致,利用websocket接收用户认证token

原文地址:https://labs.detectify.com/2017/02/28/hacking-slack-using-postmessage-and-websocket-reconnect-to-steal-your-precious-token/

<!--more-->

基础知识

在了解这个漏洞的时候我们需要了解以下基础的知识:PostMessage

PostMessage

PostMessage API是一个很简单的实现跨域的方法,最基本的使用方法是:

B站的data数据,发送数据端

parent.postMessage('I am B data!!','*');

获取数据代码:

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

PostMessage产生的漏洞

伪造获取数据端

若是发送数据端的第二个参数使用的是"*" 那么表示的是这个数据可以被任何域获取到,这时候只要构造window.addEventListener来接受数据就可以了

伪造发送数据端

来看一段代码:

window.addEventListener("message", function(message){
if(/^http://www.examplesender.com$/.test(message.origin)){
console.log(message.data);
}
});

可以看到对接收的message.origin进行了判断,但是使用的正则并不标准

直接利用“wwwaexamplesender.com“, “wwwbexamplesender.com” etc.进行绕过,用postMessage发送数据给他接收

使用的poc可以参考:

<iframe id="frame" src="https://targetpage/using_addthis"></iframe>

<script>

document.getElementById("frame").contentWindow.postMessage('hello', '*');
</script>

测试代码:window.postMessage("hello", "*")

利用xss进行攻击

先看代码:

//Listener on http://www.examplereceiver.com/
window.addEventListener("message", function(message){
if(/^http://www\.examplesender\.com$/.test(message.origin)){
document.getElementById("message").innerHTML = message.data;
}
});

这个对来源进行了严格的限制,可以通过查找http://www.examplesender.com/上面的xss进行攻击

查看是否使用PostMessage

这个可以使用chrome下的开发者工具,在source ——> Global Listeners 下面可以看到

案例

上面slack的漏洞是一个案例,总体的思路就是站点监听着一个message,并且没有判断message的来源,导致可以给他发message,message中有websocket的url的话,站点会和发送message的站点建立websocket链接,兵器会把认证后的token传递给发送者站点

该作者还有个PostMessage的漏洞,会影响到百万网站,是AddThis这个插件导致的,不难理解

参考连接:
http://www.cnblogs.com/dolphinX/p/3464056.html
https://labs.detectify.com/2016/12/15/postmessage-xss-on-a-million-sites/

Tags:

最近发表
标签列表