明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

ASP漏洞集-跨站Script攻擊與防范

[摘要]跨站Script攻擊和防范 第一部分:跨站Script攻擊每當(dāng)我們想到黑客的時(shí)候,黑客往往是這樣一幅畫(huà)像:一個(gè)孤獨(dú)的人,悄悄進(jìn)入別人的服務(wù)器中,進(jìn)行破壞或者竊取別人的秘密資料。也許他會(huì)更改我們的主頁(yè),甚者會(huì)竊取客戶的信用卡號(hào)和密碼。另外,黑客還會(huì)攻擊訪問(wèn)我們網(wǎng)站的客戶。與此同時(shí),我們的服務(wù)器也...

跨站Script攻擊和防范  
第一部分:跨站Script攻擊
每當(dāng)我們想到黑客的時(shí)候,黑客往往是這樣一幅畫(huà)像:一個(gè)孤獨(dú)的人,悄悄進(jìn)入別人的服務(wù)器中,進(jìn)行破壞或者竊取別人的秘密資料。也許他會(huì)更改我們的主頁(yè),甚者會(huì)竊
取客戶的信用卡號(hào)和密碼。另外,黑客還會(huì)攻擊訪問(wèn)我們網(wǎng)站的客戶。與此同時(shí),我們的服務(wù)器也成了他的幫兇。微軟稱這種攻擊為“跨站script”攻擊。而這種攻擊大多
數(shù)都發(fā)生在網(wǎng)站動(dòng)態(tài)產(chǎn)生網(wǎng)頁(yè)的時(shí)侯,但黑客的目標(biāo)并不是你的網(wǎng)站,而是瀏覽網(wǎng)站的客戶。
跨站script攻擊的說(shuō)明
  在一本名為<<ADVISORY CA--2000-02>>的雜志中,CERT警告大家:如果服務(wù)器對(duì)客戶的輸入不進(jìn)行有效驗(yàn)證,黑客就會(huì)輸入一些惡意的HTML代碼,當(dāng)這些HTML代碼輸
入是用于SCRIPT程序,他們就能利用它來(lái)進(jìn)行破壞,如插入一些令人厭惡的圖片或聲音等,同時(shí),也能干擾了客戶正確瀏覽網(wǎng)頁(yè)。
  我們知道,有些朋友曾經(jīng)被誘導(dǎo)到一些可疑的免費(fèi)網(wǎng)站,他們得到的僅僅是10到20個(gè)小的窗口,這些窗口常常伴隨著由JAVA 或 JAVASCRIPT生成的失效安鈕,這被稱
為鼠標(biāo)陷阱。關(guān)閉這些窗口是徒勞的,每當(dāng)我們關(guān)閉一個(gè)窗口,又會(huì)有10幾個(gè)窗口彈出。這種情況常常發(fā)生在管理員沒(méi)在的時(shí)侯發(fā)生。鼠標(biāo)事件是黑客利用跨站SCRIPT方法
攻客戶的典型范例。
  惡意的標(biāo)簽和SCRIPT不單純的惡作劇,他們甚至可以竊取資料和搗毀系統(tǒng)。一個(gè)聰明的甚至是不夠聰明的黑客都能夠使用SCRIPT干擾或者改變服務(wù)器數(shù)據(jù)的輸入。利用
SCRIPT代碼也能攻擊客戶系統(tǒng),讓你的硬盤(pán)盡損。而且你要知道,在你一邊使用服務(wù)器的時(shí)候,黑客的SCRIPT也正在你服務(wù)器里安全的地方運(yùn)行著的呀!如果客戶對(duì)你的服
務(wù)器非常信認(rèn),同樣他們也會(huì)信任那些惡意的SCRIPT代碼。甚至這個(gè)代碼是以〈SCRIPT〉或者〈OBJECT〉的形式來(lái)自黑客的服務(wù)器。
  即使使用了防火墻(SSL)也不能防止跨站SCRIPT的攻擊。那是因?yàn)槿绻蓯阂釹CRIPT代碼的設(shè)備也使用了SSL,我們服務(wù)器的SSL是不能辨別出這些代碼來(lái)的。我們
