呂成成,張 龍,鄧 茜,曾凡平,3+,嚴(yán) 俊,張 健
1.中國科學(xué)技術(shù)大學(xué) 計算機(jī)科學(xué)與技術(shù)系,合肥 230026
2.中國科學(xué)院 軟件研究所 計算機(jī)科學(xué)國家重點實驗室,北京 100190
3.安徽省計算與通訊軟件重點實驗室,合肥 230026
隨著互聯(lián)網(wǎng)的快速發(fā)展,Web應(yīng)用程序迅速進(jìn)入普通用戶的視野[1]。為了方便用戶查詢感興趣的資源,許多Web 應(yīng)用程序會提供搜索功能。瀏覽器將用戶輸入的關(guān)鍵詞提交給服務(wù)器,然后服務(wù)器處理該請求并將查詢結(jié)果返回給用戶。如果開發(fā)者在實現(xiàn)該功能的時候,對用戶輸入的合法性沒有進(jìn)行充分的驗證,可能會帶來安全隱患。如果用戶輸入的數(shù)據(jù)中含有某些特殊字符,使得服務(wù)器程序無法正常執(zhí)行,就會產(chǎn)生錯誤響應(yīng),并將異常代碼拋到前端瀏覽器中或者直接在前端顯示服務(wù)器錯誤等信息。
例如,圖1(a)是某市疾控中心的主頁,當(dāng)搜索關(guān)鍵詞“占比%1”時,服務(wù)器不會返回正常的搜索結(jié)果,而是返回一個只包含錯誤信息的頁面,如圖1(b)所示,顯示服務(wù)器遇到內(nèi)部錯誤,服務(wù)端的java 程序遇到了“java.lang.NullPointerException”的異常,無法完成此請求。Web應(yīng)用程序中存在很多這樣的錯誤,圖2 是4 種不同的出錯頁面,都是因為搜索某些特殊字符導(dǎo)致的。這些應(yīng)用程序錯誤會導(dǎo)致服務(wù)器無法返回正常的搜索結(jié)果,同時有些錯誤頁面也會暴露敏感信息,如服務(wù)器物理路徑、堆棧調(diào)用信息、數(shù)據(jù)庫信息等。
此類故障的存在不但會影響用戶體驗,而且極有可能成為安全問題。比如,攻擊者在尋找SQL(structured query language)注入點時,通常會輸入某些特殊字符,如果服務(wù)器返回錯誤,很可能可以進(jìn)行SQL 注入,因為這表明Web 應(yīng)用程序中對用戶提交的數(shù)據(jù)未進(jìn)行合理的驗證或過濾[2-3]。同時,錯誤頁面暴露的敏感信息會為攻擊者提供極大的便利[4]。因此,對搜索功能的充分測試是非常有必要的。
對于Web 應(yīng)用程序的搜索功能,覆蓋全空間測試用例的完全測試幾乎是不可能完成的任務(wù),因為搜索空間巨大,無法在有限時間內(nèi)完全覆蓋。而只考慮搜索那些常見內(nèi)容的測試場景是很難滿足測試要求的,因為在實際操作中,用戶很可能不小心輸錯內(nèi)容,也有很多惡意用戶會嘗試搜索一些危險且不常用的字符。因此,測試用例要充分考慮各種常用和不常用字符及它們的組合??梢詫⒔M合測試的方法應(yīng)用到Web程序搜索功能上。
Fig.1 Search function display圖1 搜索功能展示
Fig.2 Web page error message圖2 網(wǎng)頁錯誤信息
在系統(tǒng)測試中,檢查系統(tǒng)參數(shù)的所有取值組合來進(jìn)行充分的測試需要花費很高的代價,因為隨著參數(shù)數(shù)量的增加,測試用例的數(shù)量呈指數(shù)增長。組合測試[5]是一種有效的黑盒測試方法,其充分考慮到系統(tǒng)中各參數(shù)之間的交互作用,進(jìn)而生成高質(zhì)量的測試用例。很多應(yīng)用程序錯誤是由少數(shù)幾個參數(shù)的相互作用導(dǎo)致的[5],例如Kuhn 和Reilly[6]分析了Mozilla瀏覽器的錯誤報告記錄,發(fā)現(xiàn)超過70%的錯誤是由某兩個參數(shù)的相互作用觸發(fā)的,超過90%的錯誤是由3個以內(nèi)的參數(shù)互相作用觸發(fā)的。組合測試(CT)[5]的方法就是選擇部分測試用例,可以覆蓋任意t(t是一個正整數(shù),且t≥2)個參數(shù)可能取值的全部組合。
如果執(zhí)行完測試用例后,有部分測試用例會引起服務(wù)器錯誤響應(yīng),可以使用組合測試錯誤定位的方法來找到這些字符組合。傳統(tǒng)的錯誤定位是想找到錯誤的根本原因以及錯誤在源碼中的位置,而本文這里的定位是想找到程序輸入中哪些參數(shù)及其取值組合會引起系統(tǒng)錯誤,本文提到的錯誤定位和錯誤組合定位都指后者。本文在已有的研究基礎(chǔ)上,結(jié)合搜索功能測試的特點,提出一種組合測試錯誤定位方法,可以有效地找到會引起錯誤組合。
對搜索功能的充分測試可以暴露出服務(wù)端程序在處理特殊字符組合時潛在的問題。而錯誤定位可以幫助開發(fā)者修復(fù)這些故障,提升網(wǎng)站的形象,提高用戶體驗,避免惡意用戶的攻擊。因此,對搜索功能的充分測試是非常有意義的。
總的來說,這篇文章主要有以下三點貢獻(xiàn):
(1)在Raunak 等人[7]的基礎(chǔ)上,實現(xiàn)了一個使用組合測試方法測試Web應(yīng)用程序的搜索功能原型工具,并提出一種組合測試錯誤定位方法,可以有效地找到會引起服務(wù)器錯誤響應(yīng)的字符組合。
(2)測試了96 個學(xué)校、政府和事業(yè)單位類網(wǎng)站,發(fā)現(xiàn)其中23 個網(wǎng)站的搜索功能存在問題,當(dāng)用戶搜索某些特殊字符組合時,會引起服務(wù)器的錯誤響應(yīng)。
(3)對存在問題的網(wǎng)站的錯誤定位結(jié)果進(jìn)行分析,發(fā)現(xiàn)56%的服務(wù)器錯誤響應(yīng)是由“%”“<”“’”“”和其他字符的組合引起的。
本文的組織結(jié)構(gòu)如下:第2章介紹組合測試的背景知識;第3 章介紹本文提出的方法;第4 章介紹實驗結(jié)果和評估;第5 章介紹相關(guān)的研究工作;第6 章是本文的總結(jié)與展望。
關(guān)于組合測試和錯誤定位,相關(guān)定義[8]如下:
定義1(SUT(software under testing)模型)一個SUT(k,s)模型有k個參數(shù)p1,p2,…,pk。s是一個長度為k的向量,可表示為,其中sj表示參數(shù)pi可能取值的個數(shù),pi的定義域為Di={di1,di2,…,disj}。
定義2(測試用例)一個測試用例t是一個長度為k的向量,可表示為,其中v1∈D1,v2∈D2,…,vk∈Dk,表示為SUT 中每個參數(shù)賦予一個確定的值,p1=v1,p2=v2,…,pk=vk。
定義3(測試用例集)一個測試用例集T是一組測試用例集合{t1,t2,…,tm}。
定義4(combinatorial interaction,CI)一個交互組合CI是一個長度為k的向量,其中t個參數(shù)賦予特定的值,剩下的k-t個參數(shù)未確定(未確定的值用-表示)。這里t表示CI 的大小。例如,長度為k的向量可表示一個大小為1 的CI,其中v1∈D1,它表示參數(shù)p1=v1,剩下的k-1個參數(shù)未確定。
定義5(CI 包含關(guān)系)一個CIP1被另一CIP2包含(contain),當(dāng)且僅當(dāng)P1的所有賦值的參數(shù)在P2中也被賦值,并且這些參數(shù)在P1和P2中被賦予了相同的值。一個CIP被測試用例T包含,當(dāng)且僅當(dāng)P中的所有賦值的參數(shù)具有與T中相同的值。
定義6(faulty combinatorial interaction,F(xiàn)CI)一個錯誤交互組合FCI是一種特殊的CI,所有包含它的測試用例都會失敗。
如果Pi是FCI,其他任何包含Pi的CI也是FCI。比如P1是一個FCI,且P2包含P1,所有包含P2的測試用例也都將包含P1,因此這些測試用例都會失敗,即P2也是FCI。組合測試的錯誤定位是想找到那些最小FCI(minimal FCI),最小FCI不包含任何比它小的FCI。
組合測試的錯誤定位主要可以分為兩種,非自適應(yīng)方法和自適應(yīng)方法。非自適應(yīng)的方法是指所有的測試用例可以并行執(zhí)行,不依賴于先前測試用例的執(zhí)行結(jié)果。Colbourn和McClary[9]提出了一種錯誤定位方法,他們通過構(gòu)造Locating Array 的方法來找到系統(tǒng)中的最小出錯組合。Zhang等[8]提出了一種基于約束求解和優(yōu)化技術(shù)的方法,無需生成額外的測試用例就可以找到最小出錯組合。自適應(yīng)的方法是指部分測試用例的選擇是基于先前測試用例的執(zhí)行結(jié)果。Zeller和Hildebrandt[10]提出了一種典型的自適應(yīng)方法。這種方法的主要思想是通過修改輸入?yún)?shù)來找到最小出錯組合。對于失敗的測試用例,修改其中部分參數(shù)的值;如果修改后的測試用例仍然是失敗的,則修改的參數(shù)與系統(tǒng)錯誤無關(guān);否則,修改的參數(shù)與系統(tǒng)錯誤有關(guān)。
圖3 是整體方法的流程圖。主要分成測試用例生成、測試用例執(zhí)行和錯誤組合定位三部分。下面詳細(xì)介紹各部分內(nèi)容。
Fig.3 Workflow of method in this paper圖3 方法流程圖
本文使用組合測試的方法來生成測試用例。組合測試是一種有效的測試方法,可以應(yīng)用于網(wǎng)站搜索功能的測試??梢愿鶕?jù)組合覆蓋率生成測試用例,測試強度為t(t為正整數(shù),且t≥2)的組合測試可以保證任何參數(shù)值的t組合至少被一個測試用例覆蓋。組合測試用例的構(gòu)造方法,多數(shù)是基于覆蓋數(shù)組的。組合測試設(shè)計過程可簡要描述如下:
(1)建立輸入模型(input model),模型包括有哪些參數(shù)以及每個參數(shù)的可能取值。
(2)根據(jù)輸入模型,生成覆蓋數(shù)組。
(3)將生成的覆蓋數(shù)組轉(zhuǎn)化為測試用例,覆蓋數(shù)組的每一行表示一個測試用例。
步驟(1)的輸入模型將在下面詳細(xì)介紹。步驟(2)使用組合測試用例生成工具ACTS[11](advanced combinatorial testing system)來生成覆蓋數(shù)組。ACTS由NIST(National Institute of Standards and Technology)和UTA(University of Texas at Arlington)聯(lián)合開發(fā),實驗表明,與類似工具相比,在覆蓋度t相同的情況下,ACTS生成的測試集較小,并且比其他類似工具更快,比如AETG(http://aetgweb.argreenhouse.com/)。步驟(3)將覆蓋數(shù)組轉(zhuǎn)化為測試用例并執(zhí)行,覆蓋數(shù)組中每一行是一個測試用例,每一個測試用例是一個由特殊字符組成的字符串。最后,通過組合測試錯誤定位的方法來找到是哪些特殊字符的組合引起的服務(wù)器錯誤響應(yīng)。各部分方法的詳細(xì)介紹如下。
從用戶提交輸入到得到返回頁面服務(wù)端程序?qū)τ脩糨斎肟赡艿奶幚聿僮饔校?/p>
(1)數(shù)據(jù)的編碼和解碼操作,如果用戶的輸入不滿足特定的參數(shù)格式,可能會引起錯誤(如URL(uniform resoure locator)解碼,可以考慮%與其他字符的組合)。
(2)過濾轉(zhuǎn)義操作:考慮到XSS(cascading style sheets)、SQL 注入等安全問題,很多網(wǎng)站會對用戶輸入進(jìn)行過濾和轉(zhuǎn)義,因此需要在輸入模型中加入部分XSS、SQL元素。
(3)查詢操作:服務(wù)端程序可能會將用戶的輸入拼接成數(shù)據(jù)庫查詢語句,當(dāng)存在某些特殊字符時,可能會改變查詢語句的語義從而引起錯誤。
可以構(gòu)造輸入模型如表1 所示,共有7 個參數(shù)。參數(shù)的選擇和取值并不是唯一的,開發(fā)者可以根據(jù)實際的需求來構(gòu)造模型。這里借鑒Bozic等[12-13]構(gòu)造XSS攻擊向量的方法,取7個參數(shù),各參數(shù)分別表示為:
參數(shù)1模擬輸入標(biāo)簽的結(jié)束符號。比如SQL查詢中,待比較的字符串應(yīng)該填充在兩個單引號之間,參數(shù)1 選擇單引號可以模擬SQL 語句中單引號作用區(qū)間的結(jié)束,使后面的字符組合可以當(dāng)作代碼被執(zhí)行。
參數(shù)2表示打開一個作用區(qū)間,比如“{”等,可以與后面的關(guān)閉標(biāo)記“}”組成一個作用區(qū)間。
參數(shù)3、4、5表示在參數(shù)2 和參數(shù)6 構(gòu)成的作用區(qū)間中特殊字符組合,比如英文字母“aBcD”、數(shù)字“22”、標(biāo)點符號“?”、運算符號“+”、其他特殊字符“&”等。
參數(shù)6關(guān)閉由參數(shù)2打開的作用區(qū)間,比如“}”,可以與前面的打開標(biāo)記“{”組成一個作用區(qū)間。
參數(shù)7表示在輸入末尾有特殊作用的關(guān)鍵詞,比如在SQL語句中有注釋作用的“#”。
該模型可表示為一個SUT(7,<7,9,9,8,6,6,5>)。從每個參數(shù)的取值范圍中選擇一個值組成一個用于搜索的字符串,每個參數(shù)分別有7、9、9、8、6、6、5個可能取值,這樣一共有816 480 種不同的字符串,而使用ACTS 構(gòu)造的覆蓋強度為2 的測試集只需要81 個測試用例。
Table 1 Input model表1 輸入模型
在這個輸入模型中,space代表空格,NULL表示不取一個空字符。其中,數(shù)字和字母組合有aBcD、script、11 等;特殊字符有(、)、[、]、{、}、<、>、”、’、、%、!、?、~、/、|、&、-、、,、.、^、+、=、*、#,包括運算符號、標(biāo)點符號等。
通過組合測試工具生成測試用例,每一個測試用例是一個由特殊字符組成的字符串。對于每一個測試用例,通過構(gòu)造URL來模擬查詢字符串,如果返回正常的頁面,則認(rèn)為此測試用例的執(zhí)行結(jié)果為通過,如果服務(wù)端直接將異常代碼拋到前端瀏覽器,或者在前端瀏覽器顯示服務(wù)器錯誤,就認(rèn)為此測試用例的執(zhí)行結(jié)果為失敗。
在實際測試中,可能遇到以下兩種情況。(1)IP限制,即如果檢測到同一IP 在短時間內(nèi)發(fā)送大量請求,則限制該IP的訪問;(2)存在部分無效測試用例,可能的原因之一是Web 應(yīng)用程序內(nèi)部的防御機(jī)制。如果用戶的輸入滿足防御機(jī)制內(nèi)置的安全規(guī)則,則重置鏈接或拒絕執(zhí)行此請求[14]。
對于第一種情況,采用停止等待或者更換IP 的方法,同時這也要求本文的測試用例規(guī)模不能太大。
第二種情況中,部分測試用例可以得到執(zhí)行結(jié)果,而部分測試用例無法得到執(zhí)行結(jié)果,是無效的。無效測試用例中所包含的字符組合會因為測試用例無效而無法被覆蓋到,這種行為在組合測試中稱為masking effect[15]。造成部分測試用例無效的原因是由于包含了部分字符及其組合,可以生成額外的測試用例來解決這個問題。
發(fā)現(xiàn)一個測試用例t=是無效的,使用Simplified-One-Factor-One-Time[16]的方法對測試用例進(jìn)行變異,構(gòu)造k個額外的測試用例,,其中*表示一個隨機(jī)的并且和原測試用例不相同的值。這樣因為原測試用例無效而無法被覆蓋到的組合可以重新被覆蓋到。
比如,對于一個目標(biāo)網(wǎng)站,有測試用例“’{script|^>#”,在執(zhí)行該測試用例時,因為“’”的出現(xiàn)該字符串滿足此網(wǎng)站的安全規(guī)則,服務(wù)器拒絕執(zhí)行該請求,則該測試用例無效。此時,無法確定其他字符及組合是否會引起服務(wù)器內(nèi)部錯誤,實際上,“{script”是會引起服務(wù)器錯誤的。此時,可以使用一階變異的方法額外生成7個測試用例,“{script|^>#”“’script|^>#”“’{|^>#”“’{script^>#”“’{script|>#”“’{script|^#”“’{script|^>”。執(zhí)行這7個測試用例,其中“{script|^>#”這個字符串會引起服務(wù)器內(nèi)部錯誤。這樣,就不會因為該測試用例無效而使錯誤組合“{script”無法被發(fā)現(xiàn)。
對于存在錯誤的Web 應(yīng)用,通過組合測試錯誤定位的方法來找到是哪些特殊字符的組合引起的服務(wù)器錯誤響應(yīng)。使用組合測試生成字符串進(jìn)行測試時不需要全部參數(shù),只使用部分參數(shù),也能構(gòu)造一個測試用例,可以將這個特點應(yīng)用到錯誤定位中。
Raunak 等[7]使用了Colbourn 和McClary[9]提出的一種非自適應(yīng)的組合測試錯誤定位方法。在該方法的基礎(chǔ)上,提出一種新的錯誤定位方法。該方法的算法過程如算法1所示。
算法的第一步是得到一組可疑的CI集合。算法的輸入是一組測試用例的執(zhí)行結(jié)果,F(xiàn)ail_T表示失敗測試用例集,Pass_T表示通過測試用例集,輸出是FCI集合(出錯組合)。算法的第一行將Minimal_FCI設(shè)置為空集,它將用來保存找到的FCI。算法的第2行,是找出可疑CI集合。如果一個CI出現(xiàn)在失敗測試用例中,它可能是一個FCI,如果一個CI出現(xiàn)在通過的測試用例中,它一定不是FCI。這樣,那些出現(xiàn)在失敗測試用例中,但沒出現(xiàn)在通過測試用例集中的CI就是可疑CI。用Fail_T包含的全部CI減去Pass_T中包含的全部CI,則會刪除一定不可能是FCI的CI,但剩下的CI不一定就是FCI,Susp_CI_Set表示這些可疑的CI集合。
算法的第二步是從可疑CI集合中得到最小出錯組合(minimal FCI)。本文和Raunak 等[7]的方法有所不同。Raunak 的方法假設(shè)Pi,Pj∈Susp_CI_Set,且Pi包含Pj。Pi和Pj都能引起錯誤,但Pi不是最小出錯組合(minimal FCI),需要將Pi刪除。因此Raunak將Susp_CI_Set包含其他CI的CI刪除,得到的就是最終結(jié)果。這種方法的有效性不高,因為會存在部分CI雖然只出現(xiàn)在了失敗測試用例中,但并不能導(dǎo)致服務(wù)器錯誤,不能將其當(dāng)作FCI,因此也就不能將包含此CI的其他CI直接刪除。
為提高定位的有效性,本文從算法的第3行到第11行,確認(rèn)Susp_CI_Set中可疑的CI是否為FCI。因為希望找出最小出錯組合,所以從大小為1 的CI開始確認(rèn),如果這個CI構(gòu)成的測試用例執(zhí)行結(jié)果為失敗,它就是FCI,將其加入到Minimal_FCI,如算法的第7行所示。因為包含此CI的其他CI也是FCI,但不是最小出錯組合,在算法的第8 行,將Susp_CI_Set中包含此FCI的其他CI刪除。確認(rèn)完大小為k的FCI后,返回Minimal_FCI。此時,Minimal_FCI就是錯誤定位到的最終結(jié)果。
算法1組合測試錯誤定位
輸入:失敗測試用例集Fail_T,通過測試用例集Pass_T。
輸出:FCI集合。
在python 3.5.4 環(huán)境下實現(xiàn)了一個原型工具,可以實現(xiàn)本文提到的全部方法。使用該工具測試實際中的Web應(yīng)用程序。
360 發(fā)表的《2017 中國網(wǎng)站安全形勢分析報告》(http://zt.#/1101061855.php?dtid=1101062368&did=490995546)顯示,教育培訓(xùn)、政府機(jī)構(gòu)和事業(yè)單位這3個行業(yè)的網(wǎng)站是檢測出網(wǎng)站漏洞最多的行業(yè)。搜索功能的測試和網(wǎng)站的安全關(guān)系密切,而且政府、學(xué)校等網(wǎng)站是面向大眾的,具有特定權(quán)威、嚴(yán)肅等屬性,這些網(wǎng)站出現(xiàn)故障將極大影響公共安全和其公信力。從安徽、北京、陜西等地的學(xué)校,政府機(jī)構(gòu)和事業(yè)單位網(wǎng)站中收集了96 個提供搜索功能的網(wǎng)站,其中有:48個學(xué)校類網(wǎng)站,包括12個研究生院網(wǎng)站,3個大學(xué)網(wǎng)站和5個中學(xué)網(wǎng)站;40個政府機(jī)構(gòu)網(wǎng)站,包括13個省政府網(wǎng)站和27個市政府網(wǎng)站;8個事業(yè)單位類網(wǎng)站。在這96個網(wǎng)站中,有76個使用get方法發(fā)送http請求,有20個網(wǎng)站使用post方法發(fā)送http請求。
使用組合測試的方法測試了這96 個網(wǎng)站,實驗結(jié)果發(fā)現(xiàn),96 個網(wǎng)站中共有23 個網(wǎng)站的搜索功能存在問題,實驗結(jié)果如表2所示。其中在8個事業(yè)單位類的網(wǎng)站中,有3 個網(wǎng)站存在錯誤,占比最高為37.5%;48 個學(xué)校類的網(wǎng)站中存在錯誤的網(wǎng)站有15個,占為31.25%,有50%的研究生院網(wǎng)站存在錯誤,相比于大學(xué)和中學(xué)網(wǎng)站,研究生院的網(wǎng)站更容易檢測到錯誤;40 個政府機(jī)構(gòu)網(wǎng)站中存在錯誤網(wǎng)站有5個,占比最小,為12.5%,市政府網(wǎng)站比省政府網(wǎng)站更容易檢測出錯誤。
在這96 個網(wǎng)站中,使用get 方法的76 個網(wǎng)站中,有14個網(wǎng)站存在錯誤,占比為18.4%。使用post方法的20個網(wǎng)站中,有9個網(wǎng)站存在錯誤,占比為45.0%。在本次實驗中,使用post方法發(fā)送http請求的網(wǎng)站更容易檢測出錯誤。
Table 2 Results of Website testing表2 網(wǎng)站測試結(jié)果
對搜索功能存在錯誤的22個網(wǎng)站進(jìn)行錯誤定位(剩下的一個網(wǎng)站,雖然檢測到了錯誤,但因為它對ip的限制嚴(yán)格而無法錯誤定位),來確定是哪些字符組合引起的服務(wù)器錯誤。共發(fā)現(xiàn)112 種不同的FCI,對應(yīng)著112 種不同的會引起網(wǎng)站服務(wù)器錯誤的字符組合。這112種FCI的大小的分布圖如圖4,可見大小為2的FCI共有65種,占比最大,93.75%的FCI值小于3。
Fig.4 FCI size distribution圖4 FCI大小分布圖
根據(jù)這些會引起服務(wù)器錯誤的字符組合的頻數(shù)進(jìn)行了統(tǒng)計,統(tǒng)計結(jié)果如表3所示。頻數(shù)最多字符組合共出現(xiàn)了11次,是“%!”“%?”“%/”“%~”,并且56%的服務(wù)器錯誤都是由“%”“<”“’”“”和其他字符的組合引起的。根據(jù)部分網(wǎng)站的應(yīng)用程序錯誤信息,分析這些字符組合引起服務(wù)器錯誤的可能原因如下:
“%”:“%”通常會用來做URL 編碼,Web 程序?qū)⒂脩籼峤坏妮斎胫苯油ㄟ^get或post方法提交到服務(wù)器,服務(wù)器程序會先對輸入做URL 解碼,此時包含“%”并且不符合URL編碼規(guī)則的輸入就會引起程序崩潰,造成服務(wù)器錯誤響應(yīng)。
Table 3 Result of fault location表3 錯誤定位結(jié)果
“<”:“<”是一個常見的html標(biāo)簽,和XSS注入關(guān)系密切。在asp.net 程序中,如果檢測到用戶提交的輸入中含有“
“’”:SQL 查詢中,待比較的字符串應(yīng)該填充在兩個單引號之間,如果用戶提交的輸入中含有“’”,且服務(wù)端程序直接將用戶輸入拼接成SQL語句進(jìn)行查詢,就會導(dǎo)致SQL查詢的異常,從而造成服務(wù)器的錯誤響應(yīng)。一般來說,如果含有“’”的字符組合可以引起服務(wù)器的錯誤響應(yīng),則該網(wǎng)站有很大的可能存在SQL注入的漏洞[2-3]。
“”:在正則表達(dá)式中以及SQL 語句中表示轉(zhuǎn)義字符,表示下一個字符為特殊字符。服務(wù)端程序在處理含有“”的輸入(比如java 程序中的replaceAll()方法)或者進(jìn)行SQL查詢時,沒有考慮到“”的特殊含義,可能會引起服務(wù)器的錯誤響應(yīng)。
同時,也將本文的測試方法應(yīng)用到部分商業(yè)網(wǎng)站的測試中。在一個招聘網(wǎng)站的測試中檢測到了問題,下面詳細(xì)介紹本文的測試過程。分別執(zhí)行覆蓋強度為2、3、4的測試用例,執(zhí)行結(jié)果如表4所示。使用錯誤定位的方法來找到引起系統(tǒng)錯誤的字符組合,定位結(jié)果如表5所示。
Table 4 Results of test case execution表4 測試用例執(zhí)行結(jié)果
Table 5 Results of fault location of recruitment Website表5 招聘網(wǎng)站的錯誤定位結(jié)果
可以發(fā)現(xiàn),覆蓋強度2、3、4生成的測試用例中失敗測試用例的比例基本相似,覆蓋強度3、4的錯誤定位結(jié)果是相同的,這些錯誤組合主要是由%和其他字符的組合引起的??赡艿囊粋€原因是包含特殊字符組合(比如“%!”“%?”)的輸入會因為不符合URL解碼函數(shù)的輸入而引起了“Internal Server Error”的響應(yīng)。
在實際情況中,部分Web 應(yīng)用程序在測試時存在masking effect 情況。此時,采用Simplified-One-Factor-One-Time的測試用例變異的方法生成額外的測試用例來解決這個問題。在96 個測試網(wǎng)站中,檢測到有26 個網(wǎng)站存在這樣的情況,其中有3 個網(wǎng)站存在錯誤。無效測試用例的存在使得某些錯誤組合無法被覆蓋到。比較3 個存在無效測試用例且搜索功能存在錯誤的網(wǎng)站的錯誤定位結(jié)果,發(fā)現(xiàn)有兩個網(wǎng)站在執(zhí)行完變異測試用例后定位到的錯誤組合數(shù)比不執(zhí)行變異測試用例定位到的錯誤組合數(shù)多1。由此可見,使用測試用例變異的方法可以使錯誤定位得到的結(jié)果更全面。
Raunak 等[7]使用Colbourn 和McClary[9]提出的組合測試錯誤定位方法,將這種方法記作Method_A。本文的方法記作Method_B。主要考慮兩方面:(1)錯誤定位方法是否可以找到所有的錯誤組合;(2)錯誤定位方法找到的結(jié)果是否準(zhǔn)確。從“查全率”和“查準(zhǔn)率”兩方面來分析兩種組合測試錯誤定位方法在Web應(yīng)用程序搜索功能測試上的有效性。在15個存在錯誤的學(xué)校類網(wǎng)站中,有6個網(wǎng)站存在IP限制和無效測試用例,以剩下的9個學(xué)校類網(wǎng)站為測試對象。
“查全率”是指錯誤定位方法能不能找到所有的錯誤組合??梢詫⒍ㄎ坏降腇CI 轉(zhuǎn)換為約束加入到輸入模型中,重新生成測試用例,使得生成的測試用例不包含任何定位到的FCI。例如,有SUT,它的3 個參數(shù)為p1{0,1}、p2{0,1}、p3{0,1},定位得到的FCI為此時可以生成約束(約束定義方式使用ACTS[10]工具的定義標(biāo)準(zhǔn))如下:
[Constraint]
!(p1=0&&p2=1)
!(p1=0&&p3=1)
!(p2=0&&p3=0)
兩種錯誤定位方法的“查全率”執(zhí)行結(jié)果如表6所示??梢钥吹?,在9 個被測Web 應(yīng)用中,有8 個Web應(yīng)用在將Method_A定位得到的FCI以約束的形式加入到模型后生成的測試用例的執(zhí)行結(jié)果為全部通過,7 個Web 應(yīng)用在將Method_B 定位得到的FCI以約束的形式加入到模型后生成的測試用例的執(zhí)行結(jié)果為全部通過。將覆蓋強度增加到4時,其余兩個Web 應(yīng)用的執(zhí)行結(jié)果也全部為正確。這說明兩種定位方法可以全面地找到被測系統(tǒng)中的錯誤組合。
“查準(zhǔn)率”是指定位得到的字符組合中確定會引起服務(wù)器錯誤的字符組合所占的比例。每次從定位結(jié)果中取出一個FCI,在輸入模型中加入約束,使得重新生成測試用例全都包含此FCI而不包含任何其他的FCI。例如,有,它的3個參數(shù)為p1{0,1}、p2{0,1}、p3{0,1},定位得到的FCI 為對于可以生成約束如下:
[Constraint]
(p1=0&&p2=1)
!(p1=0&&p3=1)
!(p2=0&&p3=0)
[Constraint]
(p1=0&&p3=1)
!(p1=0&&p2=1)
!(p2=0&&p3=0)
對于選中的FCI,使用這種方法重新生成的所有測試用例都將包含此FCI 且不包含任何定位到的其他FCI。如果所有的測試用例執(zhí)行結(jié)果都引起服務(wù)器的錯誤響應(yīng),就認(rèn)為此FCI為有效的FCI,否則是無效的。將定位得到的所有FCI 中有效的FCI 所占的比例記作“查準(zhǔn)率”。
兩種錯誤定位方法的“查準(zhǔn)率”執(zhí)行結(jié)果如表7所示。使用Method_A 定位得到的錯誤組合的數(shù)量比較多,但平均只有7.4%的錯誤組合是有效的。使用Method_B 定位得到的錯誤組合中,平均有77.2%的錯誤組合是有效的,而且有5個網(wǎng)站的定位結(jié)果是100%有效的。這說明相比于Method_A,Method_B能夠更為準(zhǔn)確地找到被測網(wǎng)站中的錯誤組合。
Table 6 “recall”of fault location method表6 錯誤定位方法“查全率”
Table 7 “precision”of fault location method表7 錯誤定位方法“查準(zhǔn)率”
同時注意到,有一些網(wǎng)站,它們執(zhí)行相同覆蓋強度生成的測試用例的結(jié)果相同,比如csu和cupl,uibe和buct,雖然它們的前端顯示頁面不同,但后端處理程序很可能是相同的。
實驗結(jié)果表明,本文的方法實現(xiàn)的工具可以有效地測試Web 應(yīng)用程序的搜索功能,本文的錯誤定位方法可以準(zhǔn)確地找到出錯字符組合。但測試的方法仍有不足,有些網(wǎng)站可能并不會讓錯誤信息在前端瀏覽器上顯示,因此無法判斷本文的測試用例是否會引起服務(wù)器內(nèi)部錯誤。開發(fā)者可以通過讀取系統(tǒng)日志來解決此問題。
對于許多復(fù)雜的軟件系統(tǒng),通常有不同的組件、選項或參數(shù)相互作用。對于這樣的系統(tǒng),組合測試是一種非常有效的黑盒測試技術(shù),它可以應(yīng)用于不同的測試級別,如單元測試、集成測試和系統(tǒng)測試。最近,有不少研究者將這種測試方法應(yīng)用到Web測試和安全測試。
使用組合測試來檢測Web應(yīng)用程序的搜索功能是否存在錯誤,而Bozic 和Simos 等[12-13,17]則將組合測試以及組合測試錯誤定位的方法應(yīng)用到XSS攻擊檢測上。Bozic使用不同組合強度生成的字符串測試用例對3個Web程序進(jìn)行測試,結(jié)果顯示組合測試的方法十分有效。在接下來的研究中,他們將約束條件加入到組合測試模型中,能顯著提高測試用例的質(zhì)量。Simos 等[17]在Bozic 的基礎(chǔ)上,繼續(xù)研究組合測試在XSS攻擊上的應(yīng)用。他們使用組合測試錯誤定位的方法來識別XSS 誘導(dǎo)組合,XSS 誘導(dǎo)組合是輸入?yún)?shù)值的組合,任何包含此誘導(dǎo)組合的測試用例一定會在運行時成功觸發(fā)XSS漏洞。XSS誘導(dǎo)組合的識別有助于更好地理解XSS 漏洞的根本原因,幫助安全人員設(shè)計有效的過濾函數(shù)來避免這些漏洞。
Raunak 等[7]將組合測試的方法應(yīng)用到Web 應(yīng)用程序的搜索功能測試上。在國家漏洞庫(National Vulnerability Database,NVD)網(wǎng)站開發(fā)實現(xiàn)新功能后,開發(fā)人員發(fā)現(xiàn)某些特殊字符會導(dǎo)致“服務(wù)器錯誤”響應(yīng)。然而,不清楚哪些特殊字符的特定組合觸發(fā)了這種響應(yīng),以及還存在多少這樣的問題。他們使用組合測試的方法生成測試用例,并用錯誤定位的方法找到出錯組合,最后發(fā)現(xiàn)了49個輸入會引起“服務(wù)器錯誤”響應(yīng)。但是,使用該錯誤定位方法找到的字符組合中有很多是無效的。本文的錯誤定位方法將每個可疑組合轉(zhuǎn)化成測試用例執(zhí)行,這樣可以更有效地找到出錯字符組合。
Qi等[18]提出了一種帶約束的成對測試(覆蓋強度為2 的組合測試)算法,稱為PTC(pairwise testing with constraints),以充分測試網(wǎng)站的表單交互過程。PTC算法使用組合測試生成需要提交的表單數(shù)據(jù),并能夠通過增加約束的方式處理語義約束和非法值的問題。根據(jù)算法實現(xiàn)了一個原型工具ComjaxTest,它能夠系統(tǒng)地探索Web應(yīng)用程序的狀態(tài)空間。實驗結(jié)果表明,采用PTC 算法配置的ComjaxTest 實現(xiàn)了動態(tài)網(wǎng)頁的高覆蓋率,并在一定時間內(nèi)能檢測出更多的錯誤。他們的測試用例是基于表單數(shù)據(jù)生成的,目的是達(dá)到高的網(wǎng)頁覆蓋率,而本文的測試用例是基于搜索的關(guān)鍵字生成的,目的是為了引起更多的服務(wù)器錯誤響應(yīng)。
Wang等[19]基于組合測試提出了一種新的用于檢測緩沖區(qū)溢出漏洞的黑盒測試方法。他們根據(jù)程序的外部參數(shù)生成測試用例,模擬攻擊者利用緩沖區(qū)溢出漏洞的過程來檢測漏洞。他們將這種方法應(yīng)用到5個開源程序上,可以有效地檢測這些程序中的緩沖區(qū)溢出漏洞。他們利用組合測試通常能達(dá)到高代碼覆蓋率的事實,可以讓程序能夠到達(dá)攻擊點,而本文使用組合測試是因為組合測試生成的測試用例可以覆蓋更多的字符組合。
相比于組合測試,模糊測試在Web 程序安全測試方面有著更多的應(yīng)用。Tripp等[20]提出一種Web應(yīng)用程序安全測試工具XSS Analyzer。XSS Analyzer根據(jù)語法規(guī)則生成XSS 攻擊向量,并從未成功注入的攻擊向量中學(xué)習(xí)語法規(guī)則中的約束,即攻擊向量中不能包含哪些單詞,從而繞過Web 應(yīng)用程序的檢測。XSS Analyzer定位攻擊向量中的無效元素的方法與本文方法不同,XSS Analyzer首先將攻擊向量分解成一組單詞,并將每個單詞發(fā)送到目標(biāo)Web程序,確認(rèn)哪些單詞是無效的。這種做法的有效性不高,無法解決多個單詞組合出現(xiàn)時才會無效的情況,而且將每個單詞都發(fā)送到目標(biāo)Web程序會造成大量的http請求。
Appelt等[14]將機(jī)器學(xué)習(xí)和進(jìn)化算法相結(jié)合,提出一種算法ML-Driven,可以繞過防火墻進(jìn)而注入SQL語句。該方法可以自動生成測試用例并發(fā)送到防火墻,檢測它們是否可以成功繞過防火墻。根據(jù)測試用例的執(zhí)行結(jié)果,使用機(jī)器學(xué)習(xí)的算法來選擇最有可能繞過的測試用例進(jìn)行測試和變異。在實際測試中也會遇到防火墻的情況,但與ML-Driven 方法不同,本文的目的是為了能覆蓋到更多的字符組合,因此選擇生成額外的測試用例來解決這個問題。
通過構(gòu)造URL并動態(tài)執(zhí)行的方法來判斷該URL的執(zhí)行結(jié)果,同時也可以通過分析這些URL 的特征來做出判斷。Sheykhkanloo[21]則使用深度學(xué)習(xí)的方法來判斷。他們將SQL 標(biāo)簽加入到正常的URL 中,使之成為一個惡意的SQL 注入的URL,并根據(jù)這些正常的URL 和惡意的URL 訓(xùn)練深度學(xué)習(xí)模型,該模型可以有效地檢測URL 為正常的或惡意的,并可以識別URL的注入類型。Rathore等[22]則提出一種基于機(jī)器學(xué)習(xí)的檢測SNS(social networking services)XSS漏洞的方法。他們在選擇特征時不只考慮到了URL的特點,同時也考慮到了生成的網(wǎng)頁中html 元素以及SNS特征的影響。
將組合測試的方法應(yīng)用到Web應(yīng)用程序的搜索功能,并結(jié)合搜索功能測試的特點,提出一種組合測試錯誤定位方法來找到具體是哪些特殊字符的組合會引起系統(tǒng)錯誤。實現(xiàn)了一個原型工具,并對學(xué)校、政府類和事業(yè)單位的96 個網(wǎng)站進(jìn)行了測試,其中23個網(wǎng)站在搜索某些特殊字符組合時,會引起服務(wù)器錯誤響應(yīng)。錯誤定位的結(jié)果表明,56%的服務(wù)器錯誤響應(yīng)是由“%”“<”“’”“”和其他字符的組合引起的。實驗結(jié)果表明,本文的方法可以有效地測試Web 應(yīng)用程序的搜索功能,該錯誤定位方法可以準(zhǔn)確地找到出錯字符組合。
未來工作中,主要考慮兩方面的工作:一是完成一個Web 應(yīng)用程序輸入?yún)?shù)的自動化的測試工具,并將其應(yīng)用到更多的網(wǎng)站測試中;二是把組合測試應(yīng)用在Web應(yīng)用程序安全測試上。搜索功能存在錯誤的網(wǎng)站有很大可能存在可注入代碼的漏洞。組合測試的方法可以生成高質(zhì)量的測試用例來測試這些Web應(yīng)用程序的安全問題。