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