難道就這樣把客戶曾經(jīng)那么信任的網(wǎng)站拱手讓給黑客嗎?而且有這種破壞的存在,會(huì)讓你網(wǎng)站名譽(yù)盡損的。


一、跨站SCRIPT攻擊示例:
  根據(jù)CERT的資料,動(dòng)態(tài)輸入大致有這幾種形式:URL參數(shù),表格元素,COOKISE以及數(shù)據(jù)請(qǐng)求。讓我們來(lái)分析一下,這個(gè)只有兩個(gè)頁(yè)面的網(wǎng)站,網(wǎng)站名為:
MYNICESITE.COM。第一頁(yè)使用一張表格或COOKIE來(lái)獲取用戶名:
<%@ Language=VBScript %>
<% If Request.Cookies("userName") <> "" Then
Dim strRedirectUrl
strRedirectUrl = "page2.asp?userName="
strRedirectUrl = strRedirectUrl & Response.Cookies("userName")
Response.Redirect(strRedirectUrl)
Else %>
<HTML>
<HEAD>
<TITLE>MyNiceSite.com Home Page</TITLE>
</HEAD>
<BODY>
<H2>MyNiceSite.com</H2>
<FORM method="post" action="page2.asp">
Enter your MyNiceSite.com username:
<INPUT type="text" name="userName">
<INPUT type="submit" name="submit" value="submit">
</FORM>
</BODY>
</HTML>
<% End If %>

第二頁(yè)返回用戶名以示歡迎:
<%@ Language=VBScript %>
<% Dim strUserName
If Request.QueryString("userName")<> "" Then
strUserName = Request.QueryString("userName")
Else
Response.Cookies("userName") = Request.Form("userName")
strUserName = Request.Form("userName")
End If %>
<HTML>
<HEAD></HEAD>
<BODY>
<H3 align="center">Hello: <%= strUserName %> </H3>
</BODY>
</HTML>
  當(dāng)你正常常輸入文字時(shí),一切都很正常。如果你輸入Script代碼:<SCRIPT>alert('Hello.';</script>,JavaScript警告標(biāo)簽就會(huì)彈出來(lái):
  在你下一次訪問(wèn)時(shí),這個(gè)警示標(biāo)簽同樣會(huì)出現(xiàn);這是因?yàn)檫@個(gè)Script代碼在你第一次訪問(wèn)的時(shí)后就已經(jīng)留在cookie中了。這是一個(gè)簡(jiǎn)單的跨站攻擊的范例。
  如果你認(rèn)為這是一個(gè)特殊情況,你也不妨到網(wǎng)上別的地方看看,親自試一下。我曾經(jīng)對(duì)一些大型的政府網(wǎng)站、教育網(wǎng)站以及商業(yè)網(wǎng)站進(jìn)行過(guò)測(cè)試,他們當(dāng)中的確有部分
出現(xiàn)了以上所說(shuō)的情況,我甚至發(fā)現(xiàn)了我經(jīng)常使用信用卡的網(wǎng)站也居然對(duì)輸入不進(jìn)行任何過(guò)濾,想想真是可怕。

 

二、 用E-Mail進(jìn)行跨站Script攻擊
  跨站script攻擊用在列表服務(wù)器,usenet服務(wù)器和郵件服務(wù)器來(lái)得特別容易。下面還是以MyNiceSite.com網(wǎng)站為例進(jìn)行說(shuō)明。由于你經(jīng)常瀏覽這個(gè)網(wǎng)站,它的內(nèi)容也
