左丹丹 王 丹 付利華
(北京工業大學計算機學院 北京 100124)
?
一種XSS漏洞檢測方法的設計與實現
左丹丹王 丹付利華
(北京工業大學計算機學院北京 100124)
摘要跨站腳本(XSS)漏洞是近年來較為流行的一種漏洞,隨著Ajax技術的廣泛應用,其危害性及快速的傳播能力也越來越強。現有的漏洞檢測技術沒有充分對該類漏洞的漏洞注入點進行研究,使用的漏洞檢測技術也沒有充分考慮測試請求后響應的頁面,導致漏洞檢測率相對較低。針對現有漏洞檢測技術的不足之處,加強對隱含頁面的DOM結構分析,提出基于DOM狀態改變的方式查找漏洞注入點的方法。在此基礎上提出基于頁面交互點相關的漏洞檢測方法,設計并實現了漏洞檢測原型系統。實驗證明,該原型系統能夠找到更多的漏洞注入點,能有效地提高漏洞檢測率。
關鍵詞跨站腳本漏洞漏洞注入點隱含頁面漏洞檢測
0引言
Web應用程序的漏洞已經成為互聯網最嚴重的安全隱患之一。SANS研究所最新的數據顯示高達60%互聯網攻擊都來自于Web應用程序[1]。常見的漏洞攻擊包括跨站腳本漏洞、SQL注入漏洞、跨路請求偽造攻擊,而跨站腳本漏洞是其中最突出的一種。在2013年OWASP公布的Web漏洞榜單中,跨站腳本漏洞(XSS)位居第三名[2]。
增強Web應用系統漏洞檢測能力、減少漏報的關鍵問題之一是如何充分地對漏洞注入點進行分析、識別和提取。然而,由于JavaScript語言的動態特性[3],隱含頁面內容的大量存在[4],導致漏洞注入點并不能充分地被查找到用來進行漏洞的檢測。現有的XSS漏洞檢測針對漏洞注入點的查找主要關注的是當前檢測的靜態頁面,關注的對象一般都是表單輸入和超鏈接[5-8],并沒有考慮那些隱含頁面可能存在的漏洞注入點。此外,現有的漏洞測試技術一般都是通過分析服務器響應后的頁面進行漏洞檢測的判斷[9],實際上這種方法是有待改進的。因為對于存在存儲型跨站腳本漏洞的網頁來說,該方法的測試用例對應的輸出結果不一定顯示在服務器響應后的跳轉頁面或當前測試請求注入的頁面,也有可能在整個Web應用的其他相關頁面,因此存在漏報。
本文提出基于DOM狀態改變[10]的方式進行漏洞注入點的查找方法。這種查找漏洞注入點的方法的特點是不僅考慮當前指定URL的靜態頁面,還考慮了其對應的隱含頁面。 同時,本文提出基于頁面交互點相關的漏洞檢測方法,充分分析了測試請求注入Web應用后相關的頁面。該方法對于存儲型跨站腳本漏洞檢測比較明顯。
本文的主要貢獻如下:
(1) 提出了基于DOM狀態改變的方式進行XSS漏洞注入點的查找方法,能夠查找到更多的隱含頁面的漏洞注入點。
(2) 提出了基于頁面交互點相關的方法進行漏洞的檢測,該方法主要是針對存儲型跨站腳本漏洞,能夠減少漏洞漏報率。
(3) 基于上述理論設計并實現了XSS漏洞檢測工具的原型系統,并對原型系統做了真實的實驗評估,效果良好。
1相關工作
一般將XSS漏洞分為三類:包括反射性跨站腳本漏洞、存儲型跨站腳本漏洞、基于DOM的跨站腳本漏洞。
(1) 反射型跨站腳本漏洞(Reflected XSS),也稱作非持久性跨站腳本漏洞。這種類型的跨站腳本漏洞最常見的形式是攻擊者通過特定手法,誘使用戶去訪問包含惡意代碼的URL。當受害者瀏覽這些超鏈接時,惡意代碼就會在受害者的瀏覽器上執行。
(2) 存儲型跨站腳本漏洞(Stored XSS),是指通過提交惡意數據到存儲器,當包含這些惡意數據的網頁被用戶瀏覽到時,用戶便會受到漏洞攻擊。Stored XSS一般出現在網站的留言、評論、博客日志等交互處。
(3) 基于DOM型的跨站腳本漏洞(DOM based XSS),一般稱之為本地跨站腳本的攻擊,是指客戶端的腳本程序可以通過DOM(Document Object Model)動態地檢查和修改頁面內容。瀏覽器用戶可以操縱DOM中的對象,比如URL、Location、refer等。如果用戶在客戶端輸入的數據包含了惡意腳本,而這些數據沒有經過有效的輸入驗證機制,就可能會產生基于DOM的XSS漏洞。
在Web 2.0環境下的漏洞注入點的查找方面,文獻[5-8]認為漏洞的注入點為表單和含有參數的URL。文獻[11-13]漏洞注入點提取的思路主要是通過基于URL的廣度爬蟲算法獲取相關頁面,并通過正則表達式提出相關注入點。 文獻[6,7]認為造成漏洞的值空間(相當于本文中的漏洞注入點)不僅包括表單輸入數據、URL類數據,還包括客戶端與服務器交互過程中交換的數據信息。與以上文獻相比,本文提出的基于DOM狀態改變的方式查找漏洞注入點的方法不僅考慮了待測頁面的漏洞注入點,還考慮了其隱含頁面的漏洞注入點。
在相關的漏洞測試方法研究方面,文獻[11,13]使用的漏洞測試模塊主要是通過構造數據包發送到服務器,然后分析返回的代碼從而判定Web的安全性。文獻[12]為了減少不必要的漏洞測試請求,使用了探子請求技術。與上述文獻相比,本文提出了基于頁面交互點相關的漏洞檢測方法,充分分析了測試請求注入Web應用后相關的頁面,能夠有效檢測漏洞,尤其是針對Stored XSS漏洞。
2漏洞注入點的查找與漏洞檢測
為了更好地表述本文所提出的方法,本文給出如下幾個定義。
定義1隱含頁面——通過觸發頁面標簽綁定的事件進入的URL并沒有改變的頁面。需要注意本文所指的隱含頁面不包括通過超鏈接所指向的其他頁面,也就是說當進入隱含頁面時,頁面的URL并沒有改變。
定義2特征字符串——一個漏洞測試用例所對應的能表現存在漏洞的字符串。例如,該測試用例的特征字符串是頁面彈框彈出的XSS字符串。
定義3漏洞特征——經過測試用例請求后響應的頁面有彈框輸出或者出現測試用例對應的特征字符串。例如,測試用例出現的漏洞特征是頁面出現彈框且特征字符串為XSS。
定義4頁面交互點相關的頁面——當前頁面通過標簽、按鈕等交互點能夠跳轉到的任何其他頁面,包括隱含頁面、和當前頁面URL不同的頁面。
為了提高漏洞檢測率,減少漏洞漏報,本文主要從提高漏洞注入點查找數目和改進漏洞檢測技術這兩個方面來進行研究。本文針對XSS漏洞檢測,主要分為以下兩個方面:(1)漏洞注入點查找,主要完成待測頁面的漏洞注入點的查找,包括待測URL的靜態頁面和隱含頁面兩個方面。漏洞注入點主要包括表單輸入和含有參數的超鏈接。(2)漏洞檢測,主要是針對已經查找的漏洞注入點,使用基于頁面交互點相關的漏洞檢測方法進行漏洞的檢測。圖1為本文的系統架構。

