王丹,顧明昌,趙文兵
(北京工業大學 計算機學院, 北京 100124)
跨站腳本漏洞滲透測試技術
王丹,顧明昌,趙文兵
(北京工業大學 計算機學院, 北京 100124)
為提升跨站腳本(XSS)漏洞檢測方法的檢測效果,本文提出了基于隱馬爾科夫模型(HMM)的攻擊向量動態生成和優化方法。采用決策樹模型和代碼混淆策略對攻擊向量進行分類和變形,獲得測試用攻擊向量。使用注入點去重處理和探子技術去除一部分不存在XSS漏洞的Web頁面,避免重復檢測不同Web頁面中相同的漏洞注入點,減少測試階段與Web服務器的交互次數;進一步采用XPath路徑定位技術提高漏洞檢測結果分析的效率。對比實驗結果表明,本文提出的方法降低了響應時間和漏報率,提高了檢測效率。
跨站腳本漏洞; 滲透測試; 隱馬爾科夫模型; 攻擊向量; 注入點
當用戶訪問Web頁面時,如果瀏覽器執行了攻擊者向Web頁面中插入的惡意腳本代碼時,就會引發跨站腳本(cross site script,XSS)漏洞攻擊,造成竊取用戶敏感信息、劫持用戶瀏覽器等安全問題[1-2]。XSS漏洞攻擊屬于代碼注入式漏洞攻擊,根據開放式Web應用程序安全項目(open web application security project,OWASP)[3]發布的Web應用安全漏洞統計,XSS漏洞已連續幾年均列十大安全漏洞前三名。目前,隨著JavaScript語言和Ajax技術的普遍使用,動態交互的網絡應用在豐富網絡內容、增加用戶體驗的同時,也容易引發較嚴重的網絡安全問題,因為任何能夠提供用戶信息交互的地方都可能成為XSS攻擊者提交惡意攻擊腳本的載體,成為漏洞的注入點[4]。如果Web應用系統未對輸入的內容進行有效驗證,也沒有嚴格的過濾機制對可能含有惡意腳本的內容進行過濾,就可能引發XSS漏洞攻擊[5]。滲透測試技術通過模擬攻擊和對Web響應進行分析來檢測安全漏洞,已成為動態發現Web漏洞的有效手段之一[6-7]。如何有效發現漏洞注入點、并構造測試有效的攻擊向量以提升漏洞檢測效率和覆蓋率是滲透測試需要研究解決的關鍵問題之一,尤其是XSS漏洞攻擊本身具有復雜的攻擊方式,檢測效果在很大程度上依賴于漏洞注入點發現的全面性和漏洞攻擊向量設計的完整性。
本文提出了基于隱馬爾科夫模型(hidden Markov model,HMM)的攻擊向量動態生成和優化方法,并基于數據的輸出位置對攻擊向量進行了分類,設計并實現了基于滲透測試的XSS漏洞檢測的原型系統。
1.1種子攻擊向量
目前,在使用攻擊向量進行XSS漏洞動態檢測過程中,絕大多數都是使用基于XSS Cheat Sheet的攻擊向量集,并在此基礎上進行相關的變形,作為最后的攻擊向量。在此過程中,種子攻擊向量的選擇一般都來自現有的攻擊向量集合,包括XSS Cheat Sheet攻擊腳本,以及根據xssed網站中發布的XSS攻擊所采用的腳本。
種子攻擊向量是對攻擊變量進行變形的基礎,它被從攻擊向量隊列中讀出之后經過如下幾種操作,如URL編碼、HTML實體替換、UTF-8編碼、Base64編碼、Hex編碼以及用String.fromCharCode()函數和插入特殊字符、隨機字符的大小寫變形等,產生多種變形后成為新的攻擊向量,隨后再經過對重復的攻擊向量的篩除,繼續作為下一次攻擊向量種子,最后通過響應函數prifix()函數引入的前綴符號,如 “;”、“〉”、“&”、“′〉”、“+〉”、“>”和“>”等,與Web頁面中的“<”,“+”閉合,使上述攻擊向量成為能夠被瀏覽器解析執行的自由腳本。
1.2攻擊向量結構
引發XSS攻擊的攻擊向量有很多種,它們本身有一定的組成規則:1)它所包含的惡意腳本被瀏覽器加載執行;2)能夠執行具有特定目的攻擊動作;3)符合HTML語義邏輯。本文基于語法規則,將攻擊向量的語法分為備選符號集、攻擊向量形式說明、變形規則說明三部分,分析如下。
1)備選符號集。如HTML中標簽、JavaScript的敏感詞和CSS的敏感符號,即可能出現于攻擊向量中的語法符號。參考并整理文獻[8-9],本文涉及的備選符號集分為如表1所示的三部分。