的確讓你愛(ài)不愛(ài)不釋手,因此在不知不覺(jué)中你就把瀏覽器的改成了總是信任這個(gè)動(dòng)態(tài)網(wǎng)站內(nèi)容的設(shè)置。
  MyNiceSite.com網(wǎng)站總是通過(guò)出售征訂它們Email信件的郵箱地址來(lái)獲得收入,這的確是一種不太好的辦法。于是我買(mǎi)了它的一份郵箱地址。并發(fā)了大量的郵件給你們
。在信中我告訴你們盡快訪問(wèn)這個(gè)網(wǎng) 站,并檢查你們帳戶使用的最新情況。為了讓你們感到方便,我在這信中也作了鏈接。我在這鏈接URL中的username參數(shù)中舔加了
script代碼。有些客戶在不知不覺(jué)中就點(diǎn)擊了這個(gè)鏈接,也就是說(shuō)上了我的當(dāng)(如圖),同時(shí)我也從中得到了好處:
  它是這樣工作的,當(dāng)你點(diǎn)擊這個(gè)鏈接的時(shí)后,在鏈接里的script代碼就會(huì)引導(dǎo)你所用瀏覽器去下載我的JavaScript程序并執(zhí)行它。我的Script檢查到你使用的是IE瀏
覽器后,就著手下載ActiceX控件 particularlyNasty.dll。因?yàn)橹澳阋呀?jīng)把這個(gè)網(wǎng)站的內(nèi)容認(rèn)為總是安全的,這樣,我的script代碼和Active 控件就能在你機(jī)器上
自由自在的運(yùn)行了。


三、 Activex攻擊說(shuō)明
  在討論ActiveX時(shí),CERT和微軟都沒(méi)提到跨站script方法所帶來(lái)的的危險(xiǎn)。W3C在<<安全常見(jiàn)問(wèn)題解答>>中對(duì)ActiveX的安全問(wèn)題作了比較詳盡的說(shuō)明。Java applet
對(duì)系統(tǒng)的控制受到嚴(yán)格限制。SUN開(kāi)發(fā)它時(shí)就規(guī)定,只有那些對(duì)系統(tǒng)的安全不構(gòu)成威脅的操作才被允許運(yùn)行。
  在另一方面,ActiveX對(duì)系統(tǒng)的操作就沒(méi)有嚴(yán)格地被限制。如果一但被下載,就可以象安裝的可執(zhí)行程序一樣做他們想干的事情。針對(duì)這一特點(diǎn)IE瀏覽器也作了某些限
制,如對(duì)于那些不安全的站點(diǎn),在它的默認(rèn)設(shè)置中就會(huì)不允許你進(jìn)行下載或者會(huì)給你警告的提示。正在基于ActiveX進(jìn)行開(kāi)發(fā)的公司,如VeriSign公司,它們對(duì)ActiveX控
件都給編了號(hào)。當(dāng)你在下載控件的時(shí)后,IE瀏覽器會(huì)給你警告并顯示它的可信籟程度。由用戶決定是否相信這個(gè)控件。這樣一來(lái)系統(tǒng)的安全性就增加了。
  但是,對(duì)于那些沒(méi)有多少經(jīng)驗(yàn)的用戶來(lái)說(shuō),他們往往不自覺(jué)地對(duì)原來(lái)的設(shè)置進(jìn)行了修改,讓這些控件在沒(méi)有任何提示的情況下就下載了。另外,對(duì)一個(gè)新手來(lái)說(shuō),即使
在有提示的情況下也會(huì)不加思索地下載那些沒(méi)作任何標(biāo)記的控件。在我們所舉的例子中,由于你對(duì)該站點(diǎn)的信任,改了瀏覽器的設(shè)置,這樣,ActiveX控件在不經(jīng)過(guò)任何提
示的情況下就下載,并在你的機(jī)器上不知不覺(jué)地開(kāi)始運(yùn)行。


四、16進(jìn)制編碼的ActiveX Script 攻擊
  要把用心不良的標(biāo)簽和script區(qū)分出來(lái)是一件非常困難的事。Script還可以16進(jìn)制的形式把自己藏起來(lái)。讓我們看看下面這個(gè)E-mail范例好嗎?它是以16進(jìn)制的形式
