作者: BIBI
每當我們想到駭客的時候,駭客往往是這樣一幅畫像:一個孤獨的人,悄悄進入別人的伺服器中,進行破壞或竊取別人的秘密資料。也許他會更改我們的主頁,甚者會竊取客戶的信用卡號和密碼。另外,駭客也會攻擊造訪我們網站的客戶。同時,我們的伺服器也成了他的幫兇。微軟稱這種攻擊為「跨站script」攻擊。而這種攻擊大多發生在網站動態產生網頁的時侯,但駭客的目標不是你的網站,而是瀏覽網站的客戶。
跨站script攻擊的說明
在一本名為<<ADVISORY CA--2000-02>>的雜誌中,CERT警告大家:如果伺服器對客戶的輸入不有效驗證,駭客就會輸入一些惡意的HTML程式碼,當這些HTML程式碼輸入是用於SCRIPT程序,他們就能利用它來進行破壞,如插入一些令人厭惡的圖片或聲音等,同時,也能幹擾了客戶正確瀏覽網頁。
我們知道,有些朋友曾經被誘導到一些可疑的免費網站,他們得到的僅僅是10到20個小的窗口,這些窗口常常伴隨著由JAVA 或JAVASCRIPT生成的失效安鈕,這被稱為鼠標陷阱。關閉這些窗口是徒勞無功的,每當我們關閉一個窗口,又會有10幾個窗口彈出。這種情況常常發生在管理員沒在的時侯發生。滑鼠事件是駭客利用跨站SCRIPT方法攻擊客戶的典型範例。
惡意的標籤和SCRIPT不單純的惡作劇,他們甚至可以竊取資料和搗毀系統。一個聰明的甚至是不夠聰明的駭客都能夠使用SCRIPT幹擾或改變伺服器資料的輸入。利用SCRIPT程式碼也能攻擊客戶系統,讓你的硬碟盡損。而且你要知道,在你一邊使用伺服器的時候,駭客的SCRIPT也正在你伺服器裡安全的地方運作著的呀!如果客戶對你的伺服器非常信認,同樣他們也會信任那些惡意的SCRIPT程式碼。甚至這個程式碼是以〈SCRIPT〉或〈OBJECT〉的形式來自駭客的伺服器。
即使使用了防火牆(SSL)也無法防止跨站SCRIPT的攻擊。那是因為如果產生惡意SCRIPT程式碼的裝置也使用了SSL,我們伺服器的SSL是不能辨別出這些程式碼來的。我們就這樣把客戶曾經那麼信任的網站拱手讓給駭客嗎?而且有這種破壞的存在,會讓你網站名譽盡損的。
一、跨站SCRIPT攻擊範例:
根據CERT的資料,動態輸入大致有這幾種形式:URL參數,表格元素,COOKISE以及資料請求。讓我們來分析一下,這個只有兩個頁面的網站,網站名為:MYNICESITE.COM。第一頁使用一張表格或COOKIE來取得使用者名稱:
<%@ 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. >
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 %>
第二頁傳回使用者名稱以示歡迎: <%@
Language=VBScript %>第二頁傳回使用者名稱以示歡迎: <%@ Language=VBScript %
>
User
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>
輸入文字時,一切都很正常。如果你輸入Script程式碼:<SCRIPT>alert('Hello.';</script>,JavaScript警告標籤就會彈出來:
在你下次造訪時,這個警示標籤同樣會出現;這是因為這個Script程式碼在
你第一次造訪的時間後就已經留在
cookie中了。
。
,
想想真是可怕。
,甚者會竊取客戶的信用卡號和密碼。 。
--2000-02>>的雜誌中,CERT警告大家:如果伺服器對客戶的輸入不進行有效驗證,駭客就會輸入一些惡意的HTML程式碼,當這些HTML程式碼輸入是用於SCRIPT程序,他們就能
利用它來進行破壞,如插入一些令人厭惡
的圖片或聲音等,同時,也能幹擾了客戶正確瀏覽網頁。
到20個小的窗口,這些窗口常常伴隨著由JAVA 或JAVASCRIPT產生的失效安鈕,這被稱為滑鼠陷阱。
彈出
。
。 ,駭客的SCRIPT也正在你伺服器裡安全的地方運作著的呀!的形式來自黑客的伺服器。
即使使用了防火牆(SSL)也無法防止跨站SCRIPT的攻擊。那是因為如果產生惡意SCRIPT程式碼的裝置也使用了SSL,我們伺服器的SSL是不能辨別出這些程式碼來的。我們就這樣把客戶曾經那麼信任的網站拱手讓給駭客嗎?而且有這種破壞的存在,會讓你網站名譽盡損的。
一、跨站SCRIPT攻擊範例:
根據CERT的資料,動態輸入大致有這幾種形式:URL參數,表格元素,COOKISE以及資料請求。讓我們來分析一下,這個只有兩個頁面的網站,網站名為:MYNICESITE.COM。第一頁使用一張表格或COOKIE來取得使用者名稱:
<%@ 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
. >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 %>
第二頁傳回使用者名稱以示歡迎: <%@
Language=VBScript %>第二頁傳回使用者名稱以示歡迎: <%@ Language=VBScript %
>
User
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>
輸入文字時,一切都很正常。如果你輸入Script程式碼:<SCRIPT>alert('Hello.';</script>,JavaScript警告標籤就會彈出來:
在你下次造訪時,這個警示標籤同樣會出現;這是因為這個Script程式碼在
你第一次造訪的時間後就已經留在
cookie中了。
。 ,想想真是可怕
。
一、如何避免伺服器受到跨站Script的攻擊
值得慶幸的是,防止跨站Script攻擊的技術正趨於完善。目前可採取這幾種方式來防止跨站Script的攻擊:
1.對動態生成的頁面的字符進行編碼
你們首先要採用的就是對動態生成頁面的字符進行編碼,你必須這樣做,不然黑客很有可能更改你的字元設定而輕易地通過你的防線。如果我們的網站是個英文網站,這樣只要我們把字元編碼設為拉丁字元ISO-8859-1就行了,具體情況如下:
<META http-equiv="Content-Type" content="text/html;charset= ISO-8859-1">
2.過濾和限制所有輸入的資料
這是防止跨站Script的攻擊的第二種方法,在進行登入的時侯,不要讓那些特殊的字元也輸入進去。因此我們可在ONSUBMIT方法中加入JAVASCRIPT程式來完成這個功能。在本例中我們限制最多只能輸入15個字元。這樣可以阻止那些較長的script的輸入。
在<<Knowledge Base Article QA252985>>這本書中微軟提供了一個簡短的Javascript程式來完成輸入資料的篩選。我們也根據具體情況引進了這段程式碼用於我們的範例中,如:
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的參數直接放在郵件中。針對這種情況我們不得不採取更有力的安全措施。如果我們用的ASP,解決起來相對說來就容易得多。只要對動態產生的網頁總進行HTML和URL編碼就行了。針對我們範例中的情況,在第一個輸入頁中我們對redirect URL作瞭如下改動:
strRedirectUrl = strRedirectUrl & _
server.URLEncode(Response.Cookies("userName"))
在執行頁中我們加入:
strUserName =server .HTMLEncode(Request.QueryString("userName"))
和
strUserName =server.HTMLEncode(Request.Form("userName"))
微軟推薦所有動態頁面的輸入和輸出都應進行編碼。甚至在資料庫資料的存入和取出也應如此。這樣你就能大幅避免跨站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(strRedirectU)
Else %>
<HTML>
<HEAD>
<META http-equiv="Content-Type"content="text/html; charset=ISO-8859-1">
<TITLE>MyNiceSite.com Home Page Page 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.S. ();">
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("code(Request.QueryString("userName")) Else Response.Cookies Response.Cookies"Name"Name" =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
攻擊遭到有效的防制。那於那些惡意的標籤和Script被編碼,他們就被以文字的形式顯現了出來,如下圖:
我們也可增加一個IIS元件用於過濾所有從動態輸入中的特殊字元。對於那些已經做好的網站,採用這種方法來防止跨站script的攻擊來得非常容易。我們的這個控制項能攔截來自ASP頁面的REQUEST目標,可對表格,cookie,請求字符串和程式的內容進行偵測:
我們也可以透過寫log檔的方法把統計資料加入這個元件中。每當一個客戶輸入一個非法字元時,這個元件會記下它的IP位址和時間。詳情請見Doug Dean的<<Roll your Own IIS Application on ASPToday>>一文。
我們只需採取一些簡單的步聚就能有效地阻止跨站script的攻擊。除了上述所說的三種方法外,微軟和CERT也強烈建議使用一種他們稱為「sanity check」的方法。例如,假設有個輸入視窗只允許輸入數字,我們就給它做個限定,只允許0-9數字的輸入。微軟和CERT所採用的這種對輸入的字元進行限定的辦法要比單獨的採用過濾特殊字元好得多。採用了這些措施後你就能讓那些參觀你網站的客戶在訪問你網站時受到保護。
二、免於駭客攻擊我們瀏覽器方法:
當你在網路上漫遊的時侯,怎樣來避免受到攻擊呢?微軟和CERT建議不要在網路上胡碰亂撞。針對這種情況,PC雜誌一個欄目的名叫John Dvorack作者作了一個饒有興趣的回答。他認為這是微軟公司一起有預謀的行為:就是用來恐嚇網路衝浪的人到那些安全的網站去瀏覽,如美國線上和MSN.com網站。
在我們所舉的例子中,即使你不在網路上胡亂遊蕩,也不能避免在網路上遭到駭客的攻擊。諷刺的是,大多數的危險都來自於我們最信任的網站。如果要讓網站一定不出問題,你只好不下載任何動態內容或任何cookie。預知詳情請參閱瀏覽器的相關資料。
微軟也警告你們應把瀏覽器的Active Script設定成嚴格限制的狀態並把Email也設成嚴格限制的接收模式。在點擊郵件中的連結時,一定要小心。如需進一步了解情況請參考一本名叫<<Microsoft's Knowledge Base Article Q253117>>的書。為了以防萬一,你最好是多一點上網經驗,並且隨時要小心謹慎。
結論
如果你是以前的UNIX程式開發人員,也許你不會知道跨站script意謂著什麼。你知道許多網站的管理人員登入的使用者名稱和密碼分別為root,root.同樣許多資料庫管理員的名稱和密碼分別為sa,password。你也知道Webzine(如Phrack 和Alt2600),依據他們所提供的方法能讓你一步一步知道某台伺服器的弱點。在這種硬體上,你也知道許多網站的資料庫伺服器和web伺服器都沒有進行自我保護。一但遭遇駭客,機器就得癱瘓。
儘管我們很容易採取防止系統受到駭客的攻擊的措施,但我們的系統是一直暴露在駭客面前的。我們完全有理由相信下一年還會出現一些新的安全漏洞。在CERT公司John Howard先生指導下完成的一篇論文中曾提到:「跟據目前的研究顯示,每個在英特網上具有域名的網站平均一年被黑客至少攻擊一次。」
對伺服器來說那隻怕只是一次這種攻擊也是不能承受的。跨站Script攻擊是駭客可採用的另一種方法。但我們只要進行以上所說的一些簡單的處理就能防止這種形式攻擊的發生。