表1 備選符號集分類
2)攻擊向量形式說明。通過相關的文獻和收集的攻擊向量發現:攻擊向量主要由分隔符、HTML標簽、一個或者多個屬性的組合,表2給出部分示例。
3)變形規則說明。通過編碼、混編大小寫、添加空白字符等變形操作而繞過代碼過濾,是攻擊向量常用的一種策略。攻擊向量的變異就是通過使用變形規則自動生成攻擊向量,達到繞過Web站點中過濾器的目的。

表2 攻擊向量的組合形式
1.3攻擊向量分類
本文以合法請求向量在Web頁面中的輸出點為依據,對攻擊向量進行分類,達到減少訪問XSS注入點、減少與服務器交互次數、提高效率的目的。輸出點分類如表3所示。
1.4攻擊向量生成
本文攻擊向量自動化生成方法的基本過程是:根據前文攻擊向量的結構分析中選取一種攻擊向量的組合形式,然后從攻擊向量符號集中選擇一個備選字符集的值,并且隨機選取惡意符號功能集和分隔符集中的元素值,最后根據組合規則組合生成一個基本的攻擊向量。基本攻擊向量結構定義如下:
Class BasicAttackVector{
String vectorType;//基本攻擊向量組合形式
String vectorPattern; //攻擊向量符號集類型
String vectorValue; //攻擊向量備選字符}
下面給出一個攻擊向量生成實例:
1)vectorType:基本攻擊向量組合形式。假設為。為了生成攻擊向量,首先選取該種攻擊向量的組合形式。
2)vectorPattern:HTML備選字符集。以組合形式為基礎,分別從HTML_TAG、HTML_EVENT集中選取HTML標簽和事件屬性,并且從惡意功能符號集中選擇JS_S類型,組成基本的攻擊向量。
3)vectorValue:備選符號集的值。根據步驟2)中的符號集,選取對應符號集備選值中的任意一個,如
基于此,攻擊向量就成為
。

表3 輸出點分類
考慮合適的攻擊向量與非法的攻擊向量語法方面的差別,本文使用HMM模型對攻擊向量進行優化:用通過正常訓練樣本集學習的語法M代表合適的行為模式,與語法M有較高符合度的測試樣本就被認為是合適的攻擊向量;否則判斷為非法的攻擊向量。樣本特征提取和樣本分類基于HMM語法檢測的兩個過程,特征提取結果是樣本的異常測度評估a,異常測度a高的樣本被認為是非法的攻擊向量。對樣本的分類則是基于a和分類閾值a0:a≤a0的樣本為合適的攻擊向量,加入攻擊向量庫中。
為提高檢測效果,本文首先對初步生成的攻擊向量進行分類處理,使用的是決策樹分類算法[10]。這樣一來,在使用探子技術檢測到輸出點種類后,即可根據輸出點的類型開展測試,因此減少了不必要的測試。構建決策樹的前提是創建其測試樣本,本文以攻擊向量分類策略來選取特征屬性及其取值,并用一個二維數組對象來表示特征值,每條待分類的樣本數用數組中的行表示,行中元素的值為該樣本對應屬性的取值。另外,需要將結果輸入到決策樹中作為決策樹分類學習的依據,因為用于構建決策樹的樣本的分類是已知的。決策樹的構建采用遞歸方式完成。首先找到一個劃分值,基于該劃分值判斷節點是否為葉子節點,然后對非葉子節點進行劃分。
而后就可以使用構建的決策樹對已優化后的攻擊向量自動分類,產生攻擊向量庫。表4即為使用優化模型之后生成的攻擊向量部分例子。
對于婚禮攝影師來說,考察拍攝環境是非常必要的,環境中的各種線條、框架、光線都可以為我所用。線條明晰、有特色的建筑結構是不可錯過的好場景。應該要多嘗試不同的構圖方案,使畫面產生趣味性,同時利用線條、明暗、遠近、虛實,來增強環境的空間感,并形成內容上的對比、呼應。此外,人物的位置非常關鍵,我喜歡把人放在視覺滅點或是明暗交界的地方,畫面的色調也盡可能純粹,同時盡量不要用閃光燈,保留自然的光影關系。控制好人與環境的主次、輕重、比例,化繁為簡,確保最終畫面是“透氣”的。

