栗迎結(jié),任洪敏
(上海海事大學(xué)信息工程學(xué)院計(jì)算機(jī)系,上海 201306)
基于Selenium的SQL注入漏洞檢測(cè)系統(tǒng)的研究
栗迎結(jié),任洪敏
(上海海事大學(xué)信息工程學(xué)院計(jì)算機(jī)系,上海 201306)
在對(duì)Web應(yīng)用進(jìn)行安全漏洞檢測(cè)時(shí),手動(dòng)檢測(cè)和所使用的網(wǎng)頁(yè)比對(duì)算法都會(huì)影響到檢測(cè)的準(zhǔn)確率和效率,在傳統(tǒng)的SQL注入漏洞檢測(cè)技術(shù)的基礎(chǔ)上建立一個(gè)基于Selenium的自動(dòng)化檢測(cè)系統(tǒng),并使用優(yōu)化的Simhash文本相似性檢測(cè)算法來(lái)提高系統(tǒng)性能,通過(guò)實(shí)驗(yàn)驗(yàn)證該系統(tǒng)的可行性和檢測(cè)結(jié)果的可信度。
Web漏洞;SQL注入;Selenium;Simhash
在計(jì)算機(jī)技術(shù)飛速發(fā)展的當(dāng)今社會(huì),隨著互聯(lián)網(wǎng)的普及使用,網(wǎng)絡(luò)成為了人類生活和工作不可或缺的一部分。各種各樣的Web應(yīng)用也被大家使用,這些作為人類溝通交流的主流載體,承載著大量的私有或公有信息。但是,網(wǎng)絡(luò)給人類帶來(lái)便利的同時(shí),也不可避免的出現(xiàn)大量漏洞,在這其中,SQL注入漏洞是一種最常見(jiàn)也是危害性最大的網(wǎng)絡(luò)漏洞,如果這些帶有漏洞的Web應(yīng)用受到攻擊,數(shù)據(jù)庫(kù)里的信息遭到泄露,就會(huì)極大影響人類生活,甚至是經(jīng)濟(jì)發(fā)展和社會(huì)穩(wěn)定。
因此,為了防御Web應(yīng)用受到的SQL注入攻擊,人們采用各種漏洞掃描技術(shù)主動(dòng)檢測(cè)SQL注入漏洞,避免一些網(wǎng)絡(luò)安全隱患。本文針對(duì)現(xiàn)有檢測(cè)技術(shù)的效率問(wèn)題,在基于Selenium測(cè)試用例的基礎(chǔ)上建立一個(gè)針對(duì)小型網(wǎng)站的自動(dòng)化SQL注入漏洞檢測(cè)系統(tǒng)。
SQL語(yǔ)言是用來(lái)對(duì)關(guān)系數(shù)據(jù)庫(kù)進(jìn)行結(jié)構(gòu)化查詢的語(yǔ)言。SQL注入的概念就是把SQL命令插入到Web域名或頁(yè)面表單的字符串中,由于SQL注入表面上與一般的Web訪問(wèn)請(qǐng)求相似,防火墻等監(jiān)控設(shè)備不容易檢測(cè)到,服務(wù)器便會(huì)執(zhí)行惡意的SQL命令。SQL注入攻擊的基本原理:構(gòu)建符合語(yǔ)法要求的SQL語(yǔ)句,插入到網(wǎng)頁(yè)鏈接地址和form表單中,Web應(yīng)用執(zhí)行SQL語(yǔ)句,得到攻擊結(jié)果。
現(xiàn)有的對(duì)SQL注入漏洞的檢測(cè)可以分為客戶端檢測(cè)和服務(wù)端檢測(cè)兩種。客戶端檢測(cè)是通過(guò)比較注入前后網(wǎng)頁(yè)的變化來(lái)實(shí)現(xiàn)的;而服務(wù)端檢測(cè)需要通過(guò)檢測(cè)后臺(tái)代碼、數(shù)據(jù)庫(kù)等來(lái)實(shí)現(xiàn),屬于白盒測(cè)試。本文對(duì)SQL注入漏洞的檢測(cè)是基于Selenium的黑盒測(cè)試,也就是客戶端檢測(cè),先通過(guò)服務(wù)器發(fā)送一次正常請(qǐng)求,得到一個(gè)頁(yè)面;然后構(gòu)造SQL語(yǔ)句再次發(fā)送請(qǐng)求,又得到一個(gè)頁(yè)面,通過(guò)網(wǎng)頁(yè)比對(duì)算法比較兩個(gè)網(wǎng)頁(yè)差異,然后根據(jù)測(cè)試用例判斷SQL注入漏洞是否存在。
進(jìn)行網(wǎng)頁(yè)比對(duì)的算法有很多,其中Simhash算法是目前Google公司在使用的海量數(shù)據(jù)查重算法,該算法的高效性也是被公認(rèn)的。Simhash算法分為5個(gè)步驟:分詞、hash、加權(quán)、合并、降維。算法的原理如圖1所示。
利用Simhash算法比較網(wǎng)頁(yè)特征值的主要思想是:首先將兩個(gè)頁(yè)面的HTML文檔以詞為單位進(jìn)行拆分處理,然后通過(guò)Hash算法把每個(gè)詞計(jì)算成Hash值,通過(guò)Simhash算法分別計(jì)算出兩個(gè)網(wǎng)頁(yè)的特征值,進(jìn)行比較后便可判斷兩個(gè)網(wǎng)頁(yè)的異同。流程如下:
(1)對(duì)HTML文檔進(jìn)行分詞處理
HTML文檔中的各個(gè)部分,各個(gè)符號(hào)都有不同的意義,因此若要計(jì)算出一個(gè)HTML文檔的特征值,就需要對(duì)HTML文檔以詞為單位進(jìn)行拆分處理,如去除停詞,詞根還原。

