馬富天,,
(江南大學 物聯(lián)網(wǎng)工程學院 物聯(lián)網(wǎng)技術(shù)應用教育部工程研究中心,江蘇 無錫 214122)
跨站腳本(Cross-site Scripting,XSS)是當前最為普遍的Web安全漏洞之一。根據(jù)OWASP(Open Web Application Security Project)開放式Web應用程序安全項目在2007年—2017年期間進行了四次十大Web應用安全漏洞統(tǒng)計,報告顯示跨站腳本攻擊一直高居前列,是黑客攻擊Web應用的主要手段之一。根據(jù)XSS攻擊方式及特征,可以將它分為反射型跨站腳本(reflected-XSS)、存儲型跨站腳本(stored-XSS)和基于文檔對象模型的跨站腳本(DOM-based XSS)[1],其中,存儲型跨站攻擊的危害較大。產(chǎn)生跨站腳本的直接原因是由于Web應用程序缺少對用戶輸入的數(shù)據(jù)進行有效驗證與過濾[2-3]。攻擊者利用存在的漏洞把惡意腳本注入到頁面中,當用戶瀏覽這些頁面時,會觸發(fā)頁面中惡意腳本的執(zhí)行,對受害者發(fā)起信息盜取、會話劫持、網(wǎng)頁木馬掛載及破壞頁面結(jié)構(gòu)等各類攻擊。
通常檢測跨站腳本的方法主要有靜態(tài)分析、動態(tài)分析和動靜結(jié)合方式檢測[4]。靜態(tài)分析是通過審核源代碼的方式來挖掘潛在的漏洞,如文獻[5-6],其檢測準確率和效率比動態(tài)分析方法高一些。但在多數(shù)情況下,檢測人員都無法直接獲得Web應用的源代碼,并且它對程序邏輯數(shù)據(jù)處理中出現(xiàn)的問題不能有效的檢測,對編程語言的類型也有一定的要求,同時其檢測能力也受限于源代碼的框架,可擴展性能力較差。動態(tài)分析是指在無需源代碼的前提下,采用模糊測試的方法來挖掘漏洞。在動態(tài)分析方法中,文獻[7]通過分析HTML5的新標簽、新屬性,引入了14個HTML5元素相關的初始攻擊向量,基于這些攻擊向量構(gòu)建了攻擊向量庫,實現(xiàn)一個側(cè)重于Webmail系統(tǒng)的動態(tài)跨站腳本檢測工具,該工具能夠有效的利用基于HTML5的攻擊向量檢測出系統(tǒng)中的XSS。文獻[8]提出通過攻擊向量規(guī)則庫生成初始攻擊向量,然后對初始攻擊向量使用機器學習算法進行優(yōu)化,大幅度的減少初始攻擊向量庫的大小,得到最后的攻擊向量庫。
本文針對反射型和存儲型跨站腳本漏洞,提出一種動態(tài)檢測XSS的方法。該方法首先通過自動爬蟲爬取并分析Web應用的所有頁面及注入點,然后根據(jù)輸入點、輸出點類型自動生成合法向量與攻擊向量,在攻擊過程中自適應調(diào)整攻擊向量的優(yōu)先級,優(yōu)先選取當前時刻優(yōu)先級較高的攻擊向量類型,向服務器提交HTTP請求,根據(jù)反饋信息判斷漏洞是否存在,待整個攻擊過程結(jié)束,對站點進行二次遍歷,重新檢測每個頁面中尚未被驗證的攻擊向量。
Web應用程序為了避免受到跨站腳本攻擊,所有的不受信數(shù)據(jù)都必須要經(jīng)過過濾模塊才能被寫入數(shù)據(jù)庫或返回至客戶端瀏覽器。過濾模塊是指Web應用程序中用來過濾或凈化用戶所輸入的數(shù)據(jù)以防止引起跨站腳本攻擊的函數(shù)或模塊。過濾模塊比較常用的方法[9]包括黑名單過濾,一般使用正則表達式進行合法性校驗;另一種做法是只接收已知的合法數(shù)據(jù)(白名單過濾)或?qū)斎腴L度與編碼進行限制;最后一種方法是將特殊字符或標簽轉(zhuǎn)成無害的。
因此,為了能夠充分測試過濾模塊是否有效,需要精心地構(gòu)造出盡可能全面且有效的測試向量來繞過各種驗證函數(shù),從而挖掘出由于過濾模塊過濾不夠全面而造成的跨站腳本。測試向量包括攻擊向量、合法向量。傳統(tǒng)的檢測方法在攻擊過程中,對每個注入點的所有注入變量同時發(fā)送攻擊向量,但這會極大降低攻擊的成功率。本文模型提出在發(fā)送攻擊的過程中,每次攻擊僅對注入點的某個注入變量發(fā)送攻擊向量,而其他的注入變量使用合法向量。
針對Web應用程序過濾模塊可能采取的過濾方式[10],表1列舉部分常見的過濾方式,可依此制定出能夠繞過過濾模塊的攻擊向量。
表1 Web應用程序過濾方式
攻擊向量即指能夠執(zhí)行JavaScript代碼的惡意字符串(例如:),攻擊向量的類型多種多樣。通過分析許多著名安全工程師共同總結(jié)出的XSS Cheat Sheet(XSS過濾繞過備忘單)[11],本文在HTML4元素的基礎上,也引入了HTML5新標簽、新屬性構(gòu)建了基本候選元素庫(見表2),并構(gòu)造出基于HTML5的攻擊向量(見表3),最后總結(jié)出初始攻擊向量種子庫(見表4)。初始攻擊向量種子庫是指所有尚未經(jīng)過格式變換的已知的可以用于跨站攻擊的XSS代碼集合,庫中的每一個XSS代碼都代表了一種XSS攻擊類型。
表2 基本候選元素庫
表3 基于HTML5的攻擊向量示例
表4 初始攻擊向量種子庫
如果在Web應用的過濾模塊中,對某種編碼格式不支持的話,則可能通過編碼格式轉(zhuǎn)換的方式來繞過過濾[12-13]。在實際中,攻擊者會對攻擊向量做各種形式的變換來試圖規(guī)避過濾模塊對用戶輸入進行的過濾和凈化。其中編碼變換有十六進制編碼、八進制編碼或UTF-8編碼等。在初始攻擊向量經(jīng)過變換規(guī)則(見表5)變形后,添加模糊前綴,得到最終的攻擊向量。針對不同的輸出點類型應該選取相應的攻擊向量種子(見表6),才能夠在該輸出點位置上觸發(fā)JavaScript代碼的執(zhí)行。最后,由于僅通過攻擊向量自動生成算法構(gòu)造的攻擊向量并不能完全涵蓋所有的類型,因此本文模型另外構(gòu)建了攻擊向量靜態(tài)庫作為補充,使其覆蓋范圍更為全面。
表5 攻擊向量變換規(guī)則庫
表6 攻擊向量輸出點類型
傳統(tǒng)檢測方法沒有針對合法向量的選取與生成進行詳細分析,但合法向量的選取也是至為重要的。若僅使用數(shù)字與字母組合隨機生成的字符串作為合法向量,極為可能無法繞過過濾模塊,導致注入失敗。因此,本文提出根據(jù)表單相關信息(即輸入點類型),構(gòu)造出相應的合法向量。
例如:對于表單元素,通過有效信息可以判斷需要輸入的是郵箱地址,因此,自動生成向量如:xSs_sCanner123@test.com等,對于,通過分析相關有效信息可以判斷需要輸入的是網(wǎng)址,可生成向量如:http://www.scanner1.com等。表7列舉部分表單元素相關信息,利用這些信息有助于生成更加準確有效的合法向量。
表7 表單元素相關信息
本文模型總體結(jié)構(gòu)(如圖1所示)主要分為3個模塊,分別是注入點分析模塊、測試向量挖掘模塊、攻擊與分析模塊。各個模塊之間通過查詢與操作session對象或數(shù)據(jù)庫來完成相互協(xié)作。
圖1 本文模型總體結(jié)構(gòu)
完整、準確、高效地挖掘出所有頁面及漏洞注入點是增強檢測能力、減少漏報誤報的關鍵問題之一,注入點分析模塊(如圖2所示)在檢測中起著重要的作用。當前,網(wǎng)頁提供給用戶輸入數(shù)據(jù)的方式各式各樣,而傳統(tǒng)檢測中爬蟲的功能較為單一(如文獻[14]),僅能夠提取出表單內(nèi)容,比較難解析基于JavaScript或Ajax的提交方式,對于需要登錄后才能夠訪問的頁面無法獲取到。為了獲取更為全面的注入點,將跨站腳本攻擊的注入點可大致分為3類:1)表單輸入類;2)含參數(shù)的url類;3)基于JavaScript或Ajax的數(shù)據(jù)提交方式。注入點分析模塊通過爬蟲爬取目標站點的所有頁面,并分析頁面以獲取注入點及相關信息。本文采用多線程網(wǎng)絡爬蟲,在爬取過程中采取廣度優(yōu)先搜索策略,使用正則表達式匹配頁面中的url,過濾不屬于目標站點的url,并將相對路徑的url轉(zhuǎn)成絕對路徑加入到待爬取隊列中,同時使用Bloom Filter算法[15]對url進行去重。
圖2 注入點分析模塊結(jié)構(gòu)
在整個爬取過程中需要與Web服務器進行多次交互,針對一些需要登錄后才能訪問的頁面,需要保持會話狀態(tài),否則在訪問頁面時Web應用會拒絕訪問或者頁面重定向。本文方法運用cookie技術(shù)來解決這一問題,預先輸入用戶登錄的相關信息(如賬號、密碼等)以獲取返回的cookie信息,并需要將退出登錄的鏈接從待爬取url集合中刪去,當再次訪問頁面時,則將相應的cookie信息添加到爬蟲的HTTP請求協(xié)議頭中,使其能夠在爬取過程中保持會話狀態(tài),以獲取更多頁面。
在爬取url的過程中,分析注入點,將含參的url類與基于Ajax的數(shù)據(jù)提交類注入點使用表單類形式保存,統(tǒng)一注入點形式,同樣也需對注入點進行去重處理。
由第1節(jié)提供的攻擊向量基本候選元素庫,以及攻擊向量變換規(guī)則庫,并添加模糊數(shù)據(jù),例如注釋、空白符、tab鍵等,且動態(tài)生成模糊前綴,生成最終的攻擊向量(見表8)。
表8 最終的攻擊向量
并非所有用戶能夠輸入數(shù)據(jù)的地方都能夠?qū)е驴缯灸_本的產(chǎn)生。發(fā)生反射型和存儲型跨站腳本攻擊的必要條件是用戶輸入的數(shù)據(jù)能夠在某一個時刻被Web應用程序調(diào)用且加載到Web頁面中。
傳統(tǒng)檢測方法將攻擊向量提交至漏洞注入點,且對該注入點的所有注入變量同時使用攻擊向量進行攻擊,在攻擊過程中判斷漏洞是否存在只需檢測響應頁面中是否含有該攻擊向量,就能大致判斷漏洞是否存在。但這種檢測方法是不完善的,易造成漏報誤報,因為攻擊向量不僅可能出現(xiàn)在服務器響應頁面中,還可能某一個時刻出現(xiàn)在其他任何頁面中,并且在同一頁面中也可能有若干個不同的輸出點類型(如圖3所示)。
圖3 輸入數(shù)據(jù)輸出終點的處理過程示意圖
在檢測效率方面,傳統(tǒng)檢測方法針對每個注入點,將攻擊向量庫中的攻擊向量全部提交完成后才判斷漏洞是否存在,這樣會大大降低檢測效率。在現(xiàn)有動態(tài)生成攻擊向量的方法中,對于攻擊向量的選取大多數(shù)采用隨機選取方法,其優(yōu)點在于簡單快速,易于理解與實現(xiàn),但由于隨機選取方法中并沒有利用其他任何相關的信息,其檢測能力往往不是很理想。因此,如何使用較少的攻擊向量來盡快發(fā)現(xiàn)漏洞是尤為重要的。
為解決上述問題,本文提出單次攻擊只對某一注入點的某一個注入變量在某一輸出點類型上進行攻擊。首先,在檢測過程中根據(jù)注入變量的輸出點類型自動生成攻擊向量,并隨著當前時刻的檢測結(jié)果自適應調(diào)整攻擊向量優(yōu)先級,優(yōu)先選取攻擊成功概率較高的攻擊向量類型,以盡可能早地發(fā)現(xiàn)漏洞,彌補隨機選取方法的不足。
為了對不同漏洞注入點注入的攻擊向量進行區(qū)分,需要對每個注入點的某一個注入變量的攻擊向量分配一個唯一的標識(即攻擊向量ID),同時其他的注入變量根據(jù)輸入點類型自動選取相應合法向量,向Web應用服務器發(fā)送Get或Post請求。當檢測到特殊字符如<,>等標簽已經(jīng)被后臺實體化或過濾后,導致無法執(zhí)行腳本代碼,則停止對此注入點變量的攻擊。另外,將獲取到的輸出點類型攻擊完畢之后,若依舊沒有發(fā)現(xiàn)漏洞,則對每個注入變量都需要提交其他尚未選取的輸出點類型自動選取對應的攻擊向量進行攻擊,避免在其他頁面中有不同輸出點類型中出現(xiàn),造成漏報。在判斷攻擊是否成功的過程中,將分析頁面范圍擴大至注入點展示頁面、請求頁面以及服務器響應頁面,判斷漏洞存在當且僅當攻擊向量類型與輸出點類型相符合,并且攻擊向量ID與注入點變量相匹配,能夠觸發(fā)腳本代碼,才判定漏洞存在,這樣可以降低誤報率。
當所有注入點被攻擊完成后,對整個網(wǎng)站進行二次遍歷,檢測尚未被驗證的注入變量。如圖3所示,用戶輸入的數(shù)據(jù)可能在任何頁面的任何輸出點位置上,且每個輸出點位置可能是不同的輸出點類型,因此,僅僅在攻擊過程中同時根據(jù)反饋信息來判斷漏洞是否存在會造成漏報問題,二次遍歷對Web應用的原有頁面與新頁面進行重新遍歷搜索,查找所有尚未得到驗證的攻擊向量,一旦確認查找到的攻擊向量與相應的輸出點類型匹配,則判斷該攻擊向量對應的注入點變量是存在跨站腳本漏洞的,并將該注入點變量對應的所有攻擊向量移除,然后繼續(xù)匹配直到待查找的攻擊向量為空或者所有頁面已遍歷完畢,則整個檢測過程結(jié)束。
假設I指注入點集合,其中,Ii指第i個注入點,Iij指Ii的第j個注入變量,i∈{1,2,…,n}(n是注入點總數(shù)),j={1,2,…,m}(m是Ii的注入變量總數(shù)),P指輸出點類型集合,Pk指Iij的第k個輸出點位置,k∈{1,2,…,s}(s是Iij的輸出點類型總數(shù)),q指對Iij在Pk上的攻擊次數(shù),Ht指對Iij在位置Pk發(fā)送的第t次http請求,t∈{1,2,…,q},U指url集合,V指具有Iij標識的攻擊向量,Vlist指待檢測的攻擊向量列表。
輸入注入點集合I,url集合U
輸出發(fā)現(xiàn)的跨站腳本漏洞
具體檢測算法描述如下:
1)若i 2)若j 3)若k 4)若t 5)檢測相關反饋頁面中出現(xiàn)的V所在輸出點類型是否與攻擊向量V相符合,若是,則判定Iij存在漏洞,更新V的優(yōu)先級,并從Vlist中移除與Iij相關的V,停止攻擊Iij,重復第4個步驟。 6)檢測相關反饋頁面中出現(xiàn)的V所在輸出點類型,更新Iij的輸出點類型集合P。 7)檢測相關反饋頁面中出現(xiàn)的url,更新集合U。 8)檢測相關反饋頁面中是否存在被實體化后的攻擊向量,若是,且在Pk不符合觸發(fā)腳本執(zhí)行條件,判定此輸出點類型不存在漏洞,并結(jié)束對Iij在Pk的攻擊,重復第3個步驟;若否,重復第4個步驟。 9)遍歷U中所有的url,匹配Vlist中的V,若輸出點類型與V的類型相符合,則判定存在漏洞,并從Vlist中刪除與Iij相關的V。當U遍歷完畢或Vlist為空時,則檢測結(jié)束并輸出結(jié)果。 依據(jù)本文提出的檢測方法,設計并實現(xiàn)了一款自動化跨站腳本發(fā)現(xiàn)模型WXS,模型使用PHP作為服務器端腳本語言,具有易于進行維護和二次開發(fā)的特點。檢測流程簡單、實用性強、自動化程度高。為了驗證模型的有效性,同時使用著名商業(yè)工具WVS(Web Vulnerability Scanner)與APPScan對2個測試站點進行掃描測試。其中,站點1是自行搭建的個人博客站點,該網(wǎng)站使用PHP語言開發(fā),使用MySQL數(shù)據(jù)庫,站點2是某論壇網(wǎng)站,采用.NET框架,提供用戶留言評論等功能。檢測結(jié)果如表9和表10所示,表11為檢測耗時比較。 表9 站點1檢測結(jié)果 表10 站點2檢測結(jié)果 表11 檢測耗時比較 為了更好地體現(xiàn)出模型WXS的有效性,需要在真實環(huán)境下做測試。據(jù)XSSed官方(XSS漏洞公布平臺)截止到目前不完全數(shù)據(jù)顯示,現(xiàn)收集有45 884個XSS漏洞,已修復3 026個漏洞。本文實驗從XSSed平臺中分別收集已修復和尚未修復的漏洞各50例作為測試樣本,分別使用上述3種模型對其進行檢測,檢測結(jié)果如表12所示。 表12 XSSed平臺收集的測試樣本檢測結(jié)果 實驗結(jié)果表明,本文設計的模型WXS與其他工具相比較,能夠檢測出更多頁面和注入點,挖掘出漏洞數(shù)量較多,并且誤報數(shù)少。APPScan沒有針對Ajax提交數(shù)據(jù)的注入點類進行分析與研究,不能檢測出此類注入點。WVS與APPScan沒有進行二次遍歷掃描,并且缺乏對合法向量進行挖掘,容易被后臺過濾模塊過濾,存在漏報問題。在耗時方面,WXS發(fā)送的http請求次數(shù)(攻擊次數(shù))少于WVS與APPScan,說明在攻擊向量與合法向量的選取上有較強的能力。 本文在分析跨站腳本攻擊原理的基礎上,提出一種動態(tài)檢測反射型與存儲型跨站腳本方法,設計并實現(xiàn)了一款自動化檢測模型。該模型與同類檢測工具相比,能夠降低誤報率和漏報率,從而更加有效地發(fā)現(xiàn)Web應用中的跨站腳本漏洞。下一步將針對Dom-based XSS進行分析與研究,使所提模型能夠檢測出該類型的跨站腳本漏洞。3 實驗結(jié)果與分析
4 結(jié)束語