【技術分享】梨子帶你刷burpsuite靶場系列之客戶端漏洞篇 – 基于DOM的漏洞
本系列介紹
PortSwigger是信息安全從業者必備工具burpsuite的發行商,作為網絡空間安全的領導者,他們為信息安全初學者提供了一個在線的網絡安全學院(也稱練兵場),在講解相關漏洞的同時還配套了相關的在線靶場供初學者練習,本系列旨在以梨子這個初學者視角出發對學習該學院內容及靶場練習進行全程記錄并為其他初學者提供學習參考,希望能對初學者們有所幫助。
什么是DOM?
DOM,全稱document object model,譯為文檔對象模型。是瀏覽器對頁面元素的分層表示。網站可以使用JS操作DOM的節點和對象以及它們的屬性。在DOM的概念中有兩個專有名詞source和sink,目前梨子還找不到合適的中文翻譯。我們暫且理解為DOM操作的入口點和出口點。如果當不安全的payload從入口點傳遞給出口點則可能存在基于DOM的漏洞。
source
source是一個JS屬性,可以接收用戶輸入。比如location.search,它可以從查詢字符串中獲取數據,這也是攻擊者比較容易利用的點。還有其他的也是容易被攻擊者控制的source,例如document.referrer、document.cookie還有Web消息等。
sink
既然source是接收用戶輸入,那么sink就是使用危險的方式處理source的函數或DOM對象。比如eval()就是一種sink,可以處理JS傳遞給它的參數值。還有一種sink是document.body.innerHTML,攻擊者可以向其注入惡意的HTML和JS腳本并執行。
什么是污點流(Taint-flow)?
當網站將數據從source傳遞給sink,然后sink以不安全的方式處理該數據,則可能出現基于DOM的漏洞。危險的數據由source流向sink,所以叫做污點流(Taint-flow)。最常見的source就是URL,通常使用location對象訪問。攻擊者可以構造一個鏈接,然后讓受害者跳轉到指定的頁面。例如
goto = location.hash.slice(1)if (goto.startsWith('https:')) { location = goto;}
上面這段代碼會檢查URL,如果包含以https開頭的哈希片段則提取location.hash屬性的值并將其設置為window對象的location屬性。所以攻擊者可以構造這樣的URL來利用這個基于DOM的開放重定向漏洞。
https://www.innocent-website.com/example#https://www.evil-user.net
經過上面那段代碼處理以后,會將https://www.evil-user.net 設置為location屬性的值,這會自動將受害者重定向到該站點。一般可以用于釣魚攻擊。
常見的source
下面列出一些常見的可能觸發污點流(Taint-flow)漏洞的source
- document.URL
- document.documentURI
- document.URLUnencoded
- document.baseURI
- location
- document.cookie
- document.referrer
- window.name
- history.pushState
- history.replaceState
- localStorage
- sessionStorage
- IndexedDB (mozIndexedDB, webkitIndexedDB, msIndexedDB)
- Database
下面幾種數據也是可能觸發污點流(Taint-flow)漏洞的source
- 反射型數據(已在XSS專題中講解)
- 存儲型數據(已在XSS專題中講解)
- Web消息
以Web消息為source的基于DOM的漏洞
如果網站以不安全的方式傳遞Web消息,例如,未在事件偵聽器中正確驗證傳入的Web消息的源,則事件偵聽器調用的屬性和函數可能會成為sink。攻擊者可以托管惡意iframe并使用postMessage()方法將Web消息數據傳遞給事件監聽器,然后將payload發送到父頁面上的sink。這就以為著攻擊者可以以Web消息為source將惡意數據傳遞到這些所有的sink。
如何以Web消息為source構造攻擊?
首先我們考慮這樣的代碼
<script>window.addEventListener('message', function(e) { eval(e.data);});script>
這段代碼添加了一個事件監聽器,在接收到消息時執行里面的data部分。這里我們通過iframe注入這個消息