跨站式腳本(Cross-SiteScripting)XSS攻擊原理分析
更新時間:2008年09月06日 12:27:38 作者:
XSS又叫CSS (Cross Site Script) ,跨站腳本攻擊。它指的是惡意攻擊者往Web頁面里插入惡意html代碼,當(dāng)用戶瀏覽該頁之時,嵌入其中Web里面的html代碼會被執(zhí)行,從而達到惡意用戶的特殊目的。
危害
1、盜取各類用戶帳號,如機器登錄帳號、用戶網(wǎng)銀帳號、各類管理員帳號
2、控制企業(yè)數(shù)據(jù),包括讀取、篡改、添加、刪除企業(yè)敏感數(shù)據(jù)的能力
3、盜竊企業(yè)重要的具有商業(yè)價值的資料
4、非法轉(zhuǎn)賬
5、強制發(fā)送電子郵件
6、網(wǎng)站掛馬
7、控制受害者機器向其它網(wǎng)站發(fā)起攻擊
防范
1、必須明確:一切輸入都是有害的,不要信任一切輸入的數(shù)據(jù)。
2、緩和XSS問題的首要法則是確定哪個輸入是有效的,并且拒絕所有別的無效輸入。
3、替換危險字符,如:"&", "<", ">", ""","'", "/", "?",";", ":", "%", "<SPACE>", "=", "+"。各種語言替換的程度不盡相同,但是基本上能抵御住一般的XSS攻擊。
復(fù)制代碼 代碼如下:
a.ASP中的Server.HTMLEncode: <%= Server.HTMLEncode("The paragraph tag: <P>") %>
b.ASP.NET的Server.HtmlEncode及Server.UrlEncode: String TestString = "This is a <Test String>.";
String EncodedString = Server.HtmlEncode(TestString);
Server.UrlEncode(Request.Url.ToString());
4、有些網(wǎng)站使用過濾javascript關(guān)鍵字的辦法來防止XSS,其實是很不明智的,因為XSS有時候根本就不需要javascript關(guān)鍵字或者對javascript關(guān)鍵字進行格式變化來躲過過濾。
5、為所有的標記屬性加上雙引號。應(yīng)該說這也不是萬全之策,只是在轉(zhuǎn)義了雙引號的前提下的一道安全保障。比如: 不加雙引號時,onclick被執(zhí)行了:
<a href=http://www.xxx.com/detail.asp?id=2008 onclick='javascrpt:alert('haha')'>
加上了雙引號,onclick不會被執(zhí)行:
<a href="http://www.xxx.com/detail.asp?id=2008 onclick='javascrpt:alert('haha')'">
6、將數(shù)據(jù)插入到innerText屬性中,腳本將不會被執(zhí)行。如果是innerHTML屬性,則必須確保輸入是安全的。如ASP.NET中:
復(fù)制代碼 代碼如下:
<%@ Page Language="C#" AutoEventWireup="true"%>
<html>
<body>
<span id="Welcome1" runat="server"> </span>
<span id="Welcome2" runat="server"> </span>
</body>
</html>
<script runat="server">
private void Page_Load(Object Src, EventArgs e)
{
// Using InnerText renders the content safe–no need to HtmlEncode
Welcome1.InnerText = "haha";
// Using InnerHtml requires the use of HtmlEncode to make it safe
Welcome2.InnerHtml = "Hello, " + Server.HtmlEncode("haha");
}
</Script>
7、使用IE6.0SP1的cookie選項HttpOnly,注意,HttpOnly只能阻止惡意腳本讀取cookie,并不能阻止XSS攻擊。比如在ASP.NET中:
復(fù)制代碼 代碼如下:
HttpCookie cookie = new HttpCookie("Name", "ZhangChangrong");
cookie.Path = "/; HttpOnly";
Response.Cookies.Add(cookie);
8、使用IE的<IFrame>的Security屬性,設(shè)置為restricted后,frame中的腳本將不能執(zhí)行(僅限于IE)。如:
<iframe security="restricted" src="http://www.somesite.com/somepage.htm"></frame>
9、ASP.NET中的ValidateRequest配置選項。默認情況下,這個功能是開啟的,這個功能將會檢查用戶是否試圖在cookie、查詢字符串以及HTML表格中設(shè)置HTML或腳本。如果請求包含這種潛在的危險輸入,就會拋出一個HttpRequestValidationException異常。我在嘗試試探當(dāng)當(dāng)網(wǎng)的XSS漏洞時發(fā)現(xiàn)這個異常信息,可以說當(dāng)當(dāng)網(wǎng)使用了ValidateRequest這個選項,或者從另一方面說,也許是無意中啟用了這一選項,同時,將錯誤信息拋出給用戶是非常不安全的。
a、給一個頁面設(shè)置ValidateRequest選項:
<%@ Page Language="C#" ValidateRequest="false" %>
b、在Machine.config中設(shè)置全局ValidateRequest選項,注意,如果在Web.config中重新設(shè)置,不會覆蓋Machine.config中的這一設(shè)置:
<system.web>
<pages buffer="true" validateRequest="true" />
</system.web>
c、讓我們來目睹當(dāng)當(dāng)網(wǎng)給我們帶來的這一盛況:

10、在一些必須使用到HTML標簽的地方,比如公告欄,可以使用其他格式的標示代替,比如論壇中廣泛使用的BBCode,用[i]...["i]來表示斜體。
11、然而,對于一些允許用戶輸入特定HTML的地方,強烈建議使用正則表達式進行匹配。比如: if (/^(?:["s"w"?"!","."'""]*|(?:"<"/"?(?:i|b|p|br|em|pre)">))*$/i)
{
#Cool, it's valid input
}
發(fā)現(xiàn)問題
1、查找所有包含用戶輸入的入口。
2、跟蹤流入應(yīng)用程序的每一個數(shù)據(jù)。
3、確定數(shù)據(jù)是否與輸出有關(guān)系。
4、如果與輸出有關(guān),它是不是原始數(shù)據(jù),是不是經(jīng)過處理的?
參考資料
Michael Howard, David LeBlanc. "Writing Secure Code"
Mike Andrews, James A. Whittaker "How to Break Web Software"
http://en.wikipedia.org/wiki/Cross-site_scripting
Klein, Amit (July 4, 2005). "DOM Based Cross Site Scripting or XSS of the Third Kind". Web Application Security Consortium. Retrieved on 2008-05-28.
http://ha.ckers.org/xss.html
相關(guān)文章
Iptables防火墻iprange模塊擴展匹配規(guī)則詳解
這篇文章主要為大家介紹了Iptables防火墻iprange模塊擴展匹配規(guī)則詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08