1. 程式人生 > >Web 攻擊之 XSS 攻擊及防禦策略

Web 攻擊之 XSS 攻擊及防禦策略

XSS 攻擊

介紹

  1. XSS 攻擊,從最初 netscap 推出 javascript 時,就已經察覺到了危險。 我們常常需要面臨跨域的解決方案,其實同源策略是保護我們的網站。糟糕的跨域會帶來危險,雖然我們做了訪問控制,但是網站仍然面臨著嚴峻的 XSS 攻擊考驗。
  2. 攻擊定義: Cross-Site Scripting(跨站指令碼攻擊)簡稱 XSS,是一種程式碼注入攻擊。攻擊者通過在目標網站上注入惡意指令碼,利用信任執行程式碼。利用這些惡意指令碼,攻擊者可獲取使用者的敏感資訊,危害網站。
  3. 在部分情況下,由於輸入的限制,注入的惡意指令碼比較短。但可以通過引入外部的指令碼,並由瀏覽器執行,來完成比較複雜的攻擊策略。
  4. 這些惡意網頁程式通常是JavaScript,但實際上也可以包括Java,VBScript,ActiveX,Flash或者甚至是普通的HTML。

攻擊來源

  1. 使用者的 UGC 資訊
  2. 來自第三方的連結
  3. URL引數
  4. POST引數
  5. Referer(可能來自不可信的來源)
  6. Cookie(可能來自其他子域注入)

攻擊結果

  1. 盜用cookie,獲取敏感資訊。
  2. 利用植入Flash,通過crossdomain許可權設定進一步獲取更高許可權;或者利用Java等得到類似的操作。
  3. 利用iframe、frame、XMLHttpRequest或上述Flash等方式,以(被攻擊)使用者的身份執行一些管理動作,或執行一些一般的如發微博、加好友、發私信等操作。
  4. 利用可被攻擊的域受到其他域信任的特點,以受信任來源的身份請求一些平時不允許的操作,如進行不當的投票活動。
  5. 在訪問量極大的一些頁面上的XSS可以攻擊一些小型網站,實現DDoS攻擊的效果。

攻擊分類

  1. 儲存型 XSS:
    1. 你的應用或者API將未淨化的使用者輸入儲存下來了,並在後期在其他使用者或者管理員的頁面展示出來。 儲存型XSS一般被認為是高危或嚴重的風險。
    2. 攻擊過程:
      1. Bob擁有一個Web站點,該站點允許使用者釋出資訊/瀏覽已釋出的資訊。
      2. Charly注意到Bob的站點具有型別C的XSS漏洞。
      3. Charly釋出一個熱點資訊,吸引其它使用者紛紛閱讀。
      4. Bob或者是任何的其他人如Alice瀏覽該資訊,其會話cookies或者其它資訊將被Charly盜走。
  2. 反射型 XSS:
    1. 你的應用中包含未驗證的或未編碼的使用者輸入,並作為HTML或者其他未啟用CSP頭的一部分輸出。成功的攻擊將在受害者的瀏覽器上執行任意HTML或JS程式碼。 一般而言,使用者需要點選連結或與其他攻擊者控制頁面做互動,例如:水坑攻擊、惡意行為或其它。
    2. 攻擊過程:
      1. Alice經常瀏覽某個網站,此網站為Bob所擁有。Bob的站點執行Alice使用使用者名稱/密碼進行登入,並存儲敏感資訊(比如銀行帳戶資訊)。
      2. Charly發現Bob的站點包含反射性的XSS漏洞。
      3. Charly編寫一個利用漏洞的URL,並將其冒充為來自Bob的郵件傳送給Alice。
      4. Alice在登入到Bob的站點後,瀏覽Charly提供的URL。
      5. 嵌入到URL中的惡意指令碼在Alice的瀏覽器中執行,就像它直接來自Bob的伺服器一樣。此指令碼盜竊敏感資訊(授權、信用卡、帳號資訊等然後在Alice完全不知情的情況下將這些資訊傳送到Charly的Web站點。
  3. DOM 型 XSS
    1. 會動態的將攻擊者可控的內容加入頁面的JavaScript框架、單頁面程式或API存在這種型別的漏洞。理想的來說,你應該避免將攻擊者可控的資料傳送給不安全的JavaScriptAPI。
    2. 攻擊過程:
      1. 攻擊者構造出特殊的 URL,其中包含惡意程式碼。
      2. 使用者開啟帶有惡意程式碼的 URL。
      3. 使用者瀏覽器接收到響應後解析執行,前端 JavaScript 取出 URL 中的惡意程式碼並執行。
      4. 惡意程式碼竊取使用者資料併發送到攻擊者的網站,或者冒充使用者的行為,呼叫目標網站介面執行攻擊者指定的操作。

攻擊預防

  1. 渲染前處理: 在渲染前對服務端返回的資料,進行明確的資料型別處理。像文字(.innerText),還是屬性(.setAttribute),還是樣式(.style)等等
  2. 對 HTML 各個內容做相應的語義轉換規則。詳情可以檢視 XSS (Cross Site Scripting) Prevention Cheat Sheet
  3. 為了避免客戶端XSS,最好的選擇是避免傳遞不受信任的資料到JavaScript和可以生成活動內容的其他瀏覽器A PI。如 location、onclick、onerror、onload、onmouseover 等,a 標籤的 href 屬性,JavaScript 的 eval()、setTimeout()、setInterval() 等,都能把字串作為程式碼執行。如果不可信的資料拼接到字串中傳遞給這些 API,很容易產生安全隱患,請務必避免。
  4. HTTP-only Cookie: 禁止 JavaScript 讀取某些敏感 Cookie,攻擊者完成 XSS 注入後也無法竊取此 Cookie。
  5. 使用CSP是對抗XSS的深度防禦策略。具體可檢視內容安全策略

防禦檢測

  1. 使用通用 XSS 攻擊字串手動檢測 XSS 漏洞。jaVasCript:/*-//*\/'/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0d%0a//\x3csVg/

  2. 使用掃描工具自動檢測 XSS 漏洞。
    1. Arachni、Mozilla HTTP Observatory、w3af

攻擊案例總結

  1. 新浪微博
  2. 百度貼吧