圖1 系統架構圖
2.1漏洞注入點查找
本文主要從靜態頁面和隱含頁面這兩個方面來進行漏洞注入點的查找。
在針對靜態頁面的漏洞注入點的查找方面,漏洞注入點的查找原理是通過獲取當前頁面的DOM結構,然后通過標簽屬性獲取頁面的相關漏洞注入點。具體來說,漏洞注入點的提取主要分為兩個部分。
(1) 表單輸入類漏洞注入點提取。表單輸入主要是通過表單的input屬性獲取的。通過頁面的DOM結構,根據input標簽,如果input的type屬性為text、textarea等,就認為是表單輸入,并使用一個Vector容器保存起來。
需要注意的是,當頁面嵌入iframe標簽時,需要考慮獲取ifame的相關的DOM結構,并獲取其相關的漏洞注入點,這樣可以保證找到更多的漏洞注入點。
在隱含頁面的漏洞注入點查找方面,主要是通過加強對隱含頁面的DOM結構的分析處理。不過關鍵問題是需要進入不同DOM結構的隱含頁面,再使用靜態頁面的漏洞注入點查找思路在隱含頁面查找漏洞注入點。所以本文提出了基于DOM狀態改變的方式進行漏洞注入點的查找方法,通過模擬DOM狀態的改變進入不同的隱含頁面進行漏洞注入點的查找。
模擬DOM狀態的改變進入隱含頁面的具體方法是先定義頁面的交互點(本文初步認為頁面的交互點包括:a標簽、div標簽、span標簽、button按鈕等),然后模擬頁面交互點綁定的事件從而達到新的DOM結構。需要注意的是,頁面標簽綁定的事件可能包括鼠標單擊、雙擊以及拖拽等事件,本文目前僅模擬鼠標單擊事件。如果新的DOM結構的URL沒有改變但是DOM結構改變了,則認為該頁面是隱含頁面,并在該頁面進行漏洞注入點的查找;否則需要回到初始頁面模擬下一個交互點綁定的事件。具體的基于DOM狀態改變的方式查找隱含頁面的算法如下:
輸入:待測頁面的URL
輸出:隱含頁面的DOM結構
1.訪問當前URL;
2.獲取頁面所有的交互點存入隊列ClickList;
3.獲取頁面的DOM結構為initDom;
晉元莊路口南北方向允許車輛掉頭,這對南北直行車輛行駛造成嚴重影響,不但會降低車速,還會降低交叉口的通行能力.
4.如果ClickList隊列為空,結束,否則執行步驟5;
5.從ClickList隊里取出一個交互點出隊列,模擬事件;
6.獲取當前DOM結構的currentURL;
7.比較currentURL和URL是否相同,如果相同執行步驟8,否則執行步驟10;
8.獲取當前的DOMcurrentDom;
9. 比較initDom和currentDOM是否相同,如果相同執行步驟10,否則執行步驟11;
10.回到初始頁面,執行步驟4;
11.currentDom就是尋找的隱含頁面DOM結構,保存,執行步驟4。
2.2漏洞檢測
為了提高漏洞檢測率,本文主要采用基于頁面交互點相關的漏洞檢測方法進行漏洞檢測。
常見的檢測方法是通過將測試用例注入漏洞注入點,然后分析響應后的頁面進行漏洞檢測的判斷。這種測試思路是不完善的,理由是注入測試用例后,測試用例的特征字符串不一定出現在服務器響應后的跳轉頁面中或測試用例注入的頁面,也可能出現在Web應用的其他頁面。本文將分析頁面范圍擴大至當前測試請求注入的頁面,測試請求響應后的頁面以及跳轉頁面的交互點相關的頁面,這樣可以提高漏洞檢測率。
圖2是基于頁面交互點相關的漏洞檢測方法的流程。

