網頁安全與跨網站指令碼攻擊(XSS):從基礎到進階

網頁安全在當今的數位時代中,已經成為不可或缺的一環。隨著各種技術和網路的迅速發展,網站已經從簡單的資訊展示工具變成了進行商業、娛樂、學習和交流的重要平台。但同時,惡意攻擊者也在不斷地尋找各種漏洞,以企圖竊取敏感資料、進行網頁挾持或發布惡意軟體。因此,網頁安全不僅是網站擁有者的首要責任,更是確保網路環境健康、可靠的基石。只有當網站能夠提供安全的瀏覽環境時,用戶才能夠放心地使用,且企業和組織才能確保其品牌形象和資產不受損害。

本篇主要來介紹常見的XSS, 之前已經寫過很多篇類似的主題,下面是所有XSS相關連結

防範反射型XSS攻擊:保護您的網站免受跨站腳本漏洞影響的關鍵策略與技巧

Client DOM XSS:如何保護您的應用程式免受攻擊

網路攻擊面面觀:客戶端DOM Stored XSS與DOM Code Injection的區別及防範

網站安全必修課:如何預防跨站腳本攻擊(XSS)

這篇算是集大成吧,把所有XSS的攻擊都集合在一起,方便給大家有一個完整的了解,那麼首先就從XSS攻擊的定義開始吧!

  • XSS(跨站腳本攻擊,Cross-Site Scripting)是一種常見的網頁應用程式安全漏洞。它允許攻擊者在受害者的瀏覽器上執行未經授權的腳本,通常是JavaScript。這些腳本能夠繞過許多網站的安全策略,從而讓攻擊者能夠竊取使用者資訊、操作受害者的會話、改變網頁的內容或進行其他惡意活動。

在了解了XSS的定義之後一定會有人好奇,這個攻擊到底是怎麼出現的,所以接下來簡介一下XSS 的起源和歷史背景!

其實這種攻擊手法已經存在了很長時間,但其名稱和現今我們所認識的形式並不是一開始就定義好的。

    1. 初期的識別:早在1990年代,隨著網頁變得越來越互動,使用者的輸入開始被嵌入到網頁中。這在當時的技術環境中創建了一個新的攻擊面向,但對這種新的安全問題的認識還很有限。
    2. 命名與普及認識:到了2000年左右,這種攻擊方式開始被安全社區廣泛討論。它被命名為”跨站腳本攻擊”(Cross-Site Scripting),縮寫為XSS,以與CSS(層疊樣式表)區分。儘管名稱中包含”跨站”,但XSS並不涉及多個網站;名稱是為了描述攻擊者如何注入腳本到另一個網站的上下文中。
    3. 安全社群的關注:隨著網頁應用的普及,XSS攻擊的潛在威脅也變得越來越大。OWASP(開放網頁應用安全項目)將XSS列為其著名的”十大網頁應用安全風險”中的一項。這增加了對XSS攻擊的關注度和意識。
    4. 演進與變種:原本的XSS概念已經擴展到包括多種類型,如儲存型、反射型和DOM型。每一種都有其特定的攻擊模式和潛在的風險。

如今,XSS仍然是網頁應用中的一大威脅,但隨著時間的推移,開發者和組織已經更加意識到其嚴重性,並投入更多資源來防範這類攻擊。安全實踐、工具和框架也在不斷進化,以更有效地防護XSS攻擊。

在了解了XSS攻擊的起源與歷史後,一定有人懷疑都存在這麼久了攻擊了,為何XSS 到現在還是如此普遍,我覺得近年來XSS越來越普遍的原因如下

輸入驗證和輸出編碼的缺乏:

網站應用程式經常需要接受用戶輸入,如表單、查詢參數或 cookies。如果這些輸入不被適當地驗證和清理,則可能容易受到 XSS 攻擊。 而輸出編碼是另一個常被忽視的部分。即使輸入被驗證過,但如果在輸出到 HTML 頁面時沒有被適當地編碼,則可能成為 XSS 的攻擊點。

複雜的前端技術:

現代網頁的前端技術,如 JavaScript、AJAX 和各種 JavaScript 框架,使得網頁更加動態和互動,但也增加了 XSS 攻擊的機會。

教育和知識的缺乏:

許多開發者可能對 XSS 或其他安全問題的實際影響並不完全了解,或者他們可能不知道如何適當地防範這些問題。

高獲利和簡單執行:

對於攻擊者來說,XSS 攻擊相對簡單,且可能獲得豐厚的報酬,例如竊取用戶資訊、發布惡意廣告、或作為其他攻擊的一部分。

複雜的應用程式邏輯:

越複雜的應用程式,越有可能存在安全漏洞。尤其當開發者需要處理各種不同的輸入和輸出情境時。

