不久前,Web安全咨詢師George Deglin發(fā)現(xiàn)了一段成功實(shí)施了攻擊的跨站腳本(XSS)代碼,這段代碼利用了Facebook頗有爭議的即時(shí)個(gè)性化功能。該代碼在Facebook所選中的測試即時(shí)個(gè)性化的3個(gè)網(wǎng)站之一——Yelp上運(yùn)行。運(yùn)行該代碼段,Deglin不僅獲得了與Yelp共享的Facebook上的個(gè)人檔案信息,而且還截獲了發(fā)送檔案給Facebook好友的郵箱地址,這無論對于市場銷售人員還是垃圾郵件發(fā)送者來說都是一座潛在的金礦。
就在Deglin發(fā)現(xiàn)的XSS漏洞被修補(bǔ)上之后沒多久,另一個(gè)XSS漏洞又在Yelp上出現(xiàn),搞得Facebook只好將該網(wǎng)站的即時(shí)個(gè)性化程序暫時(shí)掛起來。
XSS攻擊并不新鮮,但是隨著社交媒體的興起,又給了此類攻擊一片新的用武之地。
最常見的XSS攻擊方法就是利用郵件:犯罪分子在一個(gè)普通的URL網(wǎng)址中添加一些特殊字符,例如添加幾個(gè)外文字符。這些字符會(huì)適時(shí)地告知運(yùn)行事先制作好的腳本的 Web服務(wù)器,舉例來說,一個(gè)攻擊者給你的網(wǎng)上銀行的網(wǎng)址中添加了這樣一個(gè)腳本,然后發(fā)郵件給你。假如你相信這是來自你的網(wǎng)上銀行的合法郵件,然后點(diǎn)擊了郵件提供的鏈接地址,那么你的瀏覽器就會(huì)給那臺(tái)Web服務(wù)器發(fā)送該腳本,這臺(tái)服務(wù)器上所運(yùn)行的惡意代碼就會(huì)截獲你的瀏覽器cookies和你的銀行登錄信息,轉(zhuǎn)發(fā)給攻擊者,后者便可登錄進(jìn)你的網(wǎng)上銀行賬號(hào)。
另一類XSS攻擊會(huì)將惡意代碼存放在一臺(tái)Web服務(wù)器上。攻擊者登錄比如說一家電子商務(wù)網(wǎng)站,然后發(fā)送一條含有XSS跨站腳本的消息。數(shù)天之后,如果你登錄了這家電子商務(wù)網(wǎng)站,閱讀了這條不良消息,就會(huì)和前一類一樣,該腳本盜取你的cookies和登錄信息,并將其轉(zhuǎn)發(fā)給犯罪分子,而他便可以冒充你了。
第三類XSS攻擊是針對Web瀏覽器的。在這種情形中,攻擊者會(huì)在你所訪問的網(wǎng)站上放置一個(gè)帶毒的Flash文件。當(dāng)你的瀏覽器下載這段Flash視頻的時(shí)候,該文件便會(huì)觸發(fā)一個(gè)跨站腳本,攻擊者便可掌控你的瀏覽器所瀏覽過的頁面元素。
今天的很多網(wǎng)站在過濾常見的XSS供給方面都要比過去做得好。假設(shè)你點(diǎn)擊了A網(wǎng)站上的一個(gè)廣告。但是你不知道的是,該廣告含有一個(gè)跨站腳本,可以悄悄地將你的瀏覽器定向到B網(wǎng)站,比如一家旅游網(wǎng)站和社交網(wǎng)站彼此合作,那么前者便可通過你的點(diǎn)擊而輕松獲得你的社交網(wǎng)絡(luò)檔案。利用XSS攻擊,你就成了一個(gè)犧牲品,你甚至不必去訪問B網(wǎng)站,登錄B網(wǎng)站,點(diǎn)擊它上面的任何東西,你甚至可能都不知道B網(wǎng)站的存在。由于B網(wǎng)站已經(jīng)截獲了你的社交網(wǎng)絡(luò)檔案(可能還有你的好友們的檔案),于是犯罪分子便可以躲藏在A網(wǎng)站的廣告后面,大搖大擺地截獲你的信息了。這就是Web 2.0的聚合功能帶來的麻煩,也就是Facebook-Yelp的合作為什么會(huì)出現(xiàn)XSS攻擊的原因。
自我保護(hù)
遺憾的是,網(wǎng)站還無法通過連接加密簡單地防范XSS攻擊。有SSL連接的網(wǎng)站,也就是你在瀏覽一個(gè)加密網(wǎng)站時(shí)在工具欄上會(huì)出現(xiàn)一個(gè)小掛鎖的網(wǎng)站,也只不過是對攻擊進(jìn)行了加密而已。一般來說,網(wǎng)站設(shè)計(jì)人員必須鎖定他們的網(wǎng)站才能防止XSS攻擊。
不過用戶也有兩種方法可避免XSS攻擊。其一是忽略一個(gè)網(wǎng)站到另一個(gè)網(wǎng)站的鏈接:比如說,如果A網(wǎng)站鏈接到somerandomsite.com/page,那么你如果先要上這個(gè)網(wǎng)站,最好不要去直接點(diǎn)擊該鏈接,而是通過搜索功能去查找該網(wǎng)站。這種方法可有效防止嵌入在鏈接網(wǎng)址中的XSS攻擊,但是這種方法用起來不太方便,而且當(dāng)兩個(gè)網(wǎng)站共享內(nèi)容時(shí)就沒辦法用了。另外一種方法是在你的瀏覽器中禁用像JavaScript腳本語言。即便因此可能會(huì)讓一些網(wǎng)站上的一些很不錯(cuò)的功能沒法使用,只要你還能夠容忍就行。
IE8是第一款內(nèi)置了XSS腳本攔截保護(hù)的瀏覽器。谷歌的Chrome也會(huì)緊隨其后推出類似功能。這兩款瀏覽器都會(huì)首先查看來自某個(gè)Web服務(wù)器的腳本是否是惡意的——如果是,就攔截它。在之前的黑帽歐洲2010大會(huì)上,研究專家David Lindsay和Eduardo Vela Nava卻演示了一種可以破除這種攔截的辦法,不過谷歌已經(jīng)修復(fù)了Chrome中的這個(gè)漏洞。微軟則在第2年1月(發(fā)布補(bǔ)丁 MS10-002)和 3月(發(fā)布MS10-018)也已解決了大部分問題,并計(jì)劃在6月修復(fù)第3個(gè)漏洞,所以在你讀到這篇文章的時(shí)候,破除XSS腳本攔截的問題可能已經(jīng)完全解決了。
Firefox的用戶則可以利用免費(fèi)的NoScrpit附加組件有選擇地?cái)r截腳本。比如說,你可以放行一段Flash視頻,而同時(shí)攔截該網(wǎng)站上的其他腳本組件。IE和Chrome在攔截可疑腳本方面沒有這么細(xì)的粒度——它們是要么全攔截,要么全不攔截。
NoScrpit也有一個(gè)問題,那就是大多數(shù)用戶并不喜歡放行個(gè)別腳本的做法,因?yàn)檫@樣會(huì)帶來不便。不過攔截和放行今后可能會(huì)成為你的第二天性。你還可以對某個(gè)特定網(wǎng)站上的所有腳本進(jìn)行認(rèn)證,無論是為了一次性訪問還是今后的所有訪問,這樣的認(rèn)證如今在IE 8和chrome中也可以做了。