信息來(lái)源:FreeBuf
最近來(lái)自芬蘭Klikki Oy的研究員Jouko Pynn?nen發(fā)表了一篇博客,其中演示了惡意攻擊者如何利用XSS漏洞攻下雅虎郵箱,將受害者收件箱中的郵件發(fā)到外部站點(diǎn);以及構(gòu)建病毒,這個(gè)病毒可以通過(guò)向郵件簽名中添加惡意腳本,附加在所有傳出的電子郵件中。
由于惡意代碼就位于郵件消息的正文中,代碼會(huì)在受害者打開(kāi)郵件時(shí)立即執(zhí)行,不需要其他交互過(guò)程。所有問(wèn)題的癥結(jié)實(shí)際上在于雅虎郵箱無(wú)法正確過(guò)濾HTML郵件中潛在的惡意代碼。
以下是對(duì)這名研究人員博客文章的內(nèi)容編譯:
發(fā)現(xiàn)歷程
離去年給雅虎挖洞也快一周年了,這個(gè)時(shí)間點(diǎn)我也打算再來(lái)一發(fā)。一開(kāi)始我覺(jué)得基本的HTML過(guò)濾應(yīng)該不會(huì)再有漏洞了,但在最近寫(xiě)郵件的時(shí)候,我發(fā)現(xiàn)了很多添加附件的選項(xiàng),這些選項(xiàng)我去年倒是沒(méi)有太注意。然后我寫(xiě)了一封郵件,里面包含各種附件,并發(fā)到某外部郵箱,這樣我就可以檢查郵件的HTML源碼了。
雅虎郵箱提供了一項(xiàng)功能,可以從云服務(wù)中分享文件。在郵件中進(jìn)行分享之后,文件不會(huì)附在郵件的附件中,而是會(huì)使用HTML代碼插入一個(gè)鏈接,比如Google文檔/Dropbox的鏈接。
在此,data-* HTML屬性吸引了我的注意。首先是因?yàn)槲胰ツ旮F舉了一些雅虎郵箱過(guò)濾所允許的HTML屬性,但是沒(méi)有能夠窮舉出全部屬性。第二,由于data-*屬性存儲(chǔ)的為Javascript所用的特定應(yīng)用數(shù)據(jù),所以這可能是個(gè)不錯(cuò)的攻擊切入點(diǎn)。也就是說(shuō),可以在郵件中嵌入一些HTML屬性繞過(guò)雅虎郵箱的過(guò)濾。
為了進(jìn)一步了解data-*屬性,我使用Chrome的開(kāi)發(fā)者工具進(jìn)入源碼標(biāo)簽,尋找JavaScript文件中引用的data-url屬性。我發(fā)現(xiàn)YouTube的鏈接也會(huì)被雅虎郵箱“優(yōu)化”,如果你在郵件中輸入Youtube的視頻鏈接,雅虎郵箱就會(huì)自動(dòng)幫你生成一個(gè)“鏈接加強(qiáng)卡片”,如下圖所示,卡片中會(huì)包含一些data-*屬性。
當(dāng)用戶(hù)打開(kāi)包含這類(lèi)“卡片”的郵件,雅虎就會(huì)通過(guò)<IFRAME>嵌入視頻,視頻旁邊還會(huì)有一個(gè)分享按鈕,這些功能就是通過(guò)雅虎郵箱JS代碼的data-*屬性實(shí)現(xiàn)的。
接下來(lái),我嘗試用data-*屬性構(gòu)造郵件,漏洞有了!如果我們?cè)赿ata-url這個(gè)值中插入引號(hào),就會(huì)導(dǎo)致分享按鈕的HTML無(wú)法正確解析。而只要URL指向的網(wǎng)站在雅虎的白名單中,比如指向Youtube,雅虎就不會(huì)再進(jìn)行檢查或者編碼。data-url的值會(huì)被用來(lái)設(shè)置innerHTML div創(chuàng)建按鈕:
我進(jìn)行的測(cè)試如下:
From: <attacker@attacker.com> Subject: hello To: victim@yahoo.com MIME-Version: 1.0 Content-type: text/html <div class="yahoo-link-enhancr-card" data-url="https://www.youtube.com/aaa"><img src=x onerror=alert(/xss/)><"> <div class="card-share-container"> <a class="enhancr-play-btn"></a> </div></div>
當(dāng)我從雅虎郵箱打開(kāi)郵件時(shí),那段針對(duì)鏈接進(jìn)行“優(yōu)化”的JavaScript代碼會(huì)使用data-url屬性來(lái)渲染按鈕。而隱藏在屬性中的HTML片段也會(huì)隨之加載,我所添加的HTML代碼是一個(gè)包含onerror屬性的<IMG>,攻擊者的惡意代碼也就得以執(zhí)行。
實(shí)際上,這個(gè)問(wèn)題的癥結(jié)可以追溯到雅虎郵箱的一個(gè)函數(shù):
function generateButton(e,t) { var n=this,r;
t.insert(['<button data-share-url="',e,'" class="',o,'"> \
<span class="icon icon-social"></span> \
</button>'].join(""));
r=t.one("."+o);
n._attachButtonListeners(r);
}
這個(gè)函數(shù)名稱(chēng)為t.shareMenu.generateButton(r.cardUrl,s),第一個(gè)參數(shù)就是郵件中嵌入的data-url屬性。
可以看到,底部HTML的部分就是直接把字符串拼接了起來(lái),沒(méi)有做任何修改。
影響
此次發(fā)現(xiàn)的這個(gè)漏洞的影響跟去年的XSS漏洞實(shí)際上是一樣的。
為了證明漏洞的存在性,我給雅虎安全部門(mén)發(fā)了一封郵件,郵件打開(kāi)時(shí),會(huì)使用AJAX讀取用戶(hù)收件箱中的郵件內(nèi)容,并把它發(fā)送到攻擊者的服務(wù)器。
作者已經(jīng)于11月12日通過(guò)HackerOne向雅虎安全提交了漏洞,11月29日雅虎提供了1萬(wàn)美元的賞金。