表4 攻擊向量舉例
1.5攻擊向量混淆生成策略
XSS漏洞攻擊經常利用代碼混淆技術將惡意代碼加以注入。常用的漏洞攻擊檢測方法多采用特征檢測識別的方式對腳本語言是否包含跨站腳本攻擊的惡意特征進行檢測。然而,針對HTML語言經過代碼混淆后并不能完全直接展示惡意代碼的特征,而是隱藏在代碼邏輯中,使得傳統的檢測方法無法工作,增加了對XSS攻擊的檢測難度。通過對跨站腳本種子攻擊向量的變形可產生攻擊向量的多個變種,變形方法主要有編碼、混合編碼、插入特殊字符等。使用URL編碼等變形算法后最終生成的攻擊向量,舉例如下:
x′>
x-->
> Click
x>
對使用Ajax技術的Web應用的漏洞注入點查找,就是增量地構建Ajax應用狀態流圖的過程,通過比較事件觸發前后的DOM結構來判斷是否產生新的Ajax 應用狀態,并將新狀態和轉換添加到狀態圖中。當DOM狀態發生改變時,檢測Web響應頁面是否出現與注入數據相關的反饋數據來判定注入漏洞的存在。
2.2 URL去重
由于相同功能的表單可能會位于一個Web應用的不同頁面中,例如,完成搜索功能的標簽等,因此無需對這些表單中的注入點進行重復檢測。本文使用Bloom Filter算法對已提取的注入點進行去重處理。Bloom Filter的初始狀態是用一個包含m位的位數組itemVector表示,每個位置的值都設置成0。為了將URL或注入點ID映射到itemVector中,本文采取5個hash函數,分別是:RSHash、SDBMHash、BKDRHash、ELFHash和JSHash,利用這5個獨立的hash函數對任意一個URL或注入點id進行hash運算,共得到5個hash值:hash1、hash2、hash3、hash4、hash5。然后,將這5個hash值映射到itemVector數組的索引,并將該索引位置的數組元素值設置為1。后續的URL或注入點ID映射時,判斷映射的位置的元素是否全為1,若元素不全為1,則該URL或注入點ID不重復,將其添加到對應的URL列表或注入點列表,并將該索引位置的元素設置為1。若映射位置的元素全為1,則該URL或注入點ID已經存在。基于Bloom Filter的URL去重算法描述如算法1所示。
算法1 Bloom Filter去重算法
輸入:原始URL或注入點ID隊列
輸出:去重后的URL或注入點ID隊列
1)創建初始位數組itemVector[m],并將每個元素值初始化為0;
2)從URL或注入點ID隊列中取出一條數據item;
3)將item分別經過RSHash、SDBMHash、BKDRHash、ELFHash和JSHash這5個hash函數運算,得到5個hash1、hash2、hash3、hash4、hash5;
4)將這5個hash值與itemVector數組長度m做模運算,可得到五個索引index1、index2、index3、index4、index5;
5)判斷5個索引位置的元素是否全為1,若全為1,則該URL或注入點ID已經位于URL或注入點ID隊列,直接舍棄;
6)若不全為1,則將URL或注入點ID加入相應的去重后的隊列中,并且將itemVector數組中對應索引位置不為1的元素值更新為1;
7)重復步驟2)~6),直到原始URL或注入點ID隊列元素全部判斷完為止;
8)返回去重后的相應隊列,算法結束。
3.1響應過程
XSS漏洞攻擊檢測過程就是不斷取出注入點、生成攻擊向量并發送HTTP請求,然后分析響應頁面信息并生成漏洞檢測報告的過程[13-14]。為減少逐條使用攻擊向量模擬攻擊行為引發的與服務器的交互次數,本文先通過發送探子請求,再根據探測結果決定是否有進一步。在對響應探子請求的頁面分析時,采用DOM路徑定位技術對輸出點的類型予以分析。而后,從對應類型的攻擊向量庫中逐條取出攻擊向量對注入點進行檢測。確定該注入點是否存在XSS漏洞攻擊的依據是響應頁面中若存在與攻擊向量相同的字符串,就斷定存在XSS漏洞攻擊,然后記錄相關的檢測點和攻擊向量信息,結束檢測;否則,繼續逐條對攻擊向量庫的攻擊向量進行分析檢測,直至攻擊向量庫為空。
需要說明的是,存儲型XSS的輸出可能不在響應頁面中,而是位于其他頁面,這時要確定注入點是否為Form表單。當為Form表單時,再進行如下過程的存儲型XSS攻擊檢測:找到Form表單提交后的響應頁面,這需要遍歷所有的頁面。為提高效率,本文對Form-stored隊列中的每一個Form表單采用唯一的一個合法向量進行探子請求,即采用java.util.UUID類的randomUUID()方法來生成。之后,從hash值發生變化的文件中查找對應的合法向量,基于合法向量與Form表單間的對應關系,就可生成Form表單及其響應頁面的對應集合。最后,再依次提交攻擊向量對每個Form表單進行測試。
3.2兩次探子請求
探子請求技術是用來判斷有無后續檢測的必要,以降低無效檢測引發的額外服務器壓力,提高檢測效率。本文中,采用UUID(Universally Unique Identifier)作為探子請求字符串,它是一個128位的16進制表示的數。在完成提交該請求字符串后,若響應頁面返回了該字符串,且注入點不是Form表單,則可認為該注入點不存在XSS漏洞,停止攻擊向量測試。若無返回字符串,但注入點存在于Form表單,就將該注入點加入Form-stored隊列中,繼續開展存儲型攻擊向量檢測[8];若注入點不存在于Form表單中,則分析并記錄該探子字符串的DOM路徑,為后續漏洞檢測和結果分析提供支持。然后第二次使用探子請求技術,本次探子請求字符串在上次的探子字符串基礎上添加alert(111)
,來判斷Web服務端是否對“<”進行了過濾或編碼。
使用兩次探子主要是為了提高漏洞檢測效率,減輕服務器的測試壓力。第一次探子請求主要用來判定是否有對某個注入點進行后續檢測的必要,以及記錄探子字符串的DOM路徑,提高后續漏洞檢測中結果分析的效率;第二次探子請求主要是用來判斷Web站點是否對特殊字符進行編碼過濾,若服務端對特殊字符進行了編碼,那么在選擇攻擊向量庫時就不必使用未進行代碼混淆處理的攻擊向量。
3.3 XPath路徑定位方法
在響應分析階段,若每次檢測都使用靜態頁面分析技術來查找響應頁面的話,效率會比較低,本文使用XPath路徑定位技術來提升分析效率。作為一種表達式語言,XPath的返回值是以節點、節點集合、原子值以及節點和原子值的混合等形式出現,用于對XML文檔節點樹中的節點定位。采用探子請求技術之后,針對服務器返回的頁面繼續采用正則表達式來確定該頁面是否包含探子請求字符串。若存在,則繼續采用Xpath路徑定位技術解析該HTML文件,也就是記錄該探子請求字符串的DOM路徑,實際上是記錄從該文件的根節點到探子請求字符串所在的標簽節點的路徑字符串,然后將該路徑字符串保存下來。在后續的檢測中,為了分析檢測結果,直接使用Xpath定位技術,按路徑字符串所標識的路徑來解析HTML文件,查看該路徑下是否存在本次檢測所使用的攻擊向量。這樣就避免了每次檢測時都需對HTML響應頁面進行分析而影響響應效率的問題。
本文的實驗系統的設計如圖1所示。實驗結果采用以下四個指標,分別是檢測的漏洞個數、漏報率、誤報率和響應時間來進行分析。