被發(fā)送出去的:
  這幾乎是一封完整的郵件,里面包含了以16進(jìn)制偽造的URL參數(shù):sender=mynicesite.com。當(dāng)用戶點(diǎn)擊鏈接時(shí),用戶的瀏覽器就會(huì)直接開(kāi)始第一例所說(shuō)的處理過(guò)程而
彈出警告窗口。


[page_break]第二部分:跨站Script攻擊的防犯
一、如何避免服務(wù)器受到跨站Script的攻擊
  值得慶幸的是,防止跨站Script攻擊的技術(shù)正趨于完善。目前可采取這幾種方式來(lái)防止跨站Script的攻擊:
1.對(duì)動(dòng)態(tài)生成的頁(yè)面的字符進(jìn)行編碼
2.對(duì)輸入進(jìn)行過(guò)濾和限制
3.使用HTML和URL編碼

1.對(duì)動(dòng)態(tài)生成的頁(yè)面的字符進(jìn)行編碼
  你們首先要采用的就是對(duì)動(dòng)態(tài)生成頁(yè)面的字符進(jìn)行編碼,你必須這樣做,不然黑客很有可能更改你的字符設(shè)置而輕易地通過(guò)你的防線。如果我們的網(wǎng)站是個(gè)英語(yǔ)網(wǎng)站,
這樣只要我們把字符編碼設(shè)成拉丁字符ISO-8859-1就行了,具體情況如下:
<META http-equiv="Content-Type" content="text/html;charset=ISO-8859-1">
2.過(guò)濾和限制所有輸入的數(shù)據(jù)
  這是防止跨站Script的攻擊的第二種方法,在進(jìn)行登錄的時(shí)侯,不要讓那些特殊的字符也輸入進(jìn)去。因此我們可在ONSUBMIT方法中加入JAVASCRIPT程序來(lái)完成這個(gè)功
能。在本例中我們限制最多只能輸入15個(gè)字符。這樣可以阻止那些較長(zhǎng)的script的輸入。
  在<<Knowledge Base Article QA252985>>這本書(shū)中微軟提供了一個(gè)簡(jiǎn)短的Javascript程序來(lái)完成對(duì)輸入數(shù)據(jù)的過(guò)濾。我們也根據(jù)具體情況引進(jìn)了這段代碼用于我們
的例子中,如:
function checkForm() {
document.forms[0].userName.value = _
RemoveBad(document.forms[0].userName.value);
return true;
}
// MICROSOFT'S CODE
function RemoveBad(strTemp) {
strTemp = strTemp.replace(/\</\>/\"/\'/\%/\;/\(/\)/\&/\+/\-/g,"");
return strTemp;
}
用這個(gè)辦法,可以過(guò)濾在輸入中含有的這些字符:
% < > [ ] { } ; & + - " '( )
3.使用HTML和URL編碼
  盡管使用上面所說(shuō)的過(guò)濾和限制輸入的辦法是一種非常重要用防御手段,但它對(duì)我的這種采用郵件方式的攻擊還是無(wú)能為力。因?yàn)槲野裊RL的參數(shù)直接放在郵件中。針
對(duì)這種情況我們不得不采取一種更有力的安全措施。如果我們用的ASP,解決起來(lái)相對(duì)說(shuō)來(lái)要容易得多。只要對(duì)動(dòng)態(tài)生成的網(wǎng)頁(yè)總進(jìn)行HTML和URL編碼就行了。針對(duì)我們例子
中的情況,在第一輸入頁(yè)中我們對(duì)redirect URL作了如下改動(dòng):
strRedirectUrl = strRedirectUrl & _
server.URLEncode(Response.Cookies("userName"))
在執(zhí)行頁(yè)中我們加入:
strUserName =server.HTMLEncode(Request.QueryString("userName"))

