讀古今文學網 > 編寫高質量代碼:改善JavaScript程序的188個建議 > 建議149:警惕基於DOM的跨域侵入 >

建議149:警惕基於DOM的跨域侵入

隨著Web 2.0的發展及Ajax框架的普及,富客戶端Web應用(Rich Internet Application,RIA)日益增多,越來越多的邏輯已經開始從服務器端轉移至客戶端,這些邏輯通常都是使用JavaScript語言編寫的。但遺憾的是,目前開發人員普遍不太關注JavaScript代碼的安全性。據IBM X-Force 2011年中期趨勢報告揭示,在世界500強的網站及常見知名網站中有40%存在JavaScript安全漏洞。

客戶端JavaScript安全漏洞與服務器端安全漏洞原理略為不同,自動化檢測JavsScript安全漏洞目前存在較大的技術難題,不過利用IBM Rational AppScan Standard Edition V8.0新特性(JavaScript Security Analyzer,JSA)技術來自動檢測JavaScript安全漏洞還是一個不錯的選擇。

2010年12月,IBM公司發佈了關於Web應用中客戶端JavaScript安全漏洞的白皮書,其中介紹了IBM安全研究機構曾做過的JavaScript安全狀況調查。調查中,樣本數據包括675家網站,其中有財富500強公司的網站以及另外175家著名網站,包括IT公司、Web應用安全服務公司、社交網站等。為了不影響這些網站的正常運行,研究人員使用了非侵入式爬蟲,僅掃瞄了無須登錄即可訪問的部分頁面,每個站點被掃瞄的頁面不超過200個,這些頁面都被保存下來。研究人員採用IBM公司的JavaScript安全分析技術離線分析了這些頁面,集中分析了基於DOM的跨域腳本編製及重定向兩種漏洞。

測試結果令人吃驚,這些知名網站中有14%存在嚴峻的JavaScript安全問題,黑客可以利用這些漏洞植入流氓軟件、植入釣魚站點,以及劫持用戶會話等。更令人吃驚的是,隨著IBM公司的JavaScript安全分析技術的不斷發展,IBM公司重新測試了上述這些知名網站,2011年中期的X-Force報告顯示發現了更多的安全漏洞,大約有40%的網站存在JavaScript安全漏洞。

1.基於DOM的跨域腳本編製

XSS(Cross Site Script,跨域腳本編製,也稱為跨站腳本攻擊)就是表示攻擊者向合法的Web頁面中插入惡意腳本代碼(通常是HTML代碼和JavaScript代碼),然後提交請求給服務器,隨即向服務器響應頁面植入攻擊者的惡意腳本代碼,攻擊者可以利用這些惡意腳本代碼進行會話劫持等攻擊。

跨域腳本編製通常分為反射型和持久型,下面進行簡單說明。

❑反射型:請求數據在服務器響應頁面中呈現為未編碼和未過濾。

❑持久型:包含惡意代碼的請求數據被保存在Web應用的服務器上,每次用戶訪問某個頁面時惡意代碼都會被自動執行。這種攻擊對於Web 2.0類型的社交網站來說尤為常見,威脅也更大。

應對跨域腳本編製的主要方法有兩個:

❑不要信任用戶的任何輸入,盡量採用白名單技術來驗證輸入參數。

❑輸出的時候對用戶提供的內容進行轉義處理。

鮮為人知的是,還有第三種跨域腳本編製漏洞。2005年,Amit Klein發表了白皮書「基於DOM的跨域腳本編製——第三類跨域腳本編製形式」(DOM Based Cross Site Scripting or XSS of the Third Kind),其中揭示了基於DOM的跨域腳本編製不需要依賴服務器端響應的內容。如果某些HTML頁面使用了document.location、document.URL或者document.referer等DOM元素的屬性,那麼攻擊者可以利用這些屬性植入惡意腳本實施基於DOM的跨域腳本編製攻擊。

存在DOM based XSS的HTML代碼如下:


<HTML>

<TITLE>Welcome!</TITLE>

Hi

<SCRIPT>