圖1 測試系統Fig.1 Testing system
4.1漏洞檢測系統功能測試與分析
OWASP的開源項目提供了很多用于測試的網站,且XSSed.com網站也發布了存在XSS漏洞且尚未修復的網站,本文選擇其中XSSer、Paros Proxy和本文設計的系統。XSSer則是基于滲透測試的XSS漏洞的檢測工具,可繞過某些過濾;Paros Proxy是一個Web應用程序漏洞評估的代理程序,通過網站攻擊掃描器實現XSS漏洞檢測。
三種檢測方法的對比如表5所示。被檢測樣本來自于XSSed.com網站,100個是存在XSS漏洞且未被修復的樣本,50是個修復漏洞后的樣本。表6為與OWASP開源項目WebGoat-6.0.1站點的比對分析。

表5 選取XSSed.com樣本的檢測結果
從對比結果來看,Paros Proxy的誤報率和漏報率極低,響應時間短。XSSer誤報率較高,未能全部檢測出存儲型XSS漏洞。本文的方法在一定程度上降低了響應時間和漏報率,提高了性能,反應了對攻擊向量進行分類整理的措施是有效的。
4.2攻擊向量自動化生成方法的測試與分析
為測試本文提出的攻擊向量自動化生成方法的有效性,我們分別選取了自建的攻擊向量庫以及收集的手動的攻擊向量庫,使用這兩種攻擊向量分別進行測試,比較分析本文提出的攻擊向量自動化生成優化分類方法是否有效。我們從XSSed.com網站選取200個發布的XSS漏洞的樣本,分別使用兩種攻擊向量庫,對這些樣本進行測試,以被發現的XSS漏洞個數作為評估標準來驗證本文提出的攻擊向量生成方法的有效性。使用手動攻擊向量庫檢測的漏洞個數為163個,而使用自動攻擊向量檢測的漏洞個數為171個,兩種方式攻擊向量的表現基本持平,說明本文的自動化攻擊向量生成方式是有效的。當然這和手動攻擊向量的選取范圍也有一定的關系。從檢測效果來看,由于自動生成攻擊向量的設計中加入了攻擊向量的分類,提高了檢測效率。