XSS 的主要類型

  • 反映型 (Reflected XSS)
    • 攻擊者提交的腳本被網站儲存下來,例如在留言板、評論或其他內容中。當其他用戶訪問該內容時,腳本就會在他們的瀏覽器上執行。
  • 儲存型 (Stored XSS)
    • 攻擊者透過URL參數傳遞惡意腳本,且該腳本不會儲存於網站上。當受害者點擊這個URL或被導向這個URL時,腳本在其瀏覽器上執行。
  • DOM 基礎型 (DOM-based XSS)
    • 這種攻擊涉及到網頁的DOM(文件物件模型)。攻擊者會修改DOM結構,導致惡意腳本的執行。

攻擊機制與範例

  • 以下是常見的 XSS 攻擊向量

   基本的腳本注入

htmlCopy code
<script>alert('XSS');</script>

   使用事件觸發器:攻擊者可能會在HTML元素的事件屬性中注入JavaScript代碼,如onmouseoveronloadonerror等。

htmlCopy code
<img src="fakeimage" onerror="alert('XSS');" />

基於DOM的XSS:透過修改DOM結構。

javascriptCopy code
document.location = 'javascript:alert("XSS")';

用JavaScript的eval()函數:這個函數可以執行字串中的JavaScript代碼,使其成為一個熱門的XSS攻擊目標。

javascriptCopy code
eval('alert("XSS")');

<iframe>標籤:嵌入一個惡意網站或腳本。

htmlCopy code
<iframe src="http://malicious.example.com/badscript.js"></iframe>

繞過過濾器:使用不同的編碼或大小寫變體來繞過對某些字符的過濾。

利用CSS:儘管不是直接的JavaScript,但可以用來做一些欺騙行為或破壞網站布局。

<base>標籤:改變相對URL的基礎,可能導致其他腳本或內容被誤加載。

5. XSS 的潛在風險

  • 資料竊取
  • 會話劫持
  • 惡意軟體分發

6. 防護策略

  • 輸入驗證
  • 輸出編碼
  • 使用 Content Security Policy (CSP)
  • HTTP-only 和 Secure cookies 屬性

7. 新型與繁複的 XSS 攻擊技巧

    1. Mutated XSS(mXSS):這種XSS利用了瀏覽器解析器的行為異常來注入惡意內容。例如,某些HTML實體可能在某一環節被解析,但在其他地方不被解析。
    2. SVG文件注入:可縮放矢量圖形(SVG)允許嵌入JavaScript。如果網站接受上傳SVG而沒有正確地過濾或隔離它,可能會導致XSS攻擊。
    3. 在Web Workers中執行XSS:Web Workers允許在瀏覽器後台執行腳本。如果攻擊者能夠控制Web Worker的腳本源,則可能導致XSS。
    4. 利用Polyglots:Polyglots是可以在多個語境中執行的代碼片段。例如,一段可以同時作為JavaScript和HTML運行的代碼。這使攻擊者可以在多種場景中利用同一個載荷。
    5. 利用Service Workers:Service Workers是一種能夠攔截和控制網絡請求的腳本。如果攻擊者可以註冊惡意的Service Worker,則可以攔截和修改任何網站的請求。
    6. 利用模板注入:某些前端框架允許使用者輸入模板。如果沒有正確地過濾這些輸入,則可能導致XSS攻擊。
    7. 充分利用CSP報告:內容安全策略(CSP)通常用於防止XSS,但其報告功能也可能被攻擊者利用來洩露信息。

8. 工具和資源

  • XSS 測試工具推薦(這些是從網路上收集來的,並不是每套都有用過)
    1. Firebug:此工具可以動態修改Html元素、查看網路狀況、查看DOM等,並且在Chrome上有Lite版本1
    2. Temper Data:主要可以簡易地修改HTTP/HTTPS的Header及POST參數,不過它不能查看Response1
    3. Live HTTP Headers:用於分析HTTP流量,可以Replay一個請求並對其中的內容進行修改1
    4. Fiddler:此工具運行時需要掛Proxy,預設端口是8888,它不僅能查看和分析網路流量,也能修改Header、文本轉換等1
    5. XSStrike:它是一個以Python編寫的Cross Site Scripting注入檢測工具,能夠使用多個解析器產生有效的payload來進行測試。它包含爬蟲測試、參數查找、模糊測試、防火牆檢測功能,並能夠掃描DOM XSS23
    6. Google CSP Evaluator:Google提供的工具,可以用來驗證網站的Content Security Policy (CSP)配置,以及檢測XSS的弱點4

這些工具各有特色,適合不同的測試需求,您可以根據您的需求來選擇合適的工具。不過需要注意的是,進行XSS測試時應確保具有相應的權限(因為是滲透測試的一種),以避免違法行為。

發佈留言