謝品章
摘要:DOM(文檔對(duì)象模型)型XSS(跨站攻擊)漏洞是XSS漏洞的其中一種類(lèi)型。在Web應(yīng)用程序中這種漏洞出現(xiàn)的場(chǎng)景、攻擊方式和危害程度都可能不同,為有效防范WEB應(yīng)用程序被基于DOM型XSS漏洞攻擊,提高WEB應(yīng)用程序的安全性,文章對(duì)利用該漏洞實(shí)施攻擊的步驟,以及攻擊的技巧進(jìn)行了分析,并在此基礎(chǔ)上提出檢測(cè)DOM型XSS漏洞的方法和防范措施。
關(guān)鍵詞:XSS漏洞;攻擊方法;防范措施;漏洞利用;WEB安全
迄今為止,互聯(lián)網(wǎng)的應(yīng)用已經(jīng)影響到人們生活的方方面面,其中基于WEB的應(yīng)用是當(dāng)今最為廣泛的互聯(lián)網(wǎng)應(yīng)用之一,然而,WEB的安全問(wèn)題一直威脅人們正常使用互聯(lián)網(wǎng)。XSS漏洞是WEB應(yīng)用程序中比較常見(jiàn)的漏洞之一,利用XSS漏洞對(duì)WEB應(yīng)用程序?qū)嵤┕艉苋菀祝軓V泛,也很難發(fā)現(xiàn)和預(yù)防,XSS漏洞已經(jīng)被人們視為WEB應(yīng)用程序面臨的最主要的安全威脅之一。XSS有三種類(lèi)型,文章主要是分析基于DOM型XSS漏洞攻擊與防范技術(shù)。
1基于DoM型XSS漏洞攻擊的步驟
利用基于DOM型XSS漏洞攻擊就是攻擊者事先構(gòu)造含有惡意腳本代碼的鏈接,設(shè)法讓用戶(hù)點(diǎn)擊,用戶(hù)一旦點(diǎn)擊這些鏈接之后,惡意腳本就在用戶(hù)的瀏覽器運(yùn)行,如果用戶(hù)的瀏覽器端沒(méi)有設(shè)置任何的防范措施,那么攻擊者就可以輕而易舉地竊取用戶(hù)的隱私信息,如COOKIE等。具體攻擊實(shí)施步驟如下圖1。
①被攻擊用戶(hù)在登陸WEB應(yīng)用程序時(shí),輸入的用戶(hù)名,密碼等就被保存在cookie中。
②攻擊者將精心構(gòu)造的含有惡意腳本的鏈接發(fā)給用戶(hù)。
③被攻擊者在沒(méi)有任何防范措施的情況下點(diǎn)擊了這些含有惡意腳本的鏈接。
④服務(wù)器向點(diǎn)擊鏈接的用戶(hù)返回有DOM型XSS漏洞的頁(yè)面,觸發(fā)腳本運(yùn)行。
⑤惡意腳本在用戶(hù)端運(yùn)行的時(shí)候。將攻擊代碼復(fù)制到用戶(hù)的頁(yè)面中。
⑥被攻擊的用戶(hù)瀏覽器就會(huì)讀取用戶(hù)的隱私信息,并發(fā)送給攻擊者指定的服務(wù)器中。
⑦攻擊者利用獲取到的信息,偽裝成合法的用戶(hù),就可以正常登陸WEB應(yīng)用程序,進(jìn)行其他合法操作。
2基于DOM型XSS漏洞攻擊技巧分析
利用以下幾種攻擊技巧,攻擊者可以很容易將攻擊代碼插入WEB應(yīng)用程序中,而不被WEB服務(wù)器攔截。
當(dāng)客戶(hù)端從地址鏈接中獲取參數(shù)值時(shí),它們一般不會(huì)把查詢(xún)字符串精確解釋成“名=值”對(duì)。相反,它們往往會(huì)在地址鏈接中查找等號(hào)后面的參數(shù)名稱(chēng),然后截取等號(hào)后面所有的URL??梢圆捎靡韵聝煞N方式:
1)如果WEB服務(wù)器端不是應(yīng)用整個(gè)URL進(jìn)行確認(rèn)的,而是根據(jù)每個(gè)參數(shù)的確認(rèn),那么攻擊者就會(huì)將惡意代碼插人在容易受攻擊的參數(shù)中,例如:
http://localhost/testl.aspx?message=sorry%2c+an+error+OC-eurred&foo=
通過(guò)以上這種精心構(gòu)造的URL不會(huì)被web服務(wù)器發(fā)現(xiàn)而處理掉,而是,被攻擊的用戶(hù)瀏覽器運(yùn)行腳本,獲取“message=”這個(gè)URL后面的全部?jī)?nèi)容,這樣被攻擊的用戶(hù)瀏覽器就會(huì)處理的字符串中包含的惡意鏈接。
2)如果服務(wù)器對(duì)不僅僅是應(yīng)用參數(shù)進(jìn)行確認(rèn),而是應(yīng)用整個(gè)URL進(jìn)行確認(rèn)的,攻擊者可以利用下面的技巧將惡意代碼插入到URL中“#”的右邊,從而規(guī)避WEB服務(wù)器端的過(guò)濾。例如:
http://localhost/test2.aspx?message=sorry%2c+an+error+OC-curred#
以上的惡意鏈接中,“#”號(hào)后面的代碼作為URL的一部分,從而使它能夠被保留在DOM中,讓被攻擊的用戶(hù)瀏覽器處理,但是,“#”號(hào)后面的代碼不會(huì)提交給服務(wù)器出理,因此這些惡意的代碼就不會(huì)被服務(wù)器過(guò)濾,被攻擊的客戶(hù)端腳本獲取“mes-sage=”后面的全部?jī)?nèi)容之后攻擊代碼就會(huì)被完全復(fù)制到HTML頁(yè)面中。
3)假如客戶(hù)端和服務(wù)端都設(shè)置了特別嚴(yán)格的過(guò)濾規(guī)則,那么以上兩種方法可能都無(wú)法實(shí)現(xiàn)攻擊,URL中的惡意代碼可能都被過(guò)濾掉,但是可以對(duì)以上的兩個(gè)攻擊代碼做如下修改:
http://loealhost/testl.aspx?foomessage=&message=sorry%2e+an+error+occurred
http://localhost/test2.aspx?#message=
通過(guò)修改后的兩種攻擊URL里面“message=”后面連接攻擊字符串,沒(méi)有任何阻止腳本執(zhí)行的分隔符,惡意代碼就能夠被插人到HTML的源代碼中。
3基于DOM型xSS漏洞的檢測(cè)方法
1)檢測(cè)DOM型XSS漏洞的基本方法是:在客戶(hù)端用瀏覽器進(jìn)行檢測(cè),通過(guò)更改URL中的參數(shù),在每一個(gè)URL中插入測(cè)試字符串,例如:
通過(guò)輸入以上的代碼,觀察瀏覽器返回的每一個(gè)頁(yè)面,如果返回的頁(yè)面中出現(xiàn)含有COOKIE的對(duì)話(huà)框,那么就可以斷定這個(gè)頁(yè)面有XSS漏洞。
2)檢測(cè)DOM型XSS漏洞的另一種更加有效的方法是檢查所有客戶(hù)端JavaScripk看其中是否出現(xiàn)以下的API,它們可以用于訪(fǎng)問(wèn)專(zhuān)門(mén)設(shè)計(jì)過(guò)的URL控制的DOM數(shù)據(jù):
①document.10cahion
②document.URL
③document.URLUnencoded
④document.referrer
⑤window.10cation
以上的這些API的位置應(yīng)該重點(diǎn)檢查,分析應(yīng)用程序是怎么樣處理用戶(hù)的輸入數(shù)據(jù)的,以及檢測(cè)這些API是否可以用來(lái)執(zhí)行任意的JavaScript腳本,特別注意檢查并測(cè)試控制的數(shù)據(jù)被傳送以下任何一個(gè)API的情況:endprint
①document.writen
②document.writelnn
③document.body.innerHtml
④evalfl
⑤window.execScript()
⑥window.setInterval()
⑦window.SetTimeout()
任何一種檢測(cè)方法都很難完全檢測(cè)出所有的XSS的漏洞,結(jié)合一些專(zhuān)業(yè)工具比如DOMTracer,AWVS等,可以大大的提高檢測(cè)的效果。
4基于DOM型XSS漏洞防范措施
迄今為止,對(duì)XSS的攻擊防范措施有很多種,但是因?yàn)椴煌?lèi)型的XSS攻擊的差異性很大,很多的預(yù)防機(jī)制并不能完全防止DOM型XSS漏洞,造成這種漏洞的原因是因?yàn)椴⒉恍枰獙⒂脩?hù)的數(shù)據(jù)復(fù)制到WEB服務(wù)器響應(yīng)中,所以應(yīng)用程序應(yīng)盡量避免使用客戶(hù)腳本處理DOM數(shù)據(jù)并把它插入到頁(yè)面中。
要是在一些特殊的WEB應(yīng)用中必須要以這種方式使用客戶(hù)腳本,我們可以通過(guò)以下兩種方法防范DOM型XSS漏洞,這兩種措施就是輸入控制和輸出控制。
4.1輸入控制
輸入控制可以在客戶(hù)端實(shí)施,也可以在服務(wù)端實(shí)施,但在客戶(hù)端實(shí)施的輸入控制更加簡(jiǎn)單,也更加有效。在客戶(hù)端可以對(duì)插入到文檔的字符進(jìn)行過(guò)濾,把非法的特殊字符過(guò)濾掉,只允許字母,數(shù)字,與空白符,這樣就可以防范攻擊的發(fā)生。例如可以通過(guò)以下控制:
在服務(wù)端實(shí)施的輸入控制就是對(duì)客戶(hù)端提交的URL進(jìn)行嚴(yán)格控制。對(duì)客戶(hù)端提交的查詢(xún)字符串進(jìn)行檢測(cè),具體檢測(cè)的內(nèi)容包括如下:
①查詢(xún)字符串中只有一個(gè)參數(shù);
②參數(shù)名為message(區(qū)分大小寫(xiě));
③參數(shù)值僅包含字母數(shù)字內(nèi)容。
除了通過(guò)這些服務(wù)端輸入控制之外,在客戶(hù)端也需要解析出message參數(shù)的值,過(guò)濾掉包含在URL中的任何非法字符。
4.2輸出控制
輸出控制就是在將用戶(hù)可輸出的DOM數(shù)據(jù)插入到文檔之前,應(yīng)用程序?qū)λ鼈冞M(jìn)行HTML編碼。這樣就可以將各種危險(xiǎn)的字符與表達(dá)式以安全的方式顯示在頁(yè)面中。例如,使用下面的函數(shù)即可在客戶(hù)端JavaScript中執(zhí)行HTML編碼:
5結(jié)束語(yǔ)
文章歸納和總結(jié)了利用DOM型XSS漏洞攻擊的實(shí)施過(guò)程,通過(guò)分析造成基于DOM型XSS漏洞的原因,然后指出目前常用避開(kāi)服務(wù)器過(guò)濾URL的攻擊技巧,接著在此基礎(chǔ)上提出了DOM型XSS漏洞的檢測(cè)方法,最后提出了防范這些漏洞的措施。通過(guò)以上的分析和研究,為下一步完善DOM型XSS漏洞的檢測(cè)方法,改正防范措施打下基礎(chǔ),指明方向。endprint