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