至今仍是威脅網頁應用程式的常見漏洞之一。攻擊主要依靠將惡意腳本注入到看似無害的網站上,讓該腳本在使用者的瀏覽器中執行,利用的是使用者對容易受攻擊之網站的信任。
造成的原因
攻擊可能包括以下部分原因
- 輸入驗證與清理不足
- 有些應用程式會接受使用者資料(如表單輸入),並將這些資料用於動態產生 HTML 頁面。若未適當清理輸入內容,惡意腳本可能被當作合法資料嵌入其中,最終由瀏覽器執行。
- 缺乏輸出編碼
- 可以透過某些特殊字元影響解析與顯示網頁內容。
- HTML 關鍵字元如
<
、>
、"
、'
和 &
必須轉換為對應的 HTML 實體編碼。
- JavaScript 需特別處理
'
、"
及 \
等字元。
- 未正確編碼使用者輸入是導致 XSS 漏洞的主要原因之一。
- 錯誤使用安全標頭
- 多種安全標頭可協助緩解 XSS 漏洞。
- 如 Content Security Policy(CSP)可透過限制可執行腳本的來源來減少 XSS 風險。
- 然而若 CSP 設定錯誤(如錯用
unsafe-inline
或 unsafe-eval
),反而會讓攻擊者更容易執行其惡意腳本。
- 框架或程式語言的漏洞
- 舊版框架未提供防範 XSS 的機制,或者存在未修補的漏洞。
- 現代框架大多內建自動輸出跳脫功能,並會快速修補新發現的漏洞。
- 第三方函式庫
- 在WEB應用中整合第三方函式庫可能引入 XSS 漏洞,即使核心程式碼本身沒有安全問題。
類型
主要分為三種:
-
Reflected XSS:攻擊依賴使用者可控的輸入被即時反映回頁面。如搜尋功能會在結果頁顯示你搜尋的字串(被反映),攻擊者會嘗試在搜尋字串中嵌入惡意腳本。
-
Stored XSS:攻擊依賴使用者輸入被儲存在網站的資料庫中。如使用者可以撰寫並儲存的商品評論會顯示給其他使用者,攻擊者會在評論中插入惡意腳本,使其在其他使用者的瀏覽器中執行。
-
DOM-based XSS:此攻擊利用文件物件模型(DOM)內的弱點,直接操作現存的頁面元素而無需透過伺服器反映或存儲。DOM‑based XSS 是最少見的一種。
可能的影響
- Session Hijacking
- XSS 可用來竊取使用者的 Session Cookie,攻擊者可藉此接管使用者會話,冒充其身份執行操作。
- 網路釣魚或憑證竊取
- 攻擊者可以利用 XSS 顯示偽造的登入介面,引誘使用者輸入帳號密碼。例如曾有案例中,頁面被彈出視窗部分遮蔽,誘導使用者連接其加密貨幣錢包。
- 社交工程
- 攻擊者可在可信網站內製作看似合法的彈窗或提示,誘使用戶點擊惡意連結或造訪釣魚網站。
- 網站內容竄改
- 除了誘騙之外,攻擊者也可能使用 XSS 改變網站內容,例如張貼具毀損品牌形象的訊息,造成企業聲譽損害。
- 資料外洩
- XSS 可存取並竊取顯示在使用者瀏覽器中的資訊,包括個人資料、帳戶資訊甚至金融資料。
- 惡意軟體安裝
- 攻擊者可以利用 XSS 傳播惡意程式碼,特別是由 Drive-by Download(無需使用者點擊即可觸發下載)手法,對瀏覽網站的使用者散佈惡意軟體。