新聞中心
前言

隨著 Web2.0 的發(fā)展以及 Ajax 框架的普及,富客戶端 Web 應(yīng)用(Rich Internet Applications,RIA)日益增多,越來(lái)越多的邏輯已經(jīng)開(kāi)始從服務(wù)器端轉(zhuǎn)移至客戶端,這些邏輯通常都是使用 JavaScript 語(yǔ)言所編寫(xiě)。但遺憾的是,目前開(kāi)發(fā)人員普遍不太關(guān)注 JavaScript 代碼的安全性。據(jù) IBM X-Force 2011 年中期趨勢(shì)報(bào)告揭示,世界五百?gòu)?qiáng)的網(wǎng)站及常見(jiàn)知名網(wǎng)站中有 40% 存在 JavaScript 安全漏洞。本文將結(jié)合代碼向讀者展示常見(jiàn) JavaScript 安全漏洞,旨在幫助讀者能夠在日常編碼工作中規(guī)避這些安全漏洞。此外,客戶端 JavaScript 安全漏洞與服務(wù)器端安全漏洞原理略為不同,自動(dòng)化檢測(cè) JavsScript 安全漏洞目前存在較大的技術(shù)難題,本文將結(jié)合案例跟讀者分享如何利用 IBM Rational AppScan Standard Edition V8.0 新特性(JavaScript Security Analyzer,JSA)技術(shù)自動(dòng)化檢測(cè) JavaScript 安全漏洞。
JavaScript 常見(jiàn)安全漏洞
2010 年 12 月份,IBM 發(fā)布了關(guān)于 Web 應(yīng)用中客戶端 JavaScript 安全漏洞的白皮書(shū),其中介紹了 IBM 安全研究機(jī)構(gòu)曾做過(guò)的 JavaScript 安全狀況調(diào)查。樣本數(shù)據(jù)包括了 675 家網(wǎng)站,其中有財(cái)富 500 強(qiáng)公司的網(wǎng)站和另外 175 家著名網(wǎng)站,包括 IT 公司、Web 應(yīng)用安全服務(wù)公司、社交網(wǎng)站等。為了不影響這些網(wǎng)站的正常運(yùn)行,研究人員使用了非侵入式爬蟲(chóng),僅掃描了無(wú)需登錄即可訪問(wèn)的部分頁(yè)面,每個(gè)站點(diǎn)不超過(guò) 200 個(gè)頁(yè)面。這些頁(yè)面都被保存下來(lái),研究人員采用 IBM 的 JavaScript 安全分析技術(shù)離線分析了這些頁(yè)面,集中分析了基于 DOM 的跨站點(diǎn)腳本編制及重定向兩種漏洞。
測(cè)試結(jié)果令人驚嘆,這些知名網(wǎng)站中有 14% 存在嚴(yán)峻的 JavaScript 安全問(wèn)題,黑客可以利用這些漏洞進(jìn)行植入流氓軟件,植入釣魚(yú)站點(diǎn),以及劫持用戶會(huì)話等。更令人驚嘆不已的是,隨著 IBM 的 JavaScript 安全分析技術(shù)的成熟發(fā)展,2011 年中期 X-Force 報(bào)告顯示,IBM 重新測(cè)試了上述這些知名網(wǎng)站并發(fā)現(xiàn)了更多的安全漏洞,大約有 40% 的網(wǎng)站存在 JavaScript 安全漏洞。
java企業(yè)級(jí)通用權(quán)限安全框架源碼 SpringMVC mybatis or hibernate+ehcache shiro druid bootstrap HTML5
下文本文將結(jié)合代碼向讀者展示常見(jiàn)這些 JavaScript 安全漏洞,以便讀者在實(shí)際編碼過(guò)程中注意到這些安全問(wèn)題,及早規(guī)避這些風(fēng)險(xiǎn)。
基于 DOM 的跨站點(diǎn)腳本編制
我們都聽(tīng)說(shuō)過(guò) XSS(Cross Site Script,跨站點(diǎn)腳本編制,也稱為跨站腳本攻擊),指的是攻擊者向合法的 Web 頁(yè)面中插入惡意腳本代碼(通常是 HTML 代碼和 JavaScript 代碼)然后提交請(qǐng)求給服務(wù)器,隨即服務(wù)器響應(yīng)頁(yè)面即被植入了攻擊者的惡意腳本代碼,攻擊者可以利用這些惡意腳本代碼進(jìn)行會(huì)話劫持等攻擊??缯军c(diǎn)腳本編制通常分為反射型和持久型:當(dāng)請(qǐng)求數(shù)據(jù)在服務(wù)器響應(yīng)頁(yè)面中呈現(xiàn)為未編碼和未過(guò)濾時(shí),即為反射型跨站點(diǎn)腳本編制;持久型指的是包含惡意代碼的請(qǐng)求數(shù)據(jù)被保存在 Web 應(yīng)用的服務(wù)器上,每次用戶訪問(wèn)某個(gè)頁(yè)面的時(shí)候,惡意代碼都會(huì)被自動(dòng)執(zhí)行,這種攻擊對(duì)于 Web2.0 類型的社交網(wǎng)站來(lái)說(shuō)尤為常見(jiàn),威脅也更大。應(yīng)對(duì)跨站點(diǎn)腳本編制的主要方法有兩點(diǎn):一是不要信任用戶的任何輸入,盡量采用白名單技術(shù)來(lái)驗(yàn)證輸入?yún)?shù);二是輸出的時(shí)候?qū)τ脩籼峁┑膬?nèi)容進(jìn)行轉(zhuǎn)義處理。
但鮮為人知的是還有第三種跨站點(diǎn)腳本編制漏洞。2005 年 Amit Klein 發(fā)表了白皮書(shū)《基于 DOM 的跨站點(diǎn)腳本編制—第三類跨站點(diǎn)腳本編制形式》("DOM Based Cross Site Scripting or XSS of the Third Kind"),它揭示了基于 DOM 的跨站點(diǎn)腳本編制不需要依賴于服務(wù)器端響應(yīng)的內(nèi)容,如果某些 HTML 頁(yè)面使用了 document.location、document.URL 或者 document.referer 等 DOM 元素的屬性,攻擊者可以利用這些屬性植入惡意腳本實(shí)施基于 DOM 的跨站點(diǎn)腳本編制攻擊。
下面我們將通過(guò)一個(gè)很簡(jiǎn)單的 HTML 頁(yè)面來(lái)演示基于 DOM 的跨站點(diǎn)腳本編制原理。假設(shè)有這么一個(gè)靜態(tài) HTML 頁(yè)面(如清單 1 所示),用來(lái)展示歡迎用戶成功登錄的信息。
清單 1. 存在 DOM based XSS 的 HTML 代碼
Welcome! - Hi
- Welcome to our system
- …
按照該頁(yè)面 JavaScript 代碼邏輯,它會(huì)接受 URL 中傳入的 name 參數(shù)并展示歡迎信息,如清單 2 所示:
清單 2. 正常情況下的訪問(wèn) URL
http://www.vulnerable.site/welcome.html?name=Jeremy
但如果惡意攻擊者輸入類似如下的腳本,見(jiàn)清單 3,該頁(yè)面則會(huì)執(zhí)行被注入的 JavaScript 腳本。
清單 3. 訪問(wèn) URL 中注入腳本
http://www.vulnerable.site/welcome.html?name=
很明顯,受害者的瀏覽器訪問(wèn)以上 URL 的時(shí)候,服務(wù)器端會(huì)跟正常情況下一樣返回清單 1 中所示 HTML 頁(yè)面,然后瀏覽器會(huì)繼續(xù)將這個(gè) HTML 解析成 DOM,DOM 中包含的 document 對(duì)象的 URL 屬性將包含清單 3 中注入的腳本內(nèi)容,當(dāng)瀏覽器解析到 JavaScript 的時(shí)候會(huì)執(zhí)行這段被注入的腳本,跨站點(diǎn)腳本編制攻擊即成功實(shí)現(xiàn)。
值得關(guān)注的是,通過(guò)以上示例可以看出,惡意代碼不需要嵌入服務(wù)器的響應(yīng)中,基于 DOM 的跨站點(diǎn)腳本編制攻擊也能成功??赡苣承┳x者會(huì)認(rèn)為:目前主流瀏覽器會(huì)自動(dòng)轉(zhuǎn)義 URL 中的 '<' 和 '>' 符號(hào),轉(zhuǎn)義后的注入腳本就不會(huì)被執(zhí)行了,基于 DOM 的跨站點(diǎn)腳本編制也就不再有什么威脅了。這句話前半段是對(duì)的,但后半段就不準(zhǔn)確了。我們要意識(shí)到攻擊者可以很輕松地繞過(guò)瀏覽器對(duì) URL 的轉(zhuǎn)義,譬如攻擊者可以利用錨點(diǎn) '#' 來(lái)欺騙瀏覽器,如清單 4 所示。瀏覽器會(huì)認(rèn)為 '#' 后面的都是片段信息,將不會(huì)做任何處理。
清單 4. 訪問(wèn) URL 中結(jié)合錨點(diǎn)注入腳本
http://www.vulnerable.site/welcome.html#?name=
通過(guò) URL 重定向釣魚(yú)
網(wǎng)絡(luò)釣魚(yú)是一個(gè)通稱,代表試圖欺騙用戶交出私人信息,以便電子欺騙身份。通過(guò) URL 重定向釣魚(yú)指的是 Web 頁(yè)面會(huì)采用 HTTP 參數(shù)來(lái)保存 URL 值,且 Web 頁(yè)面的腳本會(huì)將請(qǐng)求重定向到該保存的 URL 上,攻擊者可以將 HTTP 參數(shù)里的 URL 值改為指向惡意站點(diǎn),從而順利啟用網(wǎng)絡(luò)釣魚(yú)欺騙當(dāng)前用戶并竊取用戶憑證。清單 5 給出了較為常見(jiàn)的含有通過(guò) URL 重定向釣魚(yú)漏洞的代碼片段。
清單 5. 執(zhí)行重定向的 JavaScript 代碼片段


咨詢
建站咨詢