圖2 基于頁面交互點相關的漏洞檢測方法
具體的方法步驟如下:
(1) 將漏洞注入點查找模塊輸出的漏洞注入點進行參數化并保存在隊列中。
針對含有參數的超鏈接,將含參數的超鏈接進行分割處理,分割成為域名和參數,并定義一個URL實體類保存。
class URL{
long id;
String domain;
//保存URL域名
String[] params;
//保存對應的參數名稱
}
針對表單輸入,定義一個Input實體類保存。
class Input{
long id;
String type;
//表單輸入類型
String value;
//表單輸入對應的名稱
}
(2) 從隊列中取出待測漏洞注入點。注意的是使用測試用例作為URL類注入點的params屬性所對應的值,表單輸入類的value屬性所對應的值。
(3) 使用一個3~8位的普通字符串(字母和數字隨機組合)作為測試用例進行測試請求。
(4) 查看測試用例注入頁面是否有該普通字符串。
(5) 查看服務器響應后的跳轉頁面是否存在該普通字符串。
(6) 查看跳轉頁面的交互點相關的頁面是否存在該普通字符串。在跳轉頁面提取該頁面相關的交互點,這個頁面交互點包括超鏈接、按鈕以及其他任何導致當前頁面跳轉到其他頁面的交互點。模擬頁面交互點綁定的事件,進入該頁面交互點的相關頁面,查看是否有該普通字符串。
(7) 如果(4)-(6)三個步驟均未發現該普通字符串,則認為該漏洞注入點無漏洞,沒有必要進行后續的測試請求,繼續測試下一個漏洞注入點。否則,轉(9)。
(8) 認為該漏洞注入點存在漏洞注入的可能,分別使用測試用例數據包的測試用例進行漏洞的檢測。本文選擇的測試用例數據包是由國外著名安全工程師Rsnake總結的XSS cheat sheet。該XSS cheat sheet幾乎涵蓋了目前所有可能觸發XSS的測試用例。
(9) 如果使用測試用例數據包的測試用例進行測試后,測試用例注入頁面、服務器響應后的跳轉頁面、跳轉頁面的交互點相關的頁面均未出現測試用例對應的漏洞特征,認為該漏洞注入點不存在漏洞,繼續下一個漏洞注入點的測試;否則,認為該漏洞注入點存在漏洞。
3實驗分析
為了驗證本文提出的方法的有效性,本文進行了原型系統的實現。開發過程中使用的是64位Win 7操作系統,集成環境為Java+Eclipse,該原型系統是基于Ajax爬蟲系統CrawlJax進行二次開發實現的,漏洞檢測過程中使用了Selenium安全測試框架模擬瀏覽器的事件操作。
為了檢測本文提出的方法以及實現的原型系統的有效性,本文針對真實的互聯網網站進行了漏洞檢測,并與其他的漏洞檢測軟件做了對比。其中,網站一是個人博客網站,具有個人博客管理功能,未使用Ajax技術開發。網站二、網站三均是使用Ajax技術開發的網站,分別是某搜索網站和某微博網站。
下面給出一個實例。如圖3是測試網站一的個人博客的添加文章頁面。這里我們向文章內容對應的文本框注入測試用例,文章標題對應的內容為ss。