表6 OWASP開源系統WebGoat檢測結果
1)基于HMM模型和決策樹的漏洞攻擊測試向量的生成、描述和優化方法,能夠有效識別XSS漏洞注入點和漏洞攻擊模式,可優化漏洞攻擊向量的自動生成。
2)使用探子請求技術對輸出點進行DOM路徑定位改進了漏洞檢測中攻擊向量逐條注入檢測帶來的效率低下問題。根據輸出點類型來選擇相應類型的攻擊向量庫,減少了漏洞檢測中不必要的測試請求,提高了檢測效率。
本文的方法尚未考慮DOM型XSS漏洞,無法對其進行有效檢測,將在后續的工作中繼續研究。
[1] VAN DEURSEN A, MESBAH A, NEDERLOF A. Analysis of web applications: prospects and challenges[J]. Science of computer programming, 2015, 97: 173-180.
[2] DEEPA G, THILAGAM, SANTHI P. Securing web applications from injection and logic vulnerabilities: approaches and challenges[J]. Information & software technology, 2016(74): 160-180.
[3] OSWAP. Types of cross-site scripting[EB/OL]. https://www.owasp.org/index.php/Types of Cross-Site Scripting, 2017.
[4] GUPTA S, GUPTA B. B.JS-SAN: Defense mechanism for HTML5-based web applications against javascript code injection vulnerabilities[J]. Security and communication networks, 2016(9): 11: 1477-1495.
[5] SAXENA P, MOLNAR D, LIVSHITS B. SCRIPTGARD: automatic context-sensitive sanitization for large-scale legacy web applications[C]// Proceedings of Computer & Communications Security, 2011: 601-614.
[6] 程誠,周彥暉. 基于模糊測試和遺傳算法的XSS漏洞挖掘[J].計算機科學, 2016, 43(6A): 328-331.
CHENG Cheng, ZHOU Yanhui. Finding XSS vulnerabilities based on fuzzing test and generation algorithm[J]. Computer science, 2016, 43(6A): 328-331.
[7] STOCK B, BEN S. Precise client-side protection against dom-based cross-site scripting[C]// Proceedings of the 23rd USENIX security symposium, 2014: 655-670.
[8] 王云. 基于爬蟲和模糊測試的XSS漏洞檢測工具設計與實現[D]. 廣州:華南理工大學, 2015: 28-30.
WANG Yun. Design and implementation of XSS vulnerability detection based on crawler and fuzzing test[D]. Guangzhou: South China University of Technology, 2015: 28-30.
[9] 李冰, 趙逢禹. Stored-XSS 漏洞檢測的研究與設計[J]. 計算機應用與軟件, 2013, 30(3): 17-21.
LI Bing,ZHAO Fengyu. Study and design of stored-XSS vulnerability detection[J]. Computer application and software, 2013, 30(3): 17-21.
[10] 莫勇. 基于決策樹算法的Web客戶端腳本安全檢測研究[D]. 北京:北京林業大學, 2015: 21-25.
MO Yong. Research on security detection of Web client script based on decision tree[D]. Beijing: Beijing Forestry University, 2015: 21-25.
[11] GUPTA S, GUPTA B B. Cross-site scripting (XSS) attacks and defense mechanisms: classification and state-of-the-art[J]. International journal of system assurance engineering and management, 2015: 1-19.
[12] 張偉偉.基于特征注入的 XSS 漏洞檢測模型研究[D]. 蘭州: 蘭州理工大學, 2016: 17-18.
ZHANG Weiwei. Research on XSS vulnerability detection model based on feature injection[D]. Lanzhou: Lanzhou University of Technology, 2016: 17-18.
[13] ROCHA T S, SOUTO E. ETSSDetector: A tool to automatically detect cross-site scripting vulnerabilities[C]// Proceedings of 13th International Symposium on Net Work Computing and Applications. IEEE Computer Society, 2014: 306-309.
[14] FABIEN D, ROLAN G, SANJAY R, et al. XSS vulnerability detection using model inference assisted evolutionary fuzzing[C]// Proceedings of Fifth International Conference on Software Testing, Verification and Validation. IEEE Computer Society, 2012: 815-817.
本文引用格式:
王丹,顧明昌,趙文兵. 跨站腳本漏洞滲透測試技術[J]. 哈爾濱工程大學學報, 2017, 38(11): 1769 -1774.
WANG Dan, GU Mingchang, ZHAO Wenbing. Cross-site script vulnerability penetration testing technology[J]. Journal of Harbin Engineering University, 2017, 38(11): 1769 -1774.
Cross-sitescriptvulnerabilitypenetrationtestingtechnology
WANG Dan, GU Mingchang, ZHAO Wenbing
(College of Computer Science, Beijing University of Technology, Beijing 100124, China)
To improve the detection results of cross-site scripting (XSS) vulnerability, a dynamic attack vector generation and optimization scheme was proposed based on hidden Markov model. The mutated attack vector was generated by using decision tree model to classify the attack vectors and the code confusion strategy to deform the attack vector. To reduce the interactions between the test phase and the web server, an injection point de-duplication and probe algorithm are designed to remove web pages that do not include XSS vulnerabilities and to avoid detecting the same injection point in different web pages. XPath path location technology was adopted to improve the analysis efficiency for vulnerability detection results. Experimental results show that the proposed method can reduce the response time and the miss report, and improve the detection efficiency.
cross site scripting; penetration test; hidden Markov model(HMM); attack vector; injection point
10.11990/jheu.201606044
http://www.cnki.net/kcms/detail/23.1390.u.20170427.1544.148.html
TP309
A
1006-7043(2017)11-1769-06
2016-06-16.
網絡出版日期:2017-04-27.
國家自然科學基金重大研究計劃培育項目(91546111);北京市自然科學基金項目(4173072);信息網絡安全公安部重點實驗室開放課題項目.
王丹(1969-), 女, 教授,博士生導師;
顧明昌(1986-), 男, 碩士研究生.
顧明昌,E-mail: hnzzgmc@163.com.