strUserName =server.HTMLEncode(Request.Form("userName"))
  微軟推薦對(duì)所有動(dòng)態(tài)頁(yè)面的輸入和輸出都應(yīng)進(jìn)行編碼。甚至在對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)的存入和取出也應(yīng)如此。這樣你就能在很大程度上避免跨站script的攻擊。
要做到這些還要在Page1.asp中加入:
<%@ Language=VBScript %>
<% If Request.Cookies("userName") <> "" Then
'redirect if detect the cookie
Dim strRedirectUrl
strRedirectUrl = "page2.asp?userName="
strRedirectUrl = strRedirectUrl & _
server.URLEncode(Request.Cookies("userName"))
Response.Redirect(strRedirectUrl)
Else %>
<HTML>
<HEAD>
<META http-equiv="Content-Type"content="text/html; charset=ISO-8859-1">
<TITLE>MyNiceSite.com Home Page</TITLE>
</HEAD>
<SCRIPT LANGUAGE="javascript">
<!--
function checkForm() {
document.forms[0].userName.value =
RemoveBad(document.forms[0].userName.value);
return true;
}
//******************************************************
//Programmer: NOT ORIGINAL CODE - COMES FROM MICROSOFT
//Code Source: Microsoft Knowledge Base Article Q25z985
//Description: Removes bad characters.
//******************************************************
function RemoveBad(strTemp) {
strTemp =strTemp.replace(/\</\>/\"/\'/\%/\;/\(/\)/\&/\+/\-/g, "");
return strTemp;
}
//-->
</SCRIPT>
<BODY>
<BR>
<H2>MyNiceSite.com</H2>
<BR>
<FORM method="post"action="page2.asp" onsubmit="return checkForm();">
Enter your MyNiceSite.com username:
<INPUT type="text"name="userName" width="10" maxwidth="10">
<INPUT type="submit"name="submit" value="submit">
</FORM>
</BODY>
</HTML>
<% end if %>

Page2.asp中加如:
<%@ Language=VBScript %>
<% Dim strUserName
If Request.QueryString("userName")<>"" Then
strUserName =server.HTMLEncode(Request.QueryString("userName"))
Else
Response.Cookies("userName") =Request.Form("userName")
strUserName = server.HTMLEncode(Request.Form("userName"))
End If %>
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html;charset=ISO-8859-1">
</HEAD>
<BODY>
<H3 align="center">Hello: <%= strUserName %></H3>
</BODY>
</HTML>
  現(xiàn)在由于這種攻擊遭到有效的防制。那于那些惡意的標(biāo)簽和Script被編碼,他們就被以文字的形式顯現(xiàn)了出來(lái),如下圖:
  我們也可增加一個(gè)IIS組件用于過(guò)濾所有從動(dòng)態(tài)輸入中的特殊字符。對(duì)于那些已經(jīng)做好的網(wǎng)站,采用這種辦法來(lái)防止跨站script的攻擊來(lái)得非常容易。我們的這個(gè)控件
能攔截來(lái)自ASP頁(yè)面的REQUEST目標(biāo),可對(duì)表格,cookie,請(qǐng)求字串和程序的內(nèi)容進(jìn)行檢測(cè):
  我們也可以通過(guò)編寫(xiě)log文件的方法把統(tǒng)計(jì)數(shù)據(jù)加入這個(gè)組件中。每當(dāng)一個(gè)客戶輸入一個(gè)非法字符時(shí),這個(gè)組件會(huì)記下它的IP地址和時(shí)間。詳情請(qǐng)見(jiàn)Doug Dean的
<<Roll your Own IIS Application on ASPToday>>一文。
  我們只需采取一些簡(jiǎn)單的步聚就能有效地阻止跨站script的攻擊。除了以上所說(shuō)的三種方法外,微軟和CERT還強(qiáng)烈推薦使用一種他們稱之為“sanity check”的方法
。例如,假設(shè)有個(gè)輸入窗口只允許輸入數(shù)字,我們就給它做個(gè)限定,只允許0-9數(shù)字的輸入。微軟和CERT所采用的這種對(duì)輸入的字符進(jìn)行限定的辦法要比單獨(dú)的采用過(guò)濾特
殊字符要好得多。采用了這些措施后你就能讓那些參觀你網(wǎng)站的客戶在訪問(wèn)你網(wǎng)站時(shí)受到保護(hù)。
二、免受黑客攻擊我們?yōu)g覽器方法:
  當(dāng)你在網(wǎng)上漫游的時(shí)侯,怎樣來(lái)避免受到攻擊呢?微軟和CERT建議不要在網(wǎng)上胡碰亂撞。針對(duì)這種情況,PC雜志一個(gè)欄目的名叫John Dvorack作者作了一個(gè)饒有興趣