var pos=document.URL.indexOf(\"name=\")+5;

document.write(document.URL.substring(pos,document.URL.length));

</SCRIPT>

<BR>

Welcome to our system

</HTML>


按照該頁面JavaScript代碼的邏輯,上面代碼接受URL中傳入的name參數並展示歡迎信息。正常情況下的訪問URL如下:


http://www.mysite/welcome.html?name=Jeremy


如果惡意攻擊者輸入類似如下的腳本,那麼該頁面會執行被注入的JavaScript腳本。


http://www.mysite/welcome.html?name=<script>alert(document.cookie)</script>


很明顯,當受害者的瀏覽器訪問以上URL時,服務器端會像在正常情況下一樣返回HTML頁面,然後瀏覽器會繼續將這個HTML解析成DOM,DOM中包含document對象的URL屬性將包含<script>alert(document.cookie)</script>注入的腳本內容,當瀏覽器解析到JavaScript時會執行這段被注入的腳本,導致跨站點腳本編製攻擊成功實施。

值得關注的是,通過以上示例可以看出,惡意代碼不必要嵌入服務器的響應中,基於DOM的跨站點腳本編製攻擊也能成功實施。

可能部分讀者會認為:目前主流瀏覽器會自動轉義URL中的「<」和「>」符號,轉義後的注入腳本就不會被執行了,基於DOM的跨站點腳本編製也就不再有什麼威脅了。這句話前一半是對的,後一半就不準確了,因為攻擊者可以很輕鬆地繞過瀏覽器對URL的轉義。例如,攻擊者可以利用錨點「#」來欺騙瀏覽器,瀏覽器會認為「#」後面的都是片段信息,將不做任何處理。


http://www.mysite/welcome.html#?name=<script>alert(document.cookie)</script>


2.通過URL重定向釣魚

網絡釣魚是一個通稱,它表示通過欺騙的手段竊取用戶私人信息。通過URL重定向釣魚指的是Web頁面採用HTTP參數來保存URL值,並且Web頁面的腳本會將請求重定向到該保存的URL上,攻擊者可以將HTTP參數中的URL值改為指向惡意站點,從而順利啟用網絡釣魚來欺騙當前用戶並竊取用戶憑證。

下面代碼給出了較為常見的含有通過URL重定向釣魚漏洞的行為方式。


<SCRIPT>

var sData=document.location.search.substring(1);

var sPos=sData.indexOf(\"url=\")+4;

var ePos=sData.indexOf(\"&\",sPos);

var newURL;

if(ePos<0){

newURL=sData.substring(sPos);

}else{

newURL=sData.substring(sPos,ePos);

}

window.location.href=newURL;

</SCRIPT>


可以看出,這些JavaScript腳本負責執行重定向,新地址是從document.location、document.URL或document.referer等DOM元素的屬性值中截取出來的。例如,類似下面的執行重定向的URL:


http://www.vulnerable.site/redirect.html?url=http://www.phishing.site


顯然,一旦執行了上面的URL,將重定向到釣魚網站。這個漏洞的原理很簡單,比服務器端的重定向漏洞更好理解。但在通過URL重定向釣魚的情況下,釣魚站點的網址並不會被服務端攔截和過濾,因此,這個漏洞往往比服務器端重定向漏洞更具有隱蔽性。

3.客戶端JavaScript Cookie引用

Cookie通常由Web服務器創建並存儲在客戶端瀏覽器中,用來在客戶端保存用戶的身份標識、Session信息,甚至授權信息等。客戶端JavaScript代碼可以操作Cookie數據。如果在客戶端使用JavaScript創建或修改站點的cookie,那麼攻擊者就可以查看到這些代碼。通過閱讀代碼瞭解其邏輯,甚至可以根據自己所瞭解的知識來修改cookie。一旦cookie包含了很重要的信息,如包含了權限信息等,攻擊者很容易利用這些漏洞進行特權升級等攻擊。

4.JavaScript劫持

利用JSON作為Ajax的數據傳輸機制的Web應用程序通常都容易受到JavaScript劫持攻擊,傳統的Web應用程序反而不易受攻擊。

JSON實際上就是一段JavaScript,通常是數組格式。攻擊者在其惡意站點的頁面中通過<SCRIPT>標籤調用被攻擊站點的一個JSON動態數據接口,並通過JavaScript Function Hook等技術取得這些JSON數據。如果用戶在登錄被攻擊網站後(假定其身份認證信息是基於Session Cookie來保存的)又被攻擊者誘引訪問了惡意站點頁面,那麼,惡意站點會發送JSON數據獲取請求至被攻擊站點,被攻擊站點服務器會認為當前請求是合法的,並向惡意站點返回當前用戶的相關JSON數據,從而導致用戶數據洩密,這是因為<SCRIPTsrc=\">這種標籤的請求會帶上Cookie信息。整個過程相當於一個站外類型的跨站點請求偽造(CSRF)攻擊。

隨著Ajax的進一步推廣,以及HTML 5的逐步應用,還會有更多的客戶端安全漏洞出現。目前對於JavaScript的安全研究尚不多,新推出的HTML 5客戶端存儲、跨域通信等新特型也都跟安全緊密相關,有興趣的讀者可以進一步研究。