跨站Script攻擊和防範

Kiver 发布于2004-2-13 10:34 958 次浏览 3 位用户参与讨论   [复制分享主题]
[Money=900]<SPAN class=bold><SPAN class=smalltxt><b><FONT size=2>跨站Script攻擊和防範<BR><BR></FONT></b></SPAN></SPAN>第一部分:跨站Script攻擊<BR>每當我們想到黑客的時候,黑客往往是這樣一幅畫像:一個孤獨的人,悄悄進入別人的伺服器中,進行破壞或者竊取別人的秘密資料。也許他會更改我們的主頁,甚者會竊<BR>取客戶的信用卡號和密碼。另外,黑客還會攻擊訪問我們網站的客戶。與此同時,我們的伺服器也成了他的幫兇。微軟稱這種攻擊為“跨站script”攻擊。而這種攻擊大多<BR>數都發生在網站動態產生網頁的時侯,但黑客的目標並不是你的網站,而是流覽網站的客戶。<BR>跨站script攻擊的說明<BR>  在一本名為&lt;&lt;ADVISORY CA--2000-02&gt;&gt;的雜誌中,CERT警告大家:如果伺服器對客戶的輸入不進行有效驗證,黑客就會輸入一些惡意的HTML代碼,當這些HTML代碼輸<BR>入是用於SCRIPT程式,他們就能利用它來進行破壞,如插入一些令人厭惡的圖片或聲音等,同時,也能干擾了客戶正確流覽網頁。<BR>  我們知道,有些朋友曾經被誘導到一些可疑的免費網站,他們得到的僅僅是10到20個小的視窗,這些視窗常常伴隨著由JAVA 或 JAVASCRIPT生成的失效安鈕,這被稱<BR>為滑鼠陷阱。關閉這些視窗是徒勞的,每當我們關閉一個視窗,又會有10幾個視窗彈出。這種情況常常發生在管理員沒在的時侯發生。滑鼠事件是黑客利用跨站SCRIPT方法<BR>攻客戶的典型範例。<BR>  惡意的標籤和SCRIPT不單純的惡作劇,他們甚至可以竊取資料和搗毀系統。一個聰明的甚至是不夠聰明的黑客都能夠使用SCRIPT干擾或者改變伺服器資料的輸入。利用<BR>SCRIPT代碼也能攻擊客戶系統,讓你的硬碟盡損。而且你要知道,在你一邊使用伺服器的時候,黑客的SCRIPT也正在你伺服器裏安全的地方運行著的呀!如果客戶對你的服<BR>務器非常信認,同樣他們也會信任那些惡意的SCRIPT代碼。甚至這個代碼是以〈SCRIPT〉或者〈OBJECT〉的形式來自黑客的伺服器。<BR>  即使使用了防火牆(SSL)也不能防止跨站SCRIPT的攻擊。那是因為如果生成惡意SCRIPT代碼的設備也使用了SSL,我們伺服器的SSL是不能辨別出這些代碼來的。我們<BR>難道就這樣把客戶曾經那麼信任的網站拱手讓給黑客嗎?而且有這種破壞的存在,會讓你網站名譽盡損的。<BR><BR>一、跨站SCRIPT攻擊示例:<BR>  根據CERT的資料,動態輸入大致有這幾種形式:URL參數,表格元素,COOKISE以及資料請求。讓我們來分析一下,這個只有兩個頁面的網站,網站名為:<BR>MYNICESITE.COM。第一頁使用一張表格或COOKIE來獲取用戶名:<BR>&lt;%@ Language=VBScript %&gt;<BR>&lt;% If Request.Cookies("userName") &lt;&gt; "" Then<BR>Dim strRedirectUrl<BR>strRedirectUrl = "page2.asp?userName="<BR>strRedirectUrl = strRedirectUrl &amp; Response.Cookies("userName")<BR>Response.Redirect(strRedirectUrl)<BR>Else %&gt;<BR>&lt;HTML&gt;<BR>&lt;HEAD&gt;<BR>&lt;TITLE&gt;MyNiceSite.com Home Page&lt;/TITLE&gt;<BR>&lt;/HEAD&gt;<BR>&lt;BODY&gt;<BR>&lt;H2&gt;MyNiceSite.com&lt;/H2&gt;<BR>&lt;FORM method="post" action="page2.asp"&gt;<BR>Enter your MyNiceSite.com username:<BR>&lt;INPUT type="text" name="userName"&gt;<BR>&lt;INPUT type="submit" name="submit" value="submit"&gt;<BR>&lt;/FORM&gt;<BR>&lt;/BODY&gt;<BR>&lt;/HTML&gt;<BR>&lt;% End If %&gt;<BR>第二頁返回用戶名以示歡迎:<BR>&lt;%@ Language=VBScript %&gt;<BR>&lt;% Dim strUserName<BR>If Request.QueryString("userName")&lt;&gt; "" Then<BR>strUserName = Request.QueryString("userName")<BR>Else<BR>Response.Cookies("userName") = Request.Form("userName")<BR>strUserName = Request.Form("userName")<BR>End If %&gt;<BR>&lt;HTML&gt;<BR>&lt;HEAD&gt;&lt;/HEAD&gt;<BR>&lt;BODY&gt;<BR>&lt;H3 align="center"&gt;Hello: &lt;%= strUserName %&gt; &lt;/H3&gt;<BR>&lt;/BODY&gt;<BR>&lt;/HTML&gt;<BR>  當你正常常輸入文字時,一切都很正常。如果你輸入Script代碼:&lt;SCRIPT&gt;alert('Hello.';&lt;/script&gt;,JavaScript警告標籤就會彈出來:<BR>  在你下一次訪問時,這個警示標籤同樣會出現;這是因為這個Script代碼在你第一次訪問的時後就已經留在cookie中了。這是一個簡單的跨站攻擊的範例。<BR>  如果你認為這是一個特殊情況,你也不妨到網上別的地方看看,親自試一下。我曾經對一些大型的政府網站、教育網站以及商業網站進行過測試,他們當中的確有部分<BR>出現了以上所說的情況,我甚至發現了我經常使用信用卡的網站也居然對輸入不進行任何過濾,想想真是可怕。<BR><BR>二、 用E-Mail進行跨站Script攻擊<BR>  跨站script攻擊用在列表伺服器,usenet伺服器和郵件伺服器來得特別容易。下麵還是以MyNiceSite.com網站為例進行說明。由於你經常流覽這個網站,它的內容也<BR>的確讓你愛不愛不釋手,因此在不知不覺中你就把流覽器的改成了總是信任這個動態網站內容的設置。<BR>  MyNiceSite.com網站總是通過出售征訂它們Email信件的郵箱地址來獲得收入,這的確是一種不太好的辦法。於是我買了它的一份郵箱位址。併發了大量的郵件給你們<BR>。在信中我告訴你們儘快訪問這個網 站,並檢查你們帳戶使用的最新情況。為了讓你們感到方便,我在這信中也作了鏈結。我在這鏈結URL中的username參數中舔加了<BR>script代碼。有些客戶在不知不覺中就點擊了這個鏈結,也就是說上了我的當(如圖),同時我也從中得到了好處:<BR>  它是這樣工作的,當你點擊這個鏈結的時後,在鏈結裏的script代碼就會引導你所用流覽器去下載我的JavaScript程式並執行它。我的Script檢查到你使用的是IE瀏<BR>覽器後,就著手下載ActiceX控制項 particularlyNasty.dll。因為之前你已經把這個網站的內容認為總是安全的,這樣,我的script代碼和Active 控制項就能在你機器上<BR>自由自在的運行了。<BR>[/Money]

已有(3)人评论

Kiver 发表于 2004-2-13 10:35:18 | 显示全部楼层
三、 Activex攻擊說明<BR>  在討論ActiveX時,CERT和微軟都沒提到跨站script方法所帶來的的危險。W3C在&lt;&lt;安全常見問題解答&gt;&gt;中對ActiveX的安全問題作了比較詳盡的說明。Java applet<BR>對系統的控制受到嚴格限制。SUN開發它時就規定,只有那些對系統的安全不構成威脅的操作才被允許運行。<BR>  在另一方面,ActiveX對系統的操作就沒有嚴格地被限制。如果一但被下載,就可以象安裝的可執行程式一樣做他們想幹的事情。針對這一特點IE流覽器也作了某些限<BR>制,如對於那些不安全的站點,在它的默認設置中就會不允許你進行下載或者會給你警告的提示。正在基於ActiveX進行開發的公司,如VeriSign公司,它們對ActiveX控<BR>件都給編了號。當你在下載控制項的時後,IE流覽器會給你警告並顯示它的可信籟程度。由用戶決定是否相信這個控制項。這樣一來系統的安全性就增加了。<BR>  但是,對於那些沒有多少經驗的用戶來說,他們往往不自覺地對原來的設置進行了修改,讓這些控制項在沒有任何提示的情況下就下載了。另外,對一個新手來說,即使<BR>在有提示的情況下也會不加思索地下載那些沒作任何標記的控制項。在我們所舉的例子中,由於你對該站點的信任,改了流覽器的設置,這樣,ActiveX控制項在不經過任何提<BR>示的情況下就下載,並在你的機器上不知不覺地開始運行。<BR><BR>四、16進制編碼的ActiveX Script 攻擊<BR>  要把用心不良的標籤和script區分出來是一件非常困難的事。Script還可以16進制的形式把自己藏起來。讓我們看看下面這個E-mail範例好嗎?它是以16進制的形式<BR>被發送出去的:<BR>  這幾乎是一封完整的郵件,裏面包含了以16進制偽造的URL參數:sender=mynicesite.com。當用戶點擊鏈結時,用戶的流覽器就會直接開始第一例所說的處理過程而<BR>彈出警告窗口。<BR><BR><BR>第二部分:跨站Script攻擊的防犯<BR>一、如何避免伺服器受到跨站Script的攻擊<BR>  值得慶倖的是,防止跨站Script攻擊的技術正趨於完善。目前可採取這幾種方式來防止跨站Script的攻擊:<BR>1.對動態生成的頁面的字元進行編碼<BR>2.對輸入進行過濾和限制<BR>3.使用HTML和URL編碼<BR>1.對動態生成的頁面的字元進行編碼<BR>  你們首先要採用的就是對動態生成頁面的字元進行編碼,你必須這樣做,不然黑客很有可能更改你的字元設置而輕易地通過你的防線。如果我們的網站是個英語網站,<BR>這樣只要我們把字元編碼設成拉丁字元ISO-8859-1就行了,具體情況如下:<BR>&lt;META http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"&gt;<BR>2.過濾和限制所有輸入的資料<BR>  這是防止跨站Script的攻擊的第二種方法,在進行登錄的時侯,不要讓那些特殊的字元也輸入進去。因此我們可在ONSUBMIT方法中加入JAVASCRIPT程式來完成這個功\<BR>能。在本例中我們限制最多只能輸入15個字元。這樣可以阻止那些較長的script的輸入。<BR>  在&lt;&lt;Knowledge Base Article QA252985&gt;&gt;這本書中微軟提供了一個簡短的Javascript程式來完成對輸入資料的過濾。我們也根據具體情況引進了這段代碼用於我們<BR>的例子中,如:<BR>
Kiver 发表于 2004-2-13 10:36:18 | 显示全部楼层
<BR>[Point=80]function checkForm() {<BR>document.forms[0].userName.value = _<BR>RemoveBad(document.forms[0].userName.value);<BR>return true;<BR>}<BR>// MICROSOFT'S CODE<BR>function RemoveBad(strTemp) {<BR>strTemp = strTemp.replace(/\&lt;/\&gt;/\"/\'/\%/\;/\(/\)/\&amp;/\+/\-/g,"");<BR>return strTemp;<BR>}<BR>用這個辦法,可以過濾在輸入中含有的這些字元:<BR>% &lt; &gt; [ ] { } ; &amp; + - " '( )<BR>3.使用HTML和URL編碼<BR>  儘管使用上面所說的過濾和限制輸入的辦法是一種非常重要用防禦手段,但它對我的這種採用郵件方式的攻擊還是無能為力。因為我把URL的參數直接放在郵件中。針<BR>對這種情況我們不得不採取一種更有力的安全措施。如果我們用的ASP,解決起來相對說來要容易得多。只要對動態生成的網頁總進行HTML和URL編碼就行了。針對我們例子<BR>中的情況,在第一輸入頁中我們對redirect URL作了如下改動:<BR>strRedirectUrl = strRedirectUrl &amp; _<BR>server.URLEncode(Response.Cookies("userName"))<BR>在執行頁中我們加入:<BR>strUserName =server.HTMLEncode(Request.QueryString("userName"))<BR>和<BR>strUserName =server.HTMLEncode(Request.Form("userName"))<BR>  微軟推薦對所有動態頁面的輸入和輸出都應進行編碼。甚至在對資料庫資料的存入和取出也應如此。這樣你就能在很大程度上避免跨站script的攻擊。<BR>要做到這些還要在Page1.asp中加入:<BR>&lt;%@ Language=VBScript %&gt;<BR>&lt;% If Request.Cookies("userName") &lt;&gt; "" Then<BR>'redirect if detect the cookie<BR>Dim strRedirectUrl<BR>strRedirectUrl = "page2.asp?userName="<BR>strRedirectUrl = strRedirectUrl &amp; _<BR>server.URLEncode(Request.Cookies("userName"))<BR>Response.Redirect(strRedirectUrl)<BR>Else %&gt;<BR>&lt;HTML&gt;<BR>&lt;HEAD&gt;<BR>&lt;META http-equiv="Content-Type"content="text/html; charset=ISO-8859-1"&gt;<BR>&lt;TITLE&gt;MyNiceSite.com Home Page&lt;/TITLE&gt;<BR>&lt;/HEAD&gt;<BR>&lt;SCRIPT LANGUAGE="javascript"&gt;<BR>&lt;!--<BR>function checkForm() {<BR>document.forms[0].userName.value =<BR>RemoveBad(document.forms[0].userName.value);<BR>return true;<BR>}<BR>//******************************************************<BR>//Programmer: NOT ORIGINAL CODE - COMES FROM MICROSOFT<BR>//Code Source: Microsoft Knowledge Base Article Q25z985<BR>//Description: Removes bad characters.<BR>//******************************************************<BR>function RemoveBad(strTemp) {<BR>strTemp =strTemp.replace(/\&lt;/\&gt;/\"/\'/\%/\;/\(/\)/\&amp;/\+/\-/g, "");<BR>return strTemp;<BR>}<BR>//--&gt;<BR>&lt;/SCRIPT&gt;<BR>&lt;BODY&gt;<BR>&lt;BR&gt;<BR>&lt;H2&gt;MyNiceSite.com&lt;/H2&gt;<BR>&lt;BR&gt;<BR>&lt;FORM method="post"action="page2.asp" onsubmit="return checkForm();"&gt;<BR>Enter your MyNiceSite.com username:<BR>&lt;INPUT type="text"name="userName" width="10" maxwidth="10"&gt;<BR>&lt;INPUT type="submit"name="submit" value="submit"&gt;<BR>&lt;/FORM&gt;<BR>&lt;/BODY&gt;<BR>&lt;/HTML&gt;<BR>&lt;% end if %&gt;<BR>Page2.asp中加如:<BR>&lt;%@ Language=VBScript %&gt;<BR>&lt;% Dim strUserName<BR>If Request.QueryString("userName")&lt;&gt;"" Then<BR>strUserName =server.HTMLEncode(Request.QueryString("userName"))<BR>Else<BR>Response.Cookies("userName") =Request.Form("userName")<BR>strUserName = server.HTMLEncode(Request.Form("userName"))<BR>End If %&gt;<BR>&lt;HTML&gt;<BR>&lt;HEAD&gt;<BR>&lt;META http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"&gt;<BR>&lt;/HEAD&gt;<BR>&lt;BODY&gt;<BR>&lt;H3 align="center"&gt;Hello: &lt;%= strUserName %&gt;&lt;/H3&gt;<BR>&lt;/BODY&gt;<BR>&lt;/HTML&gt;<BR>  現在由於這種攻擊遭到有效的防制。那於那些惡意的標籤和Script被編碼,他們就被以文字的形式顯現了出來,如下圖:<BR>  我們也可增加一個IIS元件用於過濾所有從動態輸入中的特殊字元。對於那些已經做好的網站,採用這種辦法來防止跨站script的攻擊來得非常容易。我們的這個控制項<BR>能攔截來自ASP頁面的REQUEST目標,可對表格,cookie,請求字串和程式的內容進行檢測:<BR>  我們也可以通過編寫log檔的方法把統計資料加入這個元件中。每當一個客戶輸入一個非法字元時,這個元件會記下它的IP位址和時間。詳情請見Doug Dean的<BR>&lt;&lt;Roll your Own IIS Application on ASPToday&gt;&gt;一文。<BR>  我們只需採取一些簡單的步聚就能有效地阻止跨站script的攻擊。除了以上所說的三種方法外,微軟和CERT還強烈推薦使用一種他們稱之為“sanity check”的方法<BR>。例如,假設有個輸入視窗只允許輸入數位,我們就給它做個限定,只允許\0-9數位的輸入。微軟和CERT所採用的這種對輸入的字元進行限定的辦法要比單獨的採用過濾特<BR>殊字元要好得多。採用了這些措施後你就能讓那些參觀你網站的客戶在訪問你網站時受到保護。<BR>二、免受黑客攻擊我們流覽器方法:<BR>  當你在網上漫遊的時侯,怎樣來避免受到攻擊呢?微軟和CERT建議不要在網上胡碰亂撞。針對這種情況,PC雜誌一個欄目的名叫John Dvorack作者作了一個饒有興趣<BR>的回答。他認為這是微軟公司一起有預謀的行為:就是用來恐嚇網上衝浪的人到那些安全的站點去流覽,如美國線上和MSN.com網站。<BR>  在我們所舉的例子中,即使你不在網上胡亂遊蕩,也不能避免在網上遭到黑客的襲擊。具有諷刺意義的是,大多數的危險都來自于我們最信任的網站。如果要讓網站一<BR>定不出問題,你只好不下載任何動態內容或者任何cookie。預知詳情請參閱流覽器的相關資料。<BR>  微軟也警告你們應把流覽器的Active Script設置成嚴格限制的狀態並把Email也設成嚴格限制的接收模式。在點擊郵件中的鏈結時,一定要小心。如需進一步瞭解情<BR>況請參閱一本名叫&lt;&lt;Microsoft's Knowledge Base Article Q253117&gt;&gt;的書。為了以防萬一,你最好是多一點上網經驗,並且時刻要小心謹慎。<BR>結論<BR>  如果你是以前的UNIX程式開發人員,你也許不會知道跨站script意謂著什麼。你知道許多站點的管理人員登錄的用戶名和密碼分別為root,root.同樣許多資料庫管理<BR>員的名稱和密碼分別為sa,password。你也知道Webzine(如Phrack 和 Alt2600),依據他們所提供的方法能讓你一步步地知道某台伺服器的弱點。在這種硬體上,你也知<BR>道許多網站的資料庫伺服器和web伺服器都沒有進行自我保護。一但遭遇黑客,機器就得癱瘓。<BR>  儘管我們很容易採取防止系統受到黑客的攻擊的措施,但我們的系統是一直暴露在黑客面前的。我們完全有理由相信下一年還會出現一些新的安全漏洞。在CERT公司<BR>John Howard先生指導下完成的一篇論文中曾提到:“跟據目前的研究顯示,每個在英特網上具有功能變數名稱的網站平均一年被黑客至少攻擊一次。”<BR>  對伺服器來說那怕只是一次這種攻擊也是不能承受的。跨站Script攻擊是黑客可採用的另一種方法。但我們只要進行以上所說的一些簡單的處理就能防止這種形式攻擊<BR>的發生。<BR>[/Point]
ufree 发表于 2004-11-10 05:25:02 | 显示全部楼层
那么恐怖啊
您需要登录后才可以回帖 登录 | 註冊

本版积分规则

快速
回复
返回
列表
返回
顶部