的回答。他認(rèn)為這是微軟公司一起有預(yù)謀的行為:就是用來(lái)恐嚇網(wǎng)上沖浪的人到那些安全的站點(diǎn)去瀏覽,如美國(guó)在線和MSN.com網(wǎng)站。
  在我們所舉的例子中,即使你不在網(wǎng)上胡亂游蕩,也不能避免在網(wǎng)上遭到黑客的襲擊。具有諷刺意義的是,大多數(shù)的危險(xiǎn)都來(lái)自于我們最信任的網(wǎng)站。如果要讓網(wǎng)站一
定不出問(wèn)題,你只好不下載任何動(dòng)態(tài)內(nèi)容或者任何cookie。預(yù)知詳情請(qǐng)參閱瀏覽器的相關(guān)資料。
  微軟也警告你們應(yīng)把瀏覽器的Active Script設(shè)置成嚴(yán)格限制的狀態(tài)并把Email也設(shè)成嚴(yán)格限制的接收模式。在點(diǎn)擊郵件中的鏈接時(shí),一定要小心。如需進(jìn)一步了解情
況請(qǐng)參閱一本名叫<<Microsoft's Knowledge Base Article Q253117>>的書(shū)。為了以防萬(wàn)一,你最好是多一點(diǎn)上網(wǎng)經(jīng)驗(yàn),并且時(shí)刻要小心謹(jǐn)慎。
結(jié)論
  如果你是以前的UNIX程序開(kāi)發(fā)人員,你也許不會(huì)知道跨站script意謂著什么。你知道許多站點(diǎn)的管理人員登錄的用戶名和密碼分別為root,root.同樣許多數(shù)據(jù)庫(kù)管理
員的名稱和密碼分別為sa,password。你也知道Webzine(如Phrack 和 Alt2600),依據(jù)他們所提供的方法能讓你一步步地知道某臺(tái)服務(wù)器的弱點(diǎn)。在這種硬件上,你也知
道許多網(wǎng)站的數(shù)據(jù)庫(kù)服務(wù)器和web服務(wù)器都沒(méi)有進(jìn)行自我保護(hù)。一但遭遇黑客,機(jī)器就得癱瘓。
  盡管我們很容易采取防止系統(tǒng)受到黑客的攻擊的措施,但我們的系統(tǒng)是一直暴露在黑客面前的。我們完全有理由相信下一年還會(huì)出現(xiàn)一些新的安全漏洞。在CERT公司
John Howard先生指導(dǎo)下完成的一篇論文中曾提到:“跟據(jù)目前的研究顯示,每個(gè)在英特網(wǎng)上具有域名的網(wǎng)站平均一年被黑客至少攻擊一次!
  對(duì)服務(wù)器來(lái)說(shuō)那怕只是一次這種攻擊也是不能承受的?缯維cript攻擊是黑客可采用的另一種方法。但我們只要進(jìn)行以上所說(shuō)的一些簡(jiǎn)單的處理就能防止這種形式攻擊
的發(fā)生。