圖1 Simhash算法原理圖
(2)調(diào)用Simhash算法計(jì)算特征值
得到分詞的HTML文檔后,首先用傳統(tǒng)hash算法計(jì)算出每個(gè)詞的hash值,這樣就把字符串變成一串?dāng)?shù)字;然后對(duì)生成的hash值進(jìn)行縱位累加,如果該位為1,則simhash相應(yīng)位的值加1,否則減1。然后對(duì)這串?dāng)?shù)字進(jìn)行降維處理,如果每一位大于0記為1,小于0記為0。這樣便得出一個(gè)HTML文檔的Simhash值。
(3)計(jì)算特征值之間的海明距離
對(duì)于兩個(gè)二進(jìn)制串來(lái)a和b說(shuō),海明距離的值就相當(dāng)于a和b進(jìn)行異或運(yùn)算后結(jié)果中1的個(gè)數(shù)。根據(jù)上一步得出的Simhash值計(jì)算出之間的海明距離,對(duì)于小網(wǎng)站來(lái)說(shuō),海明距離大于0時(shí)便可判斷兩個(gè)HTML文檔存在差異,海明距離的值越大,差異就越大。通過(guò)該方法判斷網(wǎng)頁(yè)差異的方式是很高效的,并且可通過(guò)設(shè)置海明距離的大小來(lái)判斷網(wǎng)頁(yè)的差異程度。
Selenium是一個(gè)用于對(duì)Web應(yīng)用程序進(jìn)行黑盒測(cè)試的工具。Selenium的測(cè)試用例直接運(yùn)行在瀏覽器中,就像真正的用戶在操作一樣。Selenium支持IE、Firefox、Google Chrome等多種瀏覽器以及Java、C#、Ruby等多種運(yùn)行語(yǔ)言的編程自動(dòng)生成,用例制作簡(jiǎn)單,運(yùn)行快。為了實(shí)現(xiàn)自動(dòng)化測(cè)試,本系統(tǒng)基于Java開(kāi)發(fā),采用Selenium自動(dòng)化測(cè)試框架來(lái)實(shí)現(xiàn),實(shí)現(xiàn)了對(duì)Web應(yīng)用SQL注入漏洞的自動(dòng)檢測(cè),并且對(duì)SQL注入漏洞檢測(cè)方法進(jìn)行相關(guān)優(yōu)化。
3.1 基于Selenium的SOL注入漏洞檢測(cè)系統(tǒng)設(shè)計(jì)
本文將系統(tǒng)分為四大模塊,系統(tǒng)的結(jié)構(gòu)設(shè)計(jì)如圖2:

圖2 SQL注入漏洞檢測(cè)系統(tǒng)
其中,每個(gè)模塊實(shí)現(xiàn)的功能如下:
(1)網(wǎng)絡(luò)爬蟲(chóng)模塊
該模塊調(diào)用Selenium2中的FindElements()方法,通過(guò)標(biāo)簽名找到發(fā)送正常請(qǐng)求后所得頁(yè)面的url和form表單,并把其保存為HTML文檔,為構(gòu)造SQL攻擊語(yǔ)句做準(zhǔn)備。
(2)構(gòu)造SQL注入語(yǔ)句模塊
該模塊根據(jù)編寫(xiě)的測(cè)試用例自動(dòng)構(gòu)造多種SQL語(yǔ)句對(duì)上一個(gè)模塊保存的HTML文檔中的url和form表單進(jìn)行SQL注入,然后將注入后發(fā)送請(qǐng)求得到的HTML頁(yè)面保存。
(3)SQL注入漏洞檢測(cè)模塊
該模塊對(duì)前兩個(gè)模塊中保存的HTML文檔,包括正常請(qǐng)求的HTML文檔和SQL注入后的HTML文檔,利用Simhash算法分別對(duì)兩個(gè)HTML文檔進(jìn)行分詞處理,計(jì)算后產(chǎn)生一個(gè)二進(jìn)制的特征值。通過(guò)計(jì)較兩個(gè)特征值之間的海明距離來(lái)判斷網(wǎng)頁(yè)的差異程度。然后根據(jù)測(cè)試用例的判斷標(biāo)準(zhǔn)來(lái)判斷漏洞是否存在。
(4)檢測(cè)報(bào)告生成模塊
在完成SQL注入漏洞檢測(cè)之后,將待測(cè)網(wǎng)站網(wǎng)址、SQL注入漏洞所在頁(yè)面網(wǎng)址、SQL注入點(diǎn)和漏洞檢測(cè)時(shí)間等數(shù)據(jù)生成一份檢測(cè)報(bào)告放在一份txt格式的文檔中。
3.2 基于Selenium的SOL注入漏洞檢測(cè)系統(tǒng)實(shí)現(xiàn)
(1)系統(tǒng)界面
系統(tǒng)基于Java實(shí)現(xiàn),主界面如下圖所示。操作過(guò)程為:首先在地址欄中輸入待檢測(cè)的網(wǎng)站地址,然后點(diǎn)擊開(kāi)始按鈕,系統(tǒng)自動(dòng)開(kāi)始檢測(cè)。檢測(cè)過(guò)程和檢測(cè)結(jié)果都會(huì)顯示在文本區(qū)域內(nèi)。

