Web 攻擊之 XSS 攻擊及防禦策略
XSS 攻擊
介紹
- XSS 攻擊,從最初 netscap 推出 javascript 時,就已經察覺到了危險。 我們常常需要面臨跨域的解決方案,其實同源策略是保護我們的網站。糟糕的跨域會帶來危險,雖然我們做了訪問控制,但是網站仍然面臨著嚴峻的 XSS 攻擊考驗。
- 攻擊定義: Cross-Site Scripting(跨站指令碼攻擊)簡稱 XSS,是一種程式碼注入攻擊。攻擊者通過在目標網站上注入惡意指令碼,利用信任執行程式碼。利用這些惡意指令碼,攻擊者可獲取使用者的敏感資訊,危害網站。
- 在部分情況下,由於輸入的限制,注入的惡意指令碼比較短。但可以通過引入外部的指令碼,並由瀏覽器執行,來完成比較複雜的攻擊策略。
- 這些惡意網頁程式通常是JavaScript,但實際上也可以包括Java,VBScript,ActiveX,Flash或者甚至是普通的HTML。
攻擊來源
- 使用者的 UGC 資訊
- 來自第三方的連結
- URL引數
- POST引數
- Referer(可能來自不可信的來源)
- Cookie(可能來自其他子域注入)
攻擊結果
- 盜用cookie,獲取敏感資訊。
- 利用植入Flash,通過crossdomain許可權設定進一步獲取更高許可權;或者利用Java等得到類似的操作。
- 利用iframe、frame、XMLHttpRequest或上述Flash等方式,以(被攻擊)使用者的身份執行一些管理動作,或執行一些一般的如發微博、加好友、發私信等操作。
- 利用可被攻擊的域受到其他域信任的特點,以受信任來源的身份請求一些平時不允許的操作,如進行不當的投票活動。
- 在訪問量極大的一些頁面上的XSS可以攻擊一些小型網站,實現DDoS攻擊的效果。
攻擊分類
- 儲存型 XSS:
-
反射型 XSS:
- 你的應用中包含未驗證的或未編碼的使用者輸入,並作為HTML或者其他未啟用CSP頭的一部分輸出。成功的攻擊將在受害者的瀏覽器上執行任意HTML或JS程式碼。 一般而言,使用者需要點選連結或與其他攻擊者控制頁面做互動,例如:水坑攻擊、惡意行為或其它。
-
攻擊過程:
- Alice經常瀏覽某個網站,此網站為Bob所擁有。Bob的站點執行Alice使用使用者名稱/密碼進行登入,並存儲敏感資訊(比如銀行帳戶資訊)。
- Charly發現Bob的站點包含反射性的XSS漏洞。
- Charly編寫一個利用漏洞的URL,並將其冒充為來自Bob的郵件傳送給Alice。
- Alice在登入到Bob的站點後,瀏覽Charly提供的URL。
- 嵌入到URL中的惡意指令碼在Alice的瀏覽器中執行,就像它直接來自Bob的伺服器一樣。此指令碼盜竊敏感資訊(授權、信用卡、帳號資訊等然後在Alice完全不知情的情況下將這些資訊傳送到Charly的Web站點。
-
DOM 型 XSS
- 會動態的將攻擊者可控的內容加入頁面的JavaScript框架、單頁面程式或API存在這種型別的漏洞。理想的來說,你應該避免將攻擊者可控的資料傳送給不安全的JavaScriptAPI。
-
攻擊過程:
- 攻擊者構造出特殊的 URL,其中包含惡意程式碼。
- 使用者開啟帶有惡意程式碼的 URL。
- 使用者瀏覽器接收到響應後解析執行,前端 JavaScript 取出 URL 中的惡意程式碼並執行。
- 惡意程式碼竊取使用者資料併發送到攻擊者的網站,或者冒充使用者的行為,呼叫目標網站介面執行攻擊者指定的操作。
攻擊預防
- 渲染前處理: 在渲染前對服務端返回的資料,進行明確的資料型別處理。像文字(.innerText),還是屬性(.setAttribute),還是樣式(.style)等等
- 對 HTML 各個內容做相應的語義轉換規則。詳情可以檢視ofollow,noindex" target="_blank">XSS (Cross Site Scripting) Prevention Cheat Sheet 。
- 為了避免客戶端XSS,最好的選擇是避免傳遞不受信任的資料到JavaScript和可以生成活動內容的其他瀏覽器A PI。如 location、onclick、onerror、onload、onmouseover 等,a 標籤的 href 屬性,JavaScript 的 eval()、setTimeout()、setInterval() 等,都能把字串作為程式碼執行。如果不可信的資料拼接到字串中傳遞給這些 API,很容易產生安全隱患,請務必避免。
- HTTP-only Cookie: 禁止 JavaScript 讀取某些敏感 Cookie,攻擊者完成 XSS 注入後也無法竊取此 Cookie。
- 使用CSP是對抗XSS的深度防禦策略。具體可檢視內容安全策略
防禦檢測
-
使用通用 XSS 攻擊字串手動檢測 XSS 漏洞。
/*\
/ '/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0d%0a//\x3csVg/ -
使用掃描工具自動檢測 XSS 漏洞。
- Arachni、Mozilla HTTP Observatory、w3af