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