圖3 系統(tǒng)主界面
(2)Selenium實(shí)現(xiàn)網(wǎng)頁(yè)爬蟲(chóng)模塊
網(wǎng)頁(yè)爬蟲(chóng)模塊主要通過(guò)調(diào)用Selenium的API接口,按深度優(yōu)先遍歷網(wǎng)頁(yè)的鏈接、表單。對(duì)于表單,提取其<input>屬性,作為待注入的參數(shù)。將遍歷得到的鏈接,加入隊(duì)列,啟動(dòng)另外的線程,訪問(wèn)鏈接隊(duì)列,調(diào)用Selenium的drive方法訪問(wèn)鏈接,獲取網(wǎng)頁(yè)的源代碼,以供(3)中漏洞檢測(cè)模塊使用。主要調(diào)用的函數(shù)及實(shí)現(xiàn)功能如下:
WebDriver driver=new FirefoxDriver();//加載Selenium的火狐瀏覽器驅(qū)動(dòng)組件
driver.get(“http://xxxx”);//自動(dòng)調(diào)用瀏覽器訪問(wèn)
List<WebElement>forms=driver.findElements(By.tag-Name("form");
//調(diào)用Selenium的API方法,獲取當(dāng)前頁(yè)面中所有表單<form></form>標(biāo)簽
List<WebElement>forms=driver.findElements(By.tag-Name("a");
//獲取當(dāng)前頁(yè)面中所有鏈接<a>…</a>標(biāo)簽
driver.get(forms.get(i).getAttribute("action");
//獲取<form></form>表單中action(URL)的值
String page=driver.getPageSource();//調(diào)用Selenium的API方法,獲取當(dāng)前頁(yè)面的源代碼
(3)Simhash算法實(shí)現(xiàn)漏洞檢測(cè)模塊
漏洞檢測(cè)模塊是本系統(tǒng)的核心模塊,主要利用Java語(yǔ)言實(shí)現(xiàn)了Simhash算法,并對(duì)(2)中經(jīng)過(guò)SQL注入攻擊前后下載得到的頁(yè)面文件進(jìn)行計(jì)算,以判別是否存在漏洞。主要代碼如下所示:
StringTokenizer stringTokens=new StringTokenizer(this.tokens);//定義分詞的大小
while(stringTokens.hasMoreTokens(){
String temp=stringTokens.nextToken();
BigInteger t=this.hash(temp);
for(int i=0;i<this.hashbits;i++){
BigInteger bitmask=new BigInteger("1").shiftLeft(i);
if(t.and(bitmask).signum()!=0){
v[i]+=1;
}else{
v[i]-=1;
}
}//根據(jù)分詞大小對(duì)文本分詞,并對(duì)分詞賦予權(quán)值
BigInteger fingerprint=new BigInteger("0");
StringBuffer simHashBuffer=new StringBuffer();
for(int i=0;i<this.hashbits;i++){
if(v[i]>=0){
fingerprint=fingerprint.add(new BigInteger("1").shiftLeft (i);
simHashBuffer.append("1");
}else{
simHashBuffer.append("0");
}
}//通過(guò)hash函數(shù)計(jì)算各個(gè)特征向量的hash值
his.strSimHash=simHashBuffer.toString();//得到hash值
3.3 優(yōu)化SQL注入漏洞檢測(cè)方法
在所設(shè)計(jì)的基于Selenium的SQL注入漏洞檢測(cè)系統(tǒng)中,將系統(tǒng)性能做優(yōu)化處理。由于一些Web應(yīng)用具備SQL注入攻擊防御機(jī)制,例如對(duì)某頁(yè)面攻擊后返回的是一個(gè)提示“請(qǐng)輸入合法參數(shù)”的頁(yè)面,這時(shí)的頁(yè)面與正常響應(yīng)頁(yè)面的內(nèi)容肯定不相同,其Simhash值也不相同,但并不能證明該存在漏洞,因?yàn)椴](méi)有攻擊成功。因此需對(duì)漏洞檢測(cè)方法進(jìn)行改進(jìn):首先調(diào)用Selenium2中的getPageSource()方法分別將發(fā)送正常請(qǐng)求后的頁(yè)面a和SQL注入后的頁(yè)面b保存為HTML文檔,存放在本地。然后調(diào)用Simhash算法對(duì)兩個(gè)網(wǎng)頁(yè)進(jìn)行處理,計(jì)算出網(wǎng)頁(yè)的Simhash值,根據(jù)SQL注入測(cè)試用例設(shè)定不同的判斷標(biāo)準(zhǔn),按照標(biāo)準(zhǔn)進(jìn)行比對(duì),若滿足標(biāo)準(zhǔn)則證明所構(gòu)造的SQL注入語(yǔ)句被執(zhí)行,即系統(tǒng)存在SQL注入漏洞。這樣根據(jù)SQL注入語(yǔ)句類型來(lái)設(shè)置判斷標(biāo)準(zhǔn)從而進(jìn)行漏洞檢測(cè)的方法,具有一定的嚴(yán)謹(jǐn)性,不僅優(yōu)化了系統(tǒng)的檢測(cè)效率,而且提高了檢測(cè)結(jié)果的可信度。
4.1 SQL 注入測(cè)試用例
對(duì)于一些具備防御機(jī)制的Web應(yīng)用來(lái)說(shuō),簡(jiǎn)單的SQL注入語(yǔ)句會(huì)被過(guò)濾而無(wú)法成功攻擊,因此,若要檢測(cè)出漏洞,就需要構(gòu)造不同等級(jí)的SQL語(yǔ)句來(lái)進(jìn)行攻擊,針對(duì)Web應(yīng)用客戶端的SQL注入攻擊語(yǔ)句有如下7種,分為初級(jí)、中級(jí)、高級(jí)三個(gè)級(jí)別,每一種注入類型都有不同的判斷標(biāo)準(zhǔn)。SQL注入測(cè)試用例如下表所示:

表1 測(cè)試用例
在該表中,A類屬于初級(jí)SQL注入語(yǔ)句;B、C兩種屬于中級(jí)SQL注入語(yǔ)句;而后四種D、E、F、G則屬于高級(jí)SQL注入語(yǔ)句,主要針對(duì)一些具有防御機(jī)制的Web應(yīng)用客戶端。
4.2 漏洞檢測(cè)系統(tǒng)功能性驗(yàn)證
利用該系統(tǒng)對(duì)測(cè)試網(wǎng)站進(jìn)行A、B、C三類漏洞檢測(cè),該網(wǎng)站大約含有150個(gè)鏈接。網(wǎng)絡(luò)爬蟲(chóng)的遞歸深度為5。最終對(duì)網(wǎng)站的測(cè)試結(jié)果輸出如下圖:

圖4 測(cè)試結(jié)果
對(duì)測(cè)試結(jié)果統(tǒng)計(jì)如下表所示。

表2 測(cè)試結(jié)果統(tǒng)計(jì)
4.3 漏洞檢測(cè)系統(tǒng)有效性驗(yàn)證
在利用該系統(tǒng)對(duì)網(wǎng)站進(jìn)行SQL注入測(cè)試之后,檢測(cè)報(bào)告中會(huì)給出存在漏洞并建議再次驗(yàn)證的鏈接地址,對(duì)這些地址進(jìn)行手動(dòng)驗(yàn)證,即進(jìn)行人工注入。同時(shí)選取市面上常用的啊D、Pongolin兩種SQL注入漏洞檢測(cè)工具,對(duì)同一個(gè)測(cè)試網(wǎng)站進(jìn)行相同的SQL注入攻擊,并比較檢測(cè)結(jié)果。比較結(jié)果如表所示:

表3 不同檢測(cè)工具結(jié)果比較
對(duì)比不同檢測(cè)工具的檢測(cè)結(jié)果分析可發(fā)現(xiàn),本文檢測(cè)系統(tǒng)在檢測(cè)率上遠(yuǎn)遠(yuǎn)優(yōu)于另外兩種,同時(shí)檢測(cè)漏洞的準(zhǔn)確率也很高,雖然平均檢測(cè)時(shí)間稍長(zhǎng),但系統(tǒng)的整體性能優(yōu)于其他檢測(cè)工具。
SQL注入漏洞是威脅Web安全的重要因素,因此SQL注入漏洞的檢測(cè)對(duì)于網(wǎng)絡(luò)安全有很高的應(yīng)用價(jià)值,只有快速準(zhǔn)確地檢測(cè)出漏洞,才能在應(yīng)用受到攻擊前將其清除。本文把Selenium自動(dòng)化測(cè)試工具和Simhash網(wǎng)頁(yè)快速比較技術(shù)應(yīng)用于SQL注入漏洞檢測(cè)系統(tǒng)中,不僅實(shí)現(xiàn)了自動(dòng)化測(cè)試,而且提高了漏洞檢測(cè)的效率和準(zhǔn)確率。但該檢測(cè)系統(tǒng)在對(duì)大網(wǎng)站或者一些擁有簡(jiǎn)易防注入措施的網(wǎng)站進(jìn)行檢測(cè)過(guò)程中產(chǎn)生誤報(bào),從而影響檢測(cè)結(jié)果的正確率和檢測(cè)的效率。因此需要構(gòu)造更多類型的SQL注入攻擊語(yǔ)句,同時(shí)也要優(yōu)化網(wǎng)頁(yè)相似度比對(duì)方法,來(lái)加強(qiáng)系統(tǒng)在不同情況下檢測(cè)SQL注入漏洞的能力,優(yōu)化系統(tǒng)性能。
[1]張晨,汪永益,王雄等.基于網(wǎng)頁(yè)DOM樹(shù)比對(duì)的SQL注入漏洞檢測(cè)[J].計(jì)算機(jī)工程,2012.18:111-115.
[2]Clarke J.SQL注入攻擊與防御[M].黃曉磊,李化,譯.北京:清華大學(xué)出版社,2010.
[3]邊耐政,張琳.一種基于Selenium的Web自動(dòng)化測(cè)試低耦合框架[J].計(jì)算機(jī)應(yīng)用與軟件,2014,31(8):13-16,37.
[4]羅明宇.基于Selenium的安全自動(dòng)測(cè)試技術(shù)的研究與實(shí)現(xiàn)[D].廣東工業(yè)大學(xué),2015.
[5]池水明,闞歆煒,張昱等.基于Simhash的SQL注入漏洞檢測(cè)技術(shù)研究[J].計(jì)算機(jī)時(shí)代,2014.3:3-5.
[6]Inyong Lee,Soonki Jeong,Sangsoo Yeo,Jongsub Moon.A novel method for SQL Injection Attack Detection Based on Removing SQL Query Attribute Values[J].Mathmatic 1 and Computer Modelling,2011,55(1):58-68.
[7]練坤梅,許靜,田偉等.SQL注入漏洞多等級(jí)檢測(cè)方法研究[J].計(jì)算機(jī)科學(xué)與探索,2011,5(5):474-480.
[8]Unmesh G.Selenium Testing Tools Cookbook[M].Packt Publishing,2012:11-33.
[9]劉書(shū)一.基于文本相似度的網(wǎng)頁(yè)消重策略[J].計(jì)算機(jī)應(yīng)用與軟件,2011,28(11):228-278.
[10]郭俊剛.基于Eclipse的自動(dòng)化測(cè)試工具的研究與實(shí)現(xiàn)[D].北京交通大學(xué),2012.
[11]高洪濤.SQL注入攻擊途徑及策略分析[J].網(wǎng)絡(luò)安全技術(shù)與應(yīng)用,2011:14-16
[12]成曉利.Web應(yīng)用SQL注入漏洞測(cè)試系統(tǒng)的研究與實(shí)現(xiàn)[D],2012.
SQL Injection Vulnerability Detection System Based on Selenium
LI Ying-jie,REN Hong-min
(College of Information Engineering,Shanghai Maritime University,Shanghai 201306)
In the Web application security vulnerability detection,manual inspection and the use of page alignment algorithm will affect the detection accuracy and efficiency,in the traditional SQL injection vulnerability detection technology based on the establishment of an automatic detection system based on the selenium and use optimization Simhash text similarity detection algorithm to improve the performance of the system,the credibility of the system,the feasibility and results is verified by experiment.
Vulnerabilities with Web Applications;SQL Injection;Selenium;Simhash
1007-1423(2016)21-0020-05
10.3969/j.issn.1007-1423.2016.21.004
栗迎結(jié)(1992-),女,河南開(kāi)封人,碩士,研究方向?yàn)檐浖_(kāi)發(fā)、自動(dòng)化測(cè)試
2016-05-04
2016-07-20
任紅敏(1969-),男,上海人,博士,副教授,研究方向?yàn)檐浖w系結(jié)構(gòu)、構(gòu)件技術(shù)、軟件復(fù)用、過(guò)程工程、軟件項(xiàng)目管理,基于社會(huì)計(jì)算、群體智能、人本計(jì)算、社會(huì)網(wǎng)絡(luò)、輿情分析等技術(shù)的軟件資產(chǎn)管理、船舶協(xié)同設(shè)計(jì)知識(shí)管理等