王萬(wàn)兵 葉水生 肖 璐
(南昌航空大學(xué)信息工程學(xué)院 南昌 330000)
跨站腳本(Cross—Site Scripting,XSS)是 Web應(yīng)用程序中常見(jiàn)的一種安全漏洞。而在近些年中,隨著移動(dòng)客戶端的大量普及,Web應(yīng)用程序也逐漸受到不同行業(yè)的商家的追捧。但是由于開(kāi)發(fā)Web應(yīng)用人員的開(kāi)發(fā)水平參差不齊,XSS漏洞的產(chǎn)生也變的不可避免。
對(duì)于Web應(yīng)用產(chǎn)生的安全問(wèn)題,在2013年由國(guó)際上知名網(wǎng)絡(luò)安全機(jī)構(gòu),開(kāi)放式Web應(yīng)用程序安全 項(xiàng) 目 OWASP(Open Web Application Security Project)公布的Web應(yīng)用十大安全漏洞顯示,跨站腳本攻擊XSS(Cross Site Scripting)高居第三位,其危害性不言而喻[1]。而2014年由國(guó)內(nèi)知名組織烏云網(wǎng)公布的國(guó)內(nèi)TOP 10 Security Risks for 2014數(shù)據(jù)顯示XSS跨站腳本攻擊/CSRF高居第七位[2],而這還只是公布了XSS有害的攻擊類型排名,其危害性可見(jiàn)一斑。在2015年12月21日,360互聯(lián)網(wǎng)安全中心發(fā)布的《中國(guó)網(wǎng)站安全報(bào)告(2015)》,報(bào)告顯示,目前,四成網(wǎng)站存在漏洞,黑客利用漏洞對(duì)八萬(wàn)多家網(wǎng)站進(jìn)行篡改,兩成服務(wù)器被植入后門,黑客引導(dǎo)網(wǎng)民前往惡意網(wǎng)站。而從網(wǎng)上漏洞類型上看,跨站腳本攻擊漏洞占21.9%,其排名更是居所有漏洞之首,漏洞級(jí)別達(dá)到了中危程度[3]。
XSS漏洞之所以屢防不止的原因并不是開(kāi)發(fā)人員沒(méi)有做好相關(guān)的防護(hù),而是因?yàn)閄SS攻擊方法不斷更新的原因。而在現(xiàn)階段,XSS攻擊所提倡的是繞過(guò)攻擊,即:繞過(guò)開(kāi)發(fā)人員設(shè)置的過(guò)濾方法,進(jìn)而產(chǎn)生攻擊向量,直接攻擊網(wǎng)站。因此在下文中,將對(duì)XSS攻擊做適當(dāng)分析,研究并設(shè)計(jì)實(shí)現(xiàn)XSS反繞過(guò)過(guò)濾規(guī)則,保證Web應(yīng)用的安全性。
反射型XSS,是最常用,使用最廣的一種方式。它通過(guò)給別人發(fā)送帶有惡意腳本代碼參數(shù)的URL,當(dāng)URL地址被打開(kāi)時(shí),特有的惡意代碼參數(shù)被HTML解析、執(zhí)行[4]。它的特點(diǎn)是非持久化,必須由用戶點(diǎn)擊帶有特定參數(shù)的鏈接才能引起。
既然是需要用戶點(diǎn)擊才能觸發(fā)的跨站,那么就需要足夠高的偽裝來(lái)實(shí)現(xiàn)攻擊,如2013年年初,某論壇出現(xiàn)的XSS攻擊,就是通過(guò)轉(zhuǎn)賬,然后被攻擊者查看消息從而觸發(fā)的一種反射型XSS攻擊[5]。
存儲(chǔ)型XSS就是攻擊腳本被存儲(chǔ)到了數(shù)據(jù)庫(kù)或者文件中,服務(wù)器端(可能是別的應(yīng)用或者別的頁(yè)面)在讀取了存儲(chǔ)的內(nèi)容后回顯了,就是存儲(chǔ)型攻擊[6]。這種情況用戶可能直接打開(kāi)正常的頁(yè)面就會(huì)看到被注入了。
其實(shí)現(xiàn)原理如下:
XSS代碼被提交給網(wǎng)站→網(wǎng)站把XSS代碼存儲(chǔ)進(jìn)數(shù)據(jù)庫(kù)→當(dāng)該頁(yè)面再次被請(qǐng)求時(shí),服務(wù)器發(fā)送已經(jīng)被植入XSS代碼的數(shù)據(jù)給客戶端→客戶端執(zhí)行 XSS代碼[7]。
比較常見(jiàn)的例子是在留言板上插入XSS代碼,前提是留言板的內(nèi)容未被過(guò)濾或者繞過(guò)留言板的過(guò)濾規(guī)則,如向留言輸入框中添加如下代碼<script>alert(“XSS”)</script>
則在打開(kāi)留言管理時(shí)彈出如下對(duì)話框,即可發(fā)現(xiàn)XSS已成功注入。
如圖1就是在用戶留言管理中,未作攔截過(guò)濾處理,從而使得XSS攻擊成功。
DOM—based XSS漏洞是基于文檔對(duì)象模型Document Object Model,DOM)的一種漏洞。DOM是一個(gè)與平臺(tái)、編程語(yǔ)言無(wú)關(guān)的接口,它允許程序或腳本動(dòng)態(tài)地訪問(wèn)和更新文檔內(nèi)容、結(jié)構(gòu)和樣式,處理后的結(jié)果能夠成為顯示頁(yè)面的一部分[8]。DOM中有很多對(duì)象,其中一些是用戶可以操縱的,如URI,location,refelTer等。
客戶端的腳本程序可以通過(guò)DOM動(dòng)態(tài)地檢查和修改頁(yè)面內(nèi)容,它不依賴于提交數(shù)據(jù)到服務(wù)器端,而從客戶端獲得DOM中的數(shù)據(jù)在本地執(zhí)行[9],如果DOM中的數(shù)據(jù)沒(méi)有經(jīng)過(guò)嚴(yán)格確認(rèn),就會(huì)產(chǎn)生DOM—based XSS漏洞。
DOM—based XSS攻擊源于DOM相關(guān)的屬性和方法,被插入執(zhí)行XSS攻擊的腳本。一個(gè)典型的例子如下:
HTTP 請(qǐng) 求 http://localhost: 8080/jxcx/test_show?name=test使用以下的腳本打印出登錄用戶test的名字,即
<SCRIPT>
var pos=docmnent.URL.indexOf(”name=”);
docment.write(docment.URL.substring(pos,doc?ument.URL.1ength));
</SCRIPT>
如果這個(gè)腳本用于請(qǐng)求http://localhost:8080/jxcx/test_show?name=<script>alert(‘XSS’)</script>時(shí),就導(dǎo)致XSS攻擊的發(fā)生。
當(dāng)用戶點(diǎn)擊這個(gè)鏈接,服務(wù)器返回包含上面腳本的HTML靜態(tài)文本,用戶瀏覽器把HTML文本解析成DOM,DOM中的document對(duì)象URL屬性的值就是當(dāng)前頁(yè)而的URL。在腳本被解析時(shí),這個(gè)URL屬性值的一部分被寫入HTML文本,而這部分HT?ML 文本卻是 JavaScript腳本,這使得<script>alert(‘XSS’)</script>成為頁(yè)面最終顯示的HTML文本,從而導(dǎo)致DOM—base XSS攻擊發(fā)生。
一般過(guò)濾函數(shù)都只是對(duì)相應(yīng)的特殊字符進(jìn)行過(guò)濾,而忽略了特殊字符串的大小寫問(wèn)題,但瀏覽器解析時(shí)是可以兼容大小寫的。如:
<script>alert(“XSS”)</script>會(huì)被過(guò)濾函數(shù)識(shí)別到script敏感字符而對(duì)其進(jìn)行相對(duì)應(yīng)的攔截操作,但是如果是<sCrIpT>alert(“XSS”)</SCriPt>,由于未能檢測(cè)到script敏感字符而被放行。
設(shè)計(jì)過(guò)濾函數(shù)時(shí),通常會(huì)對(duì)各類敏感字符進(jìn)行收集和過(guò)濾,因此正常情況下很難實(shí)現(xiàn)XSS攻擊,如過(guò)濾函數(shù)的中過(guò)濾的敏感字符包含有“<”,那么XSS攻擊<script>alert(“XSS”)</script>或<sCrIpT>alert(“XSS”)</SCriPt>都很難奏效。
但瀏覽器可以解析識(shí)別轉(zhuǎn)義后的字符,如<script>alert(“XSS”)</script>轉(zhuǎn)換成16進(jìn)制的Uni?code編碼為u003cu0073u0063u0072u0069u0070u0074u003eu0061u006cu0065u0072u007 4u0028u201cu0058u0053u0053u201du0029u0 03cu002fu0073u0063u0072u0069u0070u0074u 003e,而轉(zhuǎn)義后的字符串中則不含有被過(guò)濾的敏感字符,因此可以順利的繞過(guò)過(guò)濾函數(shù)執(zhí)行。而類似地可以將其轉(zhuǎn)換成8進(jìn)制、16進(jìn)制或URL轉(zhuǎn)碼等均可以繞過(guò)過(guò)濾函數(shù)。
當(dāng)過(guò)濾函數(shù)對(duì)相應(yīng)的轉(zhuǎn)義字符做出特殊過(guò)濾時(shí),那么fromCharCode()將會(huì)作為繞過(guò)攻擊的一個(gè)主要?dú)⑹诛?。如:運(yùn)用String.fromCharCode(97,108,101,114,116,40,34,88,83,83,34,41)可以輸出alert(“XSS”);而這就可以成功地繞過(guò)過(guò)濾函數(shù)實(shí)現(xiàn)惡意攻擊。
利用關(guān)閉標(biāo)簽,使得該輸入標(biāo)簽提前結(jié)束,進(jìn)而執(zhí)行輸入框中的惡意攻擊代碼,具體示例如:“/><script>alert(”XSS“);</script>”,其中“/>”會(huì)使輸入標(biāo)簽關(guān)閉,而出現(xiàn)輸入內(nèi)容繞過(guò)過(guò)濾的情況。
UBB標(biāo)簽是目前廣泛運(yùn)用到論壇,留言簿,以及其他網(wǎng)站系統(tǒng)的一種編碼標(biāo)簽,類似[img]url[/img]這樣的編碼標(biāo)簽,用戶在中間輸入地址后即可進(jìn)行攻擊,在發(fā)表的時(shí)候系統(tǒng)會(huì)自動(dòng)改成<img src=”url”></img>[10]。這個(gè)URL就是用戶輸入的圖片地址,XSS攻擊中,可以利用這個(gè)特點(diǎn)來(lái)達(dá)到無(wú)需用戶輸入“<”或“>”就能執(zhí)行由用戶所輸入的代碼,那么經(jīng)過(guò)轉(zhuǎn)換后就變成了<img src=“x”onerror=“alert(‘XSS’)”></img>。
如目標(biāo)系統(tǒng)的前端開(kāi)發(fā)語(yǔ)言為javascript,那么系統(tǒng)采用的防護(hù)或過(guò)濾系統(tǒng)也是針對(duì)javascript來(lái)定制的,但是瀏覽器可以同時(shí)解析并執(zhí)行多種前端語(yǔ)言,因此當(dāng)攻擊系統(tǒng)的語(yǔ)言由vbscript編寫時(shí),由于和javascript存在較大的差異性,可以輕松的繞過(guò)過(guò)濾系統(tǒng),實(shí)現(xiàn)對(duì)目標(biāo)系統(tǒng)的攻擊。如:<script lang=vbscript>msgbox“XSS”</script>。
以上的XSS攻擊規(guī)則均可以繞過(guò)不同的過(guò)濾函數(shù),從而達(dá)到攻擊系統(tǒng)的目的,給系統(tǒng)的防護(hù)和安全帶來(lái)一定的隱患。
該過(guò)濾規(guī)則是在以往的傳統(tǒng)過(guò)濾基礎(chǔ)上改進(jìn)而來(lái),傳統(tǒng)過(guò)濾對(duì)敏感字符檢測(cè)不嚴(yán)謹(jǐn),收集能力不強(qiáng),維護(hù)性差。因此,該過(guò)濾規(guī)則的設(shè)計(jì)將完善這些缺點(diǎn)。
首先,針對(duì)出現(xiàn)新型XSS攻擊,老系統(tǒng)無(wú)法攔截問(wèn)題進(jìn)行處理。出現(xiàn)該問(wèn)題的主要原因是過(guò)濾敏感字符不全,因此,設(shè)計(jì)可控的字符庫(kù),便于管理員維護(hù)和更新敏感字符。
其次,對(duì)字符庫(kù)的排列順序進(jìn)行處理,根據(jù)敏感字符出現(xiàn)頻次和危害度進(jìn)行排序,排序靠前的優(yōu)先匹配響應(yīng),提高系統(tǒng)的響應(yīng)速度和處理速度。
最后,利用系統(tǒng)開(kāi)發(fā)相關(guān)過(guò)濾功能,獲取待檢測(cè)內(nèi)容,與字符庫(kù)中的敏感字符進(jìn)行過(guò)濾匹配處理,進(jìn)行模塊化封裝。
針對(duì)上述的攻擊方式,采用定制的過(guò)濾系統(tǒng),防護(hù)系統(tǒng)安全。定制的過(guò)濾系統(tǒng)核心由敏感字符庫(kù)和過(guò)濾器組成,其主要的構(gòu)造和設(shè)計(jì)思想如圖2。
圖2 過(guò)濾模塊的組織結(jié)構(gòu)圖
圖2中的濾模型中包含過(guò)濾器和對(duì)敏感字符庫(kù)的處理過(guò)程,敏感字符庫(kù)的基本設(shè)計(jì)如圖3所示。
圖3 敏感字符庫(kù)基本設(shè)計(jì)
圖4 敏感字符庫(kù)示例
圖3和圖4中的character為收集的敏感字符,replace_character為替換character的轉(zhuǎn)義后的字符,level為敏感字符出現(xiàn)及危害等級(jí)。其中l(wèi)evel分為1~10個(gè)等級(jí),并由高到低排序,1為最高等級(jí),并優(yōu)先匹配檢測(cè)。
由圖2示,待檢測(cè)的提交內(nèi)容經(jīng)過(guò)濾模型處理時(shí),將檢測(cè)的內(nèi)容與敏感字符庫(kù)中的敏感字符匹配,如檢測(cè)到敏感字符,則進(jìn)行替換處理,使得輸入變?yōu)樵瓨虞敵觯▽?shí)現(xiàn)全角和半角轉(zhuǎn)換),并修改字符庫(kù)中敏感字符的level等級(jí)。
為驗(yàn)證防護(hù)效果,搭建實(shí)驗(yàn)環(huán)境,以存儲(chǔ)型XSS攻擊示例:如網(wǎng)站中未加X(jué)SS防護(hù)的漏洞展示。
圖5 XSS漏洞示例
圖6 XSS攻擊結(jié)果示例1
圖7 XSS攻擊結(jié)果示例2
圖5、圖6和圖7分別展示了網(wǎng)站中有XSS漏洞的示例和危害,如不修補(bǔ)可能會(huì)被黑客利用獲取session或cookie信息等,進(jìn)而提權(quán),對(duì)網(wǎng)站帶來(lái)巨大的安全隱患。
圖8 加入XSS過(guò)濾模塊后攻擊結(jié)果
圖8所示為運(yùn)用了過(guò)濾模型后的處理結(jié)果,和圖4中的輸入數(shù)據(jù)對(duì)比可以發(fā)現(xiàn),商品名稱輸入框中的”<”和”>”,均被過(guò)濾器替換為了全角字符”<”和”>”,從而使得輸入的內(nèi)容原樣輸出,避免了存儲(chǔ)型XSS攻擊。
4.3.1 標(biāo)簽加入法
以jsp WEB項(xiàng)目為例,項(xiàng)目由struts2框架搭建,并加入過(guò)濾模型,在項(xiàng)目中利用過(guò)濾器和攔截器進(jìn)行改造處理,過(guò)濾器和攔截器中均加入過(guò)濾模型處理函數(shù),對(duì)攔截到的內(nèi)容進(jìn)行過(guò)濾處理。該處理方法可以有效防護(hù)反射型XSS攻擊或過(guò)濾掉鏈接中帶有的惡意攻擊代碼。
標(biāo)簽內(nèi)防護(hù),以struts2中的S標(biāo)簽為例。重新構(gòu)造 S 標(biāo)簽,如<s:textfield name=”test”id=”test”XSS=”true”/>,在標(biāo)簽中添加X(jué)SS屬性,屬性值設(shè)為true或false,默認(rèn)為false,當(dāng)XSS=”true”時(shí),則標(biāo)簽內(nèi)的函數(shù)執(zhí)行標(biāo)簽內(nèi)檢測(cè)——對(duì)標(biāo)簽內(nèi)的輸入內(nèi)容調(diào)用過(guò)濾模型函數(shù)進(jìn)行過(guò)濾檢測(cè)處理。具體運(yùn)用如圖9所示。
圖9 標(biāo)簽運(yùn)用過(guò)濾器示例
4.3.2 模塊化配置使用方法
基于實(shí)驗(yàn)環(huán)境的測(cè)試用例,在WEB工程運(yùn)用中,可直接對(duì)整站的安全模塊做攔截配置,也可對(duì)單模塊配置防護(hù),如在test.xml文件中配置單例防護(hù)模塊代碼:
<interceptors>
<interceptor name=“xss”class=“com.jxcx.global.XSS”></in?
terceptor><!--單例XSS防護(hù)模塊-->
<interceptor-stack name=“defaultStack”>
<interceptor-ref name=“defaultStack”></interceptor-ref>
</interceptor-stack>
</interceptors>
<action name=“test_*”class=“testAction”method=“{1}”>
<!—引入單例XSS防護(hù)模塊-->
<interceptor-ref name=“xss”></interceptor-ref>
<result name=“toAdd”>test.jsp</result>
<result name=“add”type=“redirect”>test_show</result>
<result name=“show”>show.jsp</result></action>
對(duì)整站的防護(hù)可直接配置在web.xml文件中。
首先:在安全方面,該設(shè)計(jì)是基于字符庫(kù)的建立和完善來(lái)實(shí)現(xiàn)的,可以隨時(shí)收集繞過(guò)過(guò)濾的敏感字符并完善字符庫(kù),使得防護(hù)系統(tǒng)不斷地完善,并起到很好的安全防護(hù)作用,進(jìn)而達(dá)到反繞過(guò)過(guò)濾攻擊的目的。
其次:系統(tǒng)的防護(hù)建立在過(guò)濾器和字符庫(kù)的配合上,過(guò)濾器的設(shè)計(jì)是先響應(yīng)后處理的模式,即,先響應(yīng)用戶,后處理含有敏感字符的數(shù)據(jù),從而使得系統(tǒng)的響應(yīng)時(shí)間更短,處理模式更加優(yōu)化,也能夠提高用戶的體驗(yàn)度。
最后:該設(shè)計(jì)能夠有效地降低安全開(kāi)發(fā)和項(xiàng)目維護(hù)的成本,并可集成到系統(tǒng)的開(kāi)發(fā)模塊中,可移植性和可集成性強(qiáng)。系統(tǒng)維護(hù)人員可靈活控制并更新字符庫(kù),能夠有效地應(yīng)對(duì)新的威脅,而且可視性強(qiáng),在保證安全的基礎(chǔ)上,不需要經(jīng)常對(duì)系統(tǒng)進(jìn)行更新維護(hù)。
XSS攻擊已泛濫于網(wǎng)絡(luò)中,該過(guò)濾模型的運(yùn)用,可以在一定程度上防護(hù)WEB服務(wù)器的網(wǎng)絡(luò)安全,開(kāi)發(fā)人員可直接利用現(xiàn)有的過(guò)濾模型,將其集成到自定義標(biāo)簽或改造現(xiàn)有標(biāo)簽中,進(jìn)行有效過(guò)濾防護(hù),避免了多次校驗(yàn)的問(wèn)題,進(jìn)而提高開(kāi)發(fā)效率和服務(wù)器的響應(yīng)速度。
過(guò)濾規(guī)則的實(shí)現(xiàn)形式為過(guò)濾模型的建立,其具有很強(qiáng)的可控性和可視性,但缺少敏感字符的自主收集能力,而這將在后期的研究中將逐步實(shí)現(xiàn)。
[1]Owasp.2013 Top 10 List[EB/OL].[2014-08-12].http://www.owasp.org/index.php/Top_10_2013-Top_10.
[2] Wooyun,Top 10 Security Risks for 2014[EB/OL].[2015-06-02].http://drops.wooyun.org/news/2731
[3]ym.“China Site Safety Report(2015)”published[EB/OL].[2015].http://sec.chinabyte.com/239/13653739.sht?ml.
[4]秦英.基于行為的跨站腳本攻擊檢測(cè)技術(shù)研究與實(shí)現(xiàn)[D].西安:西安電子科技大學(xué),2010.QIN Ying.The behavior of XSS attack detection technolo?gy researc h and Implementation Based on[D].Xi'an:Xi'an Electronic and Sc ience Uni-versity,2010.
[5] X.Principle ofXSS [EB/OL].[2013-03-29].http://xxxxx0000sssss.lofter.com/post/14b1dc_50023e.
[6]丁永慧.基于頁(yè)面鏈接分析技術(shù)的漏洞掃描方案的研究與實(shí)現(xiàn)[D].北京:北京郵電大學(xué),2012.DING Yonghui.Re-search and implementation of vulnera?bility scanning scheme based on page link analysis[D].Beijing:Beijing University of Posts and Telecommunica?tions,2012.
[7] Windfire programmer.Principle of XSS [EB/OL].[2014-12-16].http://blog.csdn.net/phpfenghuo/article/details/41959971.
[8]黃文鋒.DOM—basedX SS攻擊原理與防范[J].華南金融電腦,2009(12):37-39.HUANG Wenfeng.DOM-basedX SS attack principle and prevention[J].Southern China financial computer,2009(12):37-39.
[9]洪志國(guó),黃曉.利用DOM類庫(kù)檢索XML文檔[J].計(jì)算機(jī)工程與設(shè)計(jì),2004,25(6):968-970.HONG Zhiguo,HUANG Xiao.Using DOM class library to retrieve XML documents[J].computer engineering and design,2004,25(6):968-970.
[10]PORUIN.XSS for the bypass filtering method[EB/OL].[2009-04-24].http://www.2cto.com/Article/200904/37539.html.