在前面我們陸續學習了Reflected與Stored XSS。今天我們補齊 XSS 的最後一種經典型態:DOM-based XSS(DOM 型跨站腳本攻擊)。
DOM(Document Object Model,文件物件模型) 是瀏覽器用來解析與操作網頁結構的介面。
傳統的XSS攻擊通常需要後端伺服器將使用者輸入拼接到HTML頁面中傳回瀏覽器;但DOM-based XSS則完全發生在前端:
1.JavaScript從資料源(Source)讀取使用者可控的輸入(如 window.location.href、URLSearchParams)。
2.JavaScript未經適當過濾或轉義,將資料傳遞給危險執行點(Sink)(如 innerHTML、document.write()、element.outerHTML)。
3.瀏覽器直接將該字串當成 HTML/JavaScript 執行,觸發攻擊。
選擇語言並送出後,檢視網頁HTML原始碼,會看到前端有一段JavaScript程式碼:
if (document.location.href.indexOf("default=") >= 0) {
var lang = document.location.href.substring(document.location.href.indexOf("default=")+8);
document.write("" + decodeURIComponent(lang) + "");
}
直接將URL中的default參數替換為 JavaScript 惡意腳本:
http://localhost:8080/vulnerabilities/xss_d/?default=alert(document.cookie)
結果:瀏覽器解析URL後,document.write() 直接把 alert(document.cookie) 插入到 標籤內並執行,成功跳出 Cookie 彈窗!
1.避免使用危險的DOM Sink函式:盡量不要使用document.write()、innerHTML 或 eval()。
2.使用前端防護庫進行Sanitization:
若必須渲染HTML字串,應先經過成熟的前端安全清理庫(如 DOMPurify)進行轉義與淨化
佈署內容安全策略(CSP):
透過HTTP Header設定Content-Security-Policy,封鎖未授權的內聯腳本(Inline Script)執行。