1. 程式人生 > 其它 >XSS漏洞綜述

XSS漏洞綜述

在本節中,我們將解釋什麼是XSS漏洞,描述不同型別的XSS漏洞,並詳細說明如何發現和防禦XSS漏洞。

1. XSS概述

XSS(也稱為跨站指令碼攻擊)是一個web安全漏洞,它允許攻擊者破壞使用者與易受攻擊的應用程式的互動。它允許攻擊者繞過隔離不同網站的同源策略。跨站點指令碼漏洞通常允許攻擊者偽裝成受害使用者,執行使用者能夠執行的任何操作,並訪問使用者的任何資料。如果受害使用者在應用程式中擁有最高許可權,那麼攻擊者就可能獲得對所有應用程式功能和資料的完全控制。

2. XSS原理

XSS原理是操縱一個脆弱的網站,使其返回惡意的JavaScript給使用者。當惡意程式碼在受害者的瀏覽器中執行時,攻擊者可以完全破壞它們與應用程式的互動。

3. XSS攻擊型別

XSS主要有三種攻擊型別:

  • 反射型XSS,惡意指令碼來自當前HTTP請求。
  • 儲存型XSS,惡意指令碼來自網站的資料庫。
  • DOM型XSS,漏洞存在於客戶端程式碼而不是伺服器端程式碼中。

4. 反射型XSS

反射XSS是最簡單的跨站點指令碼。當應用程式在HTTP請求中接收資料並以不安全的方式在即時響應中包含該資料時,就會出現這種情況。

下面是一個反映XSS漏洞的簡單示例:

https://insecure-website.com/status?message=All+is+well.

<p>Status: All is well.</p> 

應用程式不執行資料的任何其他處理,所以攻擊者可以很容易地構造這樣的攻擊:

https://insecure-website.com/status?message=<script>/*+Bad+stuff+here...+*/</script>

<p>Status: <script>/* Bad stuff here... */</script></p> 

如果使用者訪問了攻擊者構造的URL,那麼攻擊者的指令碼就會在使用者的瀏覽器中,以使用者的會話許可權執行。此時,指令碼可以執行任何操作,並檢索使用者訪問的任何資料。

5. 儲存型XSS

當應用程式從不受信任的源接收資料並以不安全的方式將該資料包含在其稍後的HTTP響應中時,儲存XSS(也稱為持久型XSS或second-order XSS)就會出現。

有問題的資料可能通過HTTP請求提交給應用程式;例如,部落格文章中的評論、聊天室中的使用者暱稱或客戶訂單的聯絡方式。在其他情況下,資料可能來自其他不可信的來源;例如,一個webmail應用程式顯示通過SMTP接收的訊息,一個營銷應用程式顯示社交媒體帖子,或者一個網路監控應用程式顯示來自網路流量的資料包資料。

下面是一個儲存型XSS漏洞的簡單示例。留言板應用程式允許使用者提交訊息,這些訊息將顯示給其他使用者:

 <p>Hello, this is my message!</p> 

應用程式對提交資料不做任何處理,所以攻擊者可以很容易地傳送攻擊其他使用者的訊息:

 <p><script>/* Bad stuff here... */</script></p> 

6. DOM型XSS

DOM型XSS出現在應用程式包含一些客戶端JavaScript時,這些JavaScript以不安全的方式處理來自不受信任的源的資料,通常是將資料寫回DOM。

在下面的例子中,應用程式使用一些JavaScript從輸入欄位讀取值,並將該值寫入HTML中的元素:

var search = document.getElementById('search').value;
var results = document.getElementById('results');
results.innerHTML = 'You searched for: ' + search; 

如果攻擊者可以控制輸入欄位的值,他們可以很容易地構造一個惡意的值,導致他們自己的指令碼執行:

 You searched for: <img src=1 onerror='/* Bad stuff here... */'> 

在通常的情況下,輸入欄位是HTTP請求的一部分,如URL查詢字串引數,攻擊者使用惡意URL進行攻擊,其方式與反射型XSS相同。

7. XSS可以幹什麼

利用XSS漏洞的攻擊者通常能夠:

  • 冒充或偽裝成受害使用者。

  • 執行使用者能夠執行的任何操作。

  • 讀取使用者能夠訪問的任何資料。

  • 捕獲使用者的登入憑據。

  • Perform virtual defacement of the web site.

  • 向網站注入木馬功能。

8. XSS漏洞的影響