圖3 測試網站頁面
圖4是用戶添加文章成功后跳轉的頁面,發現頁面并沒有彈框輸出。

圖4 測試用例注入后調整的頁面
然而當我們點擊文章標題ss查看時(這里是一個超鏈接,也就是頁面的交互點),就會發現如圖5所示的漏洞彈框出現。

圖5 漏洞檢測結果
通過上述過程可以發現測試網站頁面存在XSS漏洞,實際上該漏洞是一個Stored XSS漏洞。如果通過查看服務器響應后的頁面進行漏洞檢測的判斷, 并不能發現上面例子的漏洞。我們需要在跳轉后的頁面模擬交互點的操作,查看頁面交互點相關的頁面,從而發現漏洞。
本文具體的XSS漏洞檢測結果如表1-表3所示。其中,URL代表含參數的站內鏈接,表單代表表單輸入,漏洞指的是檢測XSS漏洞的數目。

表1 網站一的XSS漏洞檢測結果

表2 網站二的XSS漏洞檢測結果

表3 網站三的XSS漏洞檢測結果
實驗檢測過程中發現本方法在網站一中未發現隱含頁面,漏洞的發現是采用基于頁面交互點相關的漏洞檢測方法。本方法在網站二的隱含頁面發現一個URL類注入點,且存在漏洞。本方法在網站三的隱含頁面發現一個URL類注入點、一個表單類注入點,檢測表明該URL類注入點不存在漏洞,表單類注入點存在漏洞。通過上述發現可以總結出:本方法能夠在隱含頁面查找到漏洞注入點,且利用這些漏洞注入點能夠發現漏洞。針對相同的漏洞注入點,本文所采用的漏洞檢測方法能夠檢測到其他方法不可以檢測到的Stored XSS漏洞。
通過實驗數據,將本文設計的原型系統與其他工具相比較可以得出以下幾點:(1)XSS-Me是針對單個頁面的測試,且僅支持當前靜態頁面的表單類注入點的查找。本方法考慮了隱含頁面的漏洞注入的查找。(2)Wapiti主要考慮的漏洞注入點包括:腳本和表單輸入,并沒有考慮含有參數的超鏈接,而含有參數的超鏈接也是造成跨站腳本漏洞的原因之一,這樣會造成漏洞漏報。(3)Paros3.2.11主要是通過代理服務器的方式攔截或修改客戶端和服務器之間傳送的數據信息(包括cookie信息和表單信息)發現漏洞。但是該工具使用的測試用例數據包較少,造成對漏洞注入點分析不足,產生漏洞。(4)本方法目前也僅支持網站的單個頁面的漏洞的檢測,不支持框架式網站。
實驗證明本文提出的基于DOM狀態改變的方式進行漏洞注入點的查找方法能夠在隱含頁面查找到漏洞注入點,并且針對這些漏洞注入點進行測試用例請求,能夠檢測到漏洞。此外,通過基于頁面交互點相關的漏洞檢測技術對這些漏洞注入點進行檢測,由于充分考慮了服務器響應的頁面,提高了存儲型XSS漏洞檢測個數。
4結語
針對現有的Web應用程序中的隱含頁面的大量存在造成的漏洞注入點比較隱蔽以及漏洞檢測率低的問題,本文提出了基于DOM狀態改變的方式進行漏洞注入點的查找方法以及基于頁面交互點相關的漏洞檢測方法,并在實際應用中取得了很好的效果。在后續實驗中,為了進一步提高漏洞檢測效率,本文將考慮基于漏洞攻擊位置的不同,使用不同的測試用例進行漏洞檢測。本方法目前發現存在以下問題:表單輸入達到新的DOM狀態,必須是要有意義的輸入,否則無法達到某些新的狀態;對于含有賬號輸入的Web應用爬蟲效果不是很好,一般總
會重定向到首頁;漏洞注入點是否可以進一步去重,提高漏洞檢測效率。為了進一步提高實驗的效果,后續工作將從以上三個方面來考慮。
參考文獻
[1] Scholte T,Balzarotti D,Kirda E.Have things changed now? An empirical study on input validation vulnerabilities in web applications[J].Computers & Security,2012,31(3):344-356.
[2] Williams J,Wichers D.OWASP Top 10-2013 rcl-the ten most critical web application security risks[J].The open wep application security project,2013.
[3] Wei S,Ryder B G.Practical blended taint analysis for JavaScript[C]//Proceedings of the 2013 International Symposium on Software Testing and Analysis.ACM,2013:336-346.
[4] Behfarshad Z,Mesbah A.Hidden-web induced by client-side scripting:An empirical study[M]//Web Engineering.Springer Berlin Heidelberg,2013:52-67.
[5] Duchene F,Rawat S,Richier J L,et al.LigRE:Reverse-engineering of control and data flow models for black-box XSS detection[C]//Reverse Engineering (WCRE),2013 20th Working Conference on.IEEE,2013:252-261.
[6] Saxena P,Akhawe D,Hanna S,et al.A symbolic execution framework for javascript[C]//Security and Privacy (SP),2010 IEEE Symposium on.IEEE,2010:513-528.
[7] Saxena P,Hanna S,Poosankam P,et al.FLAX:Systematic Discovery of Client-side Validation Vulnerabilities in Rich Web Applications[C]//NDSS.2010.
[8] Chufeng Z,Qingxian W.Systematical Vulnerability Detection in Browser Validation Mechanism[C]//Computational Intelligence and Security (CIS),2011 Seventh International Conference on.IEEE,2011:831-836.
[9] Antunes N,Vieira M.Enhancing penetration testing with attack signatures and interface monitoring for the detection of injection vulnerabilities in web services[C]//Services Computing (SCC),2011 IEEE International Conference on.IEEE,2011:104-111.
[10] Mesbah A,van Deursen A,Lenselink S.Crawling Ajax-based web applications through dynamic analysis of user interface state changes[J].ACM Transactions on the Web (TWEB),2012,6(1):3.
[11] 陳建青,張玉清.Web 跨站腳本漏洞檢測工具的設計與實現[J].計算機工程,2010,36(6):152-154.
[12] 王強,蔡皖東,姚燁.基于滲透測試的跨站腳本漏洞檢測方法研究[J].計算機技術與發展,2013,23(3):147-151.
[13] 沈壽忠,張玉清.基于爬蟲的 XSS 漏洞檢測工具設計與實現[J].計算機工程,2009,35(21):151-154.
收稿日期:2015-03-04。國家自然科學基金項目(61202074)。左丹丹,碩士生,主研領域:Web安全。王丹,教授。付利華,講師。
中圖分類號TP391
文獻標識碼A
DOI:10.3969/j.issn.1000-386x.2016.07.063
DESIGNING AND APPLICATION OF AN XSS VULNERABILITY DETECTION METHOD
Zuo DandanWang DanFu Lihua
(SchoolofComputerScience,BeijingUniversityofTechnology,Beijing100124,China)
AbstractCross-site scripting (XSS) vulnerability is the one more popular in recent years,along with the wide use of Ajax technology,its harmfulness and rapid dissemination capability are getting increasingly serious.Existing vulnerability detection techniques do not sufficiently focus on studying the vulnerability injection points of XSS vulnerability,and the vulnerability detection techniques used do not fully consider the response pages after requesting the tests as well,which leads to the relatively low vulnerability detection rate.For the shortcomings mentioned above,we enhanced the analysis of DOM structure of the hidden webpage,and proposed the method to search vulnerability injection points based on the way of DOM status changing.According to that we also proposed a new vulnerability detection method which is based on the correlation of webpage interaction points,and designed and implemented the vulnerability detection prototype system.Experimental results showed that this prototype system could effectively find more vulnerability injection points and could effectively improve vulnerability detection rate.
KeywordsCross-site scripting(XSS) vulnerabilityVulnerability injection pointHidden webpageVulnerability detection