技術討論 | 如何利用Microsoft Edge漏洞獲取本地檔案?

Editor發表於2018-09-07

在2015年,微軟釋出了Edge瀏覽器。當它最初被開發時,它被命名為Project Spartan。 


與Internet Explorer不同,Edge支援更為廣泛的現代安全措施,如內容安全策略(CSP),以及現代JavaScript和CSS特性。放棄InternetExplorer,轉而開發諸如Edge之類的現代瀏覽器,這帶來了瀏覽器安全性的增強,但也帶來了一些潛在的問題。


在類似的新專案開發中,有一件事經常被忽視,那就是從多年來對原有產品的安全修復中吸取經驗。有相關工作經驗的人應該都會知道,在開發新瀏覽器的過程中,你的團隊最初可能會經歷更多的錯誤。


原因在於,隨著新型攻擊技術的出現,瀏覽器的安全性也是一個需要被不斷重新開發的過程,因為瀏覽器被黑客和安全專業人士視為潛在攻擊面最為豐富的來源之一。在過去的幾年裡,一些能夠導致瀏覽器中使用者資料遭洩露的安全漏洞已經被修復,開發人員完全可以從中吸取經驗,但事實證明,這些經驗並沒有在新瀏覽器的開發過程中被運用。


這或許正好可以解釋為什麼Microsoft Edge是我發現的唯一一個易受此漏洞影響的瀏覽器。


技術討論 | 如何利用Microsoft Edge漏洞獲取本地檔案?


當然,這裡需要提一下,此漏洞目前已經被微軟修復。


哪些版本受漏洞影響?


我已經在Microsoft Edge 40.15063.0.0上測試了這個漏洞,並取得了成功。


如何竊取本地檔案?


首先,我們需要了解,是什麼導致我無法竊取到你的本地檔案?


我很肯定的告訴你,這是由於瀏覽器採用了同源策略(SOP)。舉個例子來說明一下,同源策略(SOP)會阻止https://attacker.com讀取file://C:/your/stuff.txt中的內容,這是因為它們不同源。如果要使用javascript請求讀取資料,那麼對應的協議、主機名(hostname)和埠都需要匹配。但檔案URL有點特殊,file:// protocol和https:// protocol是明顯不同的,這也就是為什麼攻擊者的域名不能讀取你的本地檔案的原因。


那麼,如果我們處理的兩個file URL既沒有主機名也沒有埠(即只有檔案協議和路徑),結果會是怎樣的呢?答案很肯定,兩個file URL將被預設來自相同源,因為:


1)埠匹配:因為沒有埠;

2)主機名匹配:因為沒有主機名;

3)協議匹配:都是file://;


換句話來說,如果瀏覽器開發人員沒有考慮到file://url這種特殊格式,那麼在瀏覽器中開啟儲存在你的計算機上的惡意HTML檔案,我就可以讀取任意本地檔案中的內容。


當然,你可能會產生質疑:這並不是一個令人信服的攻擊向量。因為如果從未下載過任何HTML檔案,這種攻擊就不會成立。此外,Windows也會阻止此類檔案,因為它來自另一臺計算機。的確如此,在我測試攻擊時就發生過這樣的情況。彆著急,我們接著往下看。


這是一個真實的威脅嗎?還是僅存在於理論上?


你不可否認,攻擊者能夠以各種方式說服潛在的受害者下載HTML檔案並執行它?


由於這些攻擊向量的存在,因此這絕不會僅是一個理論上的威脅。如果你不能通過瀏覽器傳播惡意HTML檔案,那麼為什麼不直接通過電子郵件傳送給受害者呢?在過去的幾年裡,我們就已經開始認識到,開啟諸如.exe檔案、.js檔案,甚至是Word文件之類的未知附件都可能使自己置於危險之中,而HTML檔案同樣也不例外。


我在另一臺計算機上偽造了一封電子郵件,將HTML檔案新增為附件,然後在“Mail and Calendar”應用中開啟附件。我原以為這款應用會像Edge瀏覽器一樣遮蔽附件,但事實並非如此。我將包含惡意附件的電子郵件傳送給了測試使用者,當該使用者開啟附件後,許多本地檔案被髮送到了我的伺服器上,而我完全可以在我的伺服器上對這些檔案進行轉儲和讀取。可能是由於沒有防毒軟體將該附件識別為惡意檔案,因此我還可以通過HTTPS連線來提取檔案,在這種情況下實施的攻擊絕對是足夠隱祕的。這裡順帶提一下,我所使用的“Mail and Calendar”版本為17.8600.40445.0。


需要注意的是,還有很多方式可以用來傳播惡意檔案,具體取決於目標計算機已安裝的應用。


技術討論 | 如何利用Microsoft Edge漏洞獲取本地檔案?


如何保護自己的檔案?


保護自己的唯一方法是將Edge瀏覽器和“Mail and Calendar”應用更新至最新版本。另外,最好永遠不要開啟任何來自未知發件人的附件,即使副檔名看起來並非惡意的。


PoC程式碼

<html> 

<head> 

<script> 

let resultDiv = document.getElementById("result"); 

let xhr= newXMLHttpRequest(); 

let user =document.location.href.match(/file:\/\/\/C:\/Users\/([a-z0-9\-]*)\//i)[1]; 

xhr.open("GET",'file://C:/Users/${user}/Desktop/secret.txt"); 

xhr.onreadystatechange= ()=> { 

if(xhr.readyState==4) { 

resultDiv.innerText = xhr.responseText; 

} 

} 

xhr.send(); 

</script> 

</head> 

<body> 

</body> 

<div id="result"></div> 

</html>

*本文作者:Hydralab,轉載請註明來自FreeBuf.COM




相關文章