XSS攻擊的實際影響通常取決於應用程式的性質、它的功能和資料,以及被攻擊使用者的狀態。例如:

  • 在宣傳類的網站中,所有使用者都是匿名的,所有資訊都是公開的,因此影響通常很小。

  • 在持有敏感資料(如銀行事務、電子郵件或醫療記錄)的網站中,影響通常會很嚴重。

  • 如果被攻擊的是網站的特權使用者,那麼影響通常是致命的,允許攻擊者完全控制受攻擊的網站,並危害所有使用者和他們的資料。

9. 如何發現和測試XSS漏洞

使用Burp Suite的web漏洞掃描器可以快速可靠地發現絕大多數XSS漏洞。

手動測試反射型和儲存型的XSS通常包括嚮應用程式中的每個輸入點提交特殊的字串(比如一個簡短的字母數字字串),標識提交的輸入在HTTP響應中返回的每個位置,並分別測試每個位置,以確定是否可以使用適當精心設計的輸入來執行任意JavaScript。通過這種方式,您可以確定XSS出現的上下文,並選擇合適的payload來利用它。

根據URL引數手動測試DOM型XSS也是一個類似的過程:在引數中放置一些簡單的唯一輸入,使用瀏覽器的開發人員工具在DOM中搜索這個輸入,並測試每個位置以確定它是否可利用。然而,其他型別的DOM型XSS更難檢測。要在非基於url的輸入(如document.cookie)或非基於html的接收(如setTimeout)中找到基於dom的漏洞,沒有什麼可以替代檢查JavaScript程式碼,這可能非常耗時。Burp Suite的web漏洞掃描器結合了JavaScript的靜態和動態分析,可靠地自動檢測基於dom的漏洞。

10. CSP策略

內容安全策略(CSP)是一種瀏覽器機制,旨在減輕XSS和其他一些漏洞的影響。如果使用CSP的應用程式包含類似XSS的行為,那麼CSP可能會阻止漏洞被利用。通常,可以繞過CSP來利用潛在漏洞。

11. Dangling markup注入

Dangling markup注入是當XSS攻擊被攔截而無法利用時跨域捕獲使用者資料的一種技術。它經常被用來捕獲其他使用者可見的敏感資訊,包括使用者的CSRF令牌。

12. 如何防止XSS攻擊

在某些情況下,防止XSS非常簡單,但有些情況下,取決於應用程式的複雜性和它處理使用者可控資料的方式,可能會困難得多。

一般來說,有效防止XSS漏洞可能涉及以下措施的組合:

  • 輸入過濾。在接收使用者輸入時,儘可能嚴格地根據預期的或有效的輸入進行過濾。

  • 對輸出資料進行編碼。在HTTP響應中輸出使用者可控制的資料時,對輸出進行編碼,以防止將其解釋為活動內容。根據輸出環境,這可能需要HTML、URL、JavaScript和CSS編碼的組合。

  • 使用適當的響應頭。為了阻止HTTP響應中包含惡意的HTML或JavaScript的XSS,您可以使用Content-Type和X-Content-Type-Options頭來確保瀏覽器以您想要的方式解釋響應。

  • CSP策略。作為最後一道防線,您可以使用內容安全策略(Content Security Policy, CSP)來降低仍然發生的任何XSS漏洞的嚴重性。

13. XSS常見問題

XSS漏洞有多普遍?XSS漏洞非常常見,XSS可能是最常見的web安全漏洞。

XSS攻擊有多常見?很難獲得關於XSS真實攻擊的可靠資料,但它可能比其他漏洞更不容易被利用。

XSS和CSRF有什麼區別?XSS涉及導致網站返回惡意JavaScript,而CSRF涉及誘導受害者使用者執行他們不打算做的操作。

XSS和SQL注入之間的區別是什麼? XSS是針對其他使用者的客戶端漏洞,而SQL注入是針對應用程式資料庫的伺服器端漏洞。

如何防止PHP中的XSS ? 使用允許字元的白名單篩選輸入,並使用型別提示或型別轉換。HTML環境使用htmlentities和ENT_QUOTES轉義輸出,JavaScript環境使用JavaScript Unicode轉義。

如何防止Java中的XSS ? 使用允許的字元白名單過濾輸入,並使用諸如谷歌Guava之類的庫對HTML環境的輸出進行HTML編碼,或者對JavaScript環境使用JavaScript Unicode轉義。