羅明宇,凌 捷
(廣東工業(yè)大學(xué) 計算機學(xué)院,廣東 廣州510006)
SQL注入漏洞被利用的典型是從數(shù)據(jù)庫中盜取敏感信息或擅自添加數(shù)據(jù)庫中的賬戶,以獲取操作數(shù)據(jù)庫的權(quán)限[1-3],這種攻擊具有較強的隱蔽性,容易造成敏感信息的泄露或破壞。因此,對SQL注入漏洞檢測方法的研究已成為提高網(wǎng)站安全防護能力的熱點問題。近年來,研究SQL注入攻擊檢測和防御的文獻有不少,但大多都存在效率不高、誤報率較高的情況。例如SQL 注入檢測中的靜態(tài)分析法,該方法是指通過在Web應(yīng)用程序中分析SQL查詢語句以檢測并防止SQL注入攻擊,其重點是檢測用戶的輸入類型而不是檢測SQL注入攻擊,如果攻擊者使用正常的類型和語法,該方法就不能夠有效發(fā)揮作用。不同于靜態(tài)分析法,動態(tài)分析法在不對應(yīng)用程序做任何修改的前提下,能夠找到SQL注入攻擊漏洞,但該方法只能找到已經(jīng)得到開發(fā)者確認的漏洞,不能全部發(fā)現(xiàn)那些沒有預(yù)先定義的漏洞[4]。本文在研究網(wǎng)頁比對算法基礎(chǔ)上,提出了一種基于DOM 樹葉子節(jié)點序列值的快速比對的判定技術(shù),設(shè)計并實現(xiàn)了相應(yīng)的SQL注入漏洞檢測原型系統(tǒng),實驗結(jié)果表明該方法不僅能夠提高對于SQL漏洞檢測的準確率,更在一定程度上提高了檢測的效率。
Web應(yīng)用程序可簡單的認為是Web 瀏覽器運行的程序,它一般具有三層結(jié)構(gòu):表示層、CGI層和數(shù)據(jù)庫層。
(1)表示層:主要接收用戶的輸入和顯示經(jīng)過處理的結(jié)果。它可以被認為是圖形用戶界面。Flash、HTML 及Java的腳本都是表示層的一部分,它直接與用戶進行交互。
(2)CGI層:也稱為服務(wù)器腳本程序。數(shù)據(jù)庫發(fā)送數(shù)據(jù)存儲備份到CGI層,并最后發(fā)送到表示層,呈現(xiàn)給用戶觀看。
(3)數(shù)據(jù)庫層:這層只有存儲和檢索的所有數(shù)據(jù)。由于這層直接連接到CGI層并沒有在數(shù)據(jù)庫中做任何安全檢查,如果CGI層的攻擊成功,數(shù)據(jù)將會被發(fā)現(xiàn)并可以被修改[5]。
目前常用的SQL注入漏洞檢測的方法可分為入侵前檢測與入侵后檢測[6]。入侵前檢測一般應(yīng)用在客戶端,主要方法就是在有參數(shù)傳入的地方輸入 “and 1=1”、 “and 1=2”或 “‘”等字符。入侵后檢測主要應(yīng)用在服務(wù)端,包括:數(shù)據(jù)庫檢查、IIS日志檢查、其它相關(guān)信息判斷。
本文提出的漏洞檢測技術(shù)屬于應(yīng)用在客戶端的入侵前檢測。通過對URL的檢測參數(shù)添加 “and 1=1”的正常頁面與對URL的檢測參數(shù)添加 “‘”或 “and 1=2”返回的頁面進行對比,若相同,則判定該頁面不存在SQL 注入漏洞,若不同,則判定存在SQL注入漏洞。研究的關(guān)鍵問題是如何快速準確地比對正常頁面與返回頁面,提高SQL 注入漏洞檢測的效率和正確率,其中網(wǎng)頁相似度的度量在漏洞檢測中有重要應(yīng)用。
由于網(wǎng)頁具有一定的結(jié)構(gòu)特性,可以通過比較網(wǎng)頁的結(jié)構(gòu)特性來度量網(wǎng)頁的相似性。網(wǎng)頁的DOM (document object model)樹結(jié)構(gòu)在一定程度上反映了頁面的內(nèi)容以及內(nèi)容間的關(guān)系。典型的網(wǎng)頁結(jié)構(gòu)相似度度量算法主要有3種:基于編輯距離的網(wǎng)頁相似度度量算法、基于鏈路統(tǒng)計特征的網(wǎng)頁相似度度量算法和基于結(jié)點統(tǒng)計特征的網(wǎng)頁相似度度量算法[7]?;谶@3種經(jīng)典的相似度度量方法,衍生了許多改進算法,從效率或準確率上進行提升。文獻[8]提出了基于局部標簽匹配的網(wǎng)頁相似度計算方法,在分析DOM 樹的網(wǎng)頁層次結(jié)構(gòu)特征的基礎(chǔ)上,計算兩棵DOM 樹所對應(yīng)的標簽串的距離加權(quán)后作為兩個網(wǎng)頁的編輯距離,以衡量兩個網(wǎng)頁的相似性,降低了樹編輯距離計算復(fù)雜度。文獻 [9]提出了一種改進的基于樹路徑匹配的網(wǎng)頁結(jié)構(gòu)相似度算法,通過網(wǎng)頁間的最佳樹路徑匹配計算結(jié)構(gòu)相似度,比傳統(tǒng)樹路徑方法區(qū)分差異較小的網(wǎng)頁更有效。
文獻 [10]提出一種基于DOM 樹快速比對的判斷方法,不比較DOM 樹的全部節(jié)點序列,僅選能體現(xiàn)出這些變化的部分關(guān)鍵節(jié)點序列進行比對。在執(zhí)行SQL 注入時,存在漏洞的Web頁面其布局結(jié)構(gòu)或內(nèi)容就會發(fā)生改變,這種改變會導(dǎo)致DOM 樹的結(jié)構(gòu)或?qū)?yīng)的內(nèi)容發(fā)生改變。所以快速比對算法主要比對的是DOM 樹的葉子節(jié)點序列,若不同,則說明DOM 樹發(fā)生了變化,判定DOM 樹不同。若相同,則隨機抽取包含文本信息的3個葉子節(jié)點,依次比對到該葉子節(jié)點的鏈路標簽序列是否相同,若都相同,則說明DOM 樹相同。這種DOM 樹快速比對算法的本質(zhì)是比較兩棵DOM 樹是否相同,用盡可能少的時間準確地判定兩棵DOM 樹的異同是該算法的核心。對于復(fù)雜的Web頁面來說,其構(gòu)成的DOM 樹擁有大量的葉子節(jié)點,比對葉子節(jié)點序列需要耗費大量時間,執(zhí)行SQL注入時,DOM樹變化有可能只是微小的,導(dǎo)致某個標簽里的內(nèi)容發(fā)生了改變,算法平均消耗時間較長。其次,對于擁有大量的葉子節(jié)點的DOM 樹來說,僅僅隨機抽取3個葉子節(jié)點進行鏈路標簽序列的對比,并不具備代表性,不能因此說明兩棵DOM 樹是否相同,會造成結(jié)果的誤差。本文提出一種改進的基于序列值的快速比對算法,算法流程圖如圖1 所示,具體描述如下:
(1)按某種遍歷方式遍歷兩棵目標DOM 樹,分別獲取葉子節(jié)點標簽序列及每個葉子節(jié)點到根節(jié)點的路徑的長度;
(2)比較兩棵DOM 樹葉子節(jié)點序列的長度,若長度相同,則轉(zhuǎn)到步驟 (3),若長度不同,則轉(zhuǎn)到步驟 (6);
(3)根據(jù)步驟 (1)獲得的葉子節(jié)點序列及每條路徑的長度,分別算出每個標簽的序列值,計算出兩組標簽序列有幾種標簽,并根據(jù)質(zhì)數(shù)列對標簽進行賦值;
(4)根據(jù)序列值公式計算出每個標簽的序列值,累加每個標簽序列值,得到整個序列的序列值;
(5)比較兩棵DOM 樹葉子節(jié)點序列的序列值,若相等,則轉(zhuǎn)到步驟 (7),若不等,則轉(zhuǎn)到步驟 (6);
(6)判定兩棵DOM 樹不同,結(jié)束;
(7)判定兩棵DOM 樹相同,結(jié)束。
下面提出本文計算DOM 樹葉子節(jié)點序列值的相關(guān)參數(shù)及序列值的相關(guān)計算公式。對于一組標簽序列
QueV(Pi)表示它的序列值
quev(pi)表示標簽pi在序列Pi中的序列值
式中:st(pi)——標簽pi的標簽值;i——標簽pi所在序列中的位置;len(pi)——根節(jié)點到pi的路徑的長度。
圖1 序列值比對算法流程
標簽值st(pi)主要通過質(zhì)數(shù)列來構(gòu)成,從對比的兩棵DOM 中取其中一組葉子節(jié)點序列并用質(zhì)數(shù)列 (1除外)對它依此進行賦值,若出現(xiàn)重復(fù)的標簽則跳過且該標簽的標簽值為第一個出現(xiàn)時所賦的值。另一組節(jié)點序列則參照第一組標簽值對其每個節(jié)點進行賦值,若出現(xiàn)了新的標簽,則繼續(xù)用質(zhì)數(shù)列對其賦值。從式 (2)得,一組標簽序列的序列值是由每個標簽在此序列中的序列值累加得到的,而從式 (3)得,每個標簽的序列值quev(pi)是由st(pi)(標簽值)、i(該標簽在序列中的位置)和len(pi)(根節(jié)點到節(jié)點pi的路徑長度)這3個部分組成的,分別體現(xiàn)了標簽的差異、位置與樹結(jié)構(gòu)這3種影響因素。例如圖2 (a)和圖2 (b),有兩棵簡單的DOM 樹。
可以得到葉子節(jié)點序列分別為
因為兩個葉子節(jié)點序列Pi、Pj總共出現(xiàn)了4種不同的標簽,所以根據(jù)質(zhì)數(shù)列,得到的標簽值見表1。由式 (2)、式 (3)可得Pi的序列值QueV(Pi)為0.9126,Pj的序列值QueV(Pj)的序列值為0.8824。雖然標簽序列Pi與Pj長度相同、各種標簽出現(xiàn)的次數(shù)相同,但是由于標簽序列的次序不同,所以序列值也不同,因此判定兩棵DOM 樹不相同。
圖2 節(jié)點序列順序不同的DOM 樹
表1 標簽值
文獻 [10]提出的快速比對算法,對于不同的DOM 樹也是僅僅比對3個葉子節(jié)點的路徑是否相同,對于擁有大量葉子節(jié)點的DOM 樹來說,不能準確地區(qū)分不同結(jié)構(gòu)卻擁有相同葉子節(jié)點序列的DOM 樹。本文提出的改進的基于序列值比對算法,不僅僅比對了葉子序列的異同,更引進了每個葉子節(jié)點的路徑長度作為計算序列值的其中一個參數(shù),也就是說DOM 樹的結(jié)構(gòu)會影響最終得出的序列值,不同的DOM 樹結(jié)構(gòu)即使有著相同的葉子節(jié)點序列,得到的序列值應(yīng)該是不同的。上面的例子說明序列值比對算法能夠區(qū)分擁有相同葉子節(jié)點序列且結(jié)構(gòu)不同的DOM 樹。若DOM 樹能夠以近似一一映射關(guān)系對應(yīng)于序列值,避免序列值的碰撞,有利于提高算法的準確性[11]。本文算法標簽值的設(shè)置見表1,采用了質(zhì)數(shù)列可減少序列值的碰撞。算法在葉子序列長度相等的前提下,分別計算出葉子節(jié)點序列的序列值,再通過比較序列值,判斷兩組序列是否相等,從而判斷兩棵DOM 樹的異同。若兩棵DOM 樹葉子節(jié)點序列長度不等,則直接判定不同。在判斷DOM 樹的過程中,傳統(tǒng)算法是基于全部節(jié)點的個數(shù)或者葉子節(jié)點的對比,算法復(fù)雜度較大,本文算法改進為數(shù)值的比對,減少了時間復(fù)雜度。
本 文 實 驗 環(huán) 境 如 下:①CPU 為Intel Core i3,2.40GHz;②內(nèi)存為2GB;③操作系統(tǒng)使用Windows XP;④使用C#實現(xiàn)算法。實驗選擇節(jié)點序列比對算法、快速比對算法與本文算法進行比較。
首先在互聯(lián)網(wǎng)上選取一個存在SQL 注入漏洞的網(wǎng)頁。該網(wǎng)頁對應(yīng)的DOM 樹共有324 個節(jié)點,其中葉子節(jié)點為116個,最大路徑長度為8。經(jīng)過SQL 注入測試后返回的網(wǎng)頁對應(yīng)的DOM 樹共有307 個節(jié)點,其中葉子節(jié)點134個,最大路徑長度為5。分別采用基于節(jié)點序列的比對算法、快速比對算法以及本文算法進行對比,所消耗的時間見表2??梢钥闯?,本文算法所消耗時間約為節(jié)點序列比對算法的29%,為快速比對算法的75%,驗證了改進算法提高了效率。
表2 算法消耗時間
生成節(jié)點數(shù)為10、20、50、70、100和120的DOM 樹各一對。分別利用上面3種算法分別進行比對,并統(tǒng)計出相同節(jié)點比對所消耗的時間情況如圖3所示。
圖3 算法效率比較
從圖3可以看出,節(jié)點序列比對算法和快速比對算法消耗時間呈指數(shù)級增長,而本文提出的序列值比對算法呈線性變化。對于節(jié)點序列比對算法,其時間復(fù)雜度為O(n2),其中n為兩棵DOM 樹對應(yīng)節(jié)點的序列長度的最小值,效率偏低。對于快速比對算法,該算法的時間復(fù)雜度為O(n×N)+3O(L),其中N 為兩棵DOM 樹中葉子節(jié)點數(shù)目的最小值,L 為兩棵DOM 樹待對比鏈路節(jié)點序列長度的最大值。本文算法中比較兩棵DOM 樹是否相同,只需計算出葉子序列的序列值,然后比較葉子的序列值,不需要花費過多的時間對葉子節(jié)點進行一一比對,時間復(fù)雜度為O(n),比對時間不會隨著網(wǎng)頁節(jié)點數(shù)的增加而迅速增大。
為了驗證本文提出的序列值算法應(yīng)用在漏洞檢測系統(tǒng)中的有效性,作者對序列值比對算法進行了實現(xiàn),并與當(dāng)前常用的兩款檢測工具BSQL Hacker和Pangolin進行比較實驗,分別對測試樣本進行檢測。首先通過表3的關(guān)鍵語句在Google中搜索出一定的URL 以構(gòu)建測試樣本集;然后對獲取的URL 測試樣本進行SQL 漏洞檢測,根據(jù)對獲取的URL添加不同的注入命令的返回頁面與正常頁面的異同來判定URL是否存在漏洞,如果判定存在,則通過人工注入進一步確定。實驗結(jié)果見表4。
表3 不同關(guān)鍵語句獲得的URL數(shù)量
表4 與不同檢測工具的比較
從上面的結(jié)果可以看出,基于序列值比對算法的檢測系統(tǒng)在正確率上明顯高于其它兩種工具,在消耗時間上開銷比其它兩種檢測工具要大,但消耗時間還在可接受范圍之內(nèi)。
SQL漏洞檢測技術(shù)在網(wǎng)絡(luò)安全中具有重要的實用價值,本文提出了一種改進的網(wǎng)頁比對算法,定義了DOM 樹序列值的計算方法,把DOM 樹葉子節(jié)點標簽值與每個葉子節(jié)點路徑長度作為計算DOM 樹序列值的關(guān)鍵參數(shù),計算出DOM 樹的序列值。通過比較序列值的異同來判斷DOM樹是否相同,進而可以判斷兩個頁面是否相同。該算法相較于傳統(tǒng)網(wǎng)頁比對方法,更加適合在SQL 漏洞檢測中,能夠準確、高效的比對網(wǎng)頁異同,把樹結(jié)構(gòu)對頁面異同影響體現(xiàn)出來,又通過比對數(shù)值的方法來取代一一比對節(jié)點的方法,有效地提高了比對效率。不足之處在于對于返回的頁面未進行詳盡的分析,會對結(jié)果產(chǎn)生一定的誤差,另外與當(dāng)前常用檢測工具的效率上存在一定差距。接下來將會對算法過程進行改進,優(yōu)化檢測過程,提高檢測效率。
[1]MA Xiaoting,HU Guoping,LI Zhoujun,et al.Research on detection and prevention technologies for SOL injection vulnerability [J].Network and Computer Security,2010,10 (11):18-24 (in Chinese).[馬小婷,胡國平,李舟軍,等.SQL 注入漏洞檢測與防御技術(shù)研究 [J].計算機安全,2010,10(11):18-24.]
[2]Shar Lwin Khin,Tan Hee Beng Kuan.Defeating SQL injection[J].Computer,2013,46 (3):69-77.
[3]Indrani Balasundaram,Ramaraj E.An efficient technique for detection and prevention of SQL injection attack using ASCII based string matching [J].Procedia Engineering,2012,30:183-190.
[4]CHENG Xiaoli.The research and realization of SQL vulnerability detection system for web application [D].Chengdu:Southwest Jiaotong University,2013 (in Chinese). [成曉利.Web應(yīng)用SQL注入漏洞測試系統(tǒng)的研究與實現(xiàn) [D].成都:西南交通大學(xué),2013.]
[5]Inyong Lee,Soonki Jeong,Sangsoo Yeo,et al.A novel method for SQL injection attack detection based on removing SQL query attribute values [J].Mathematical and Computer Modelling,2011,55 (1):58-68.
[6]CHEN Xiaobing,ZHANG Hanyu,LUO Liming,et al.Research on technique of SQL injection attacks and detection [J].Computer Engineering and Application,2007,43 (11):150-152 (in Chinese).[陳小兵,張漢煜,駱力明,等.SQL注入攻擊及其防范檢測技術(shù)研究 [J].計算機工程與應(yīng)用,2007,43 (11):150-152.]
[7]ZHANG Ruixue.Research & application of web similiarity based on DOM tree [D].Dalian:Dalian University of Technology,2011 (in Chinese).[張瑞雪.基于DOM 樹的網(wǎng)頁相似度研究與應(yīng)用 [D].大連:大連理工大學(xué),2011.]
[8]LI Rui,ZENG Junyu,ZHOU Siwang,et al.Improved webpage clustering algorithm based on partial tag tree maching [J].Journal of Computer Applications,2010,30 (3):818-820 (in Chinese).[李睿,曾俊瑀,周四望,等.基于局部標簽樹匹配的改進網(wǎng)頁聚類算法 [J].計算機應(yīng)用,2010,30 (3):818-820.]
[9]LIAO Haowei,YANG Yan,JIA Zhen,et al.An improved web structure similarity based on matching algorithm of tree paths [J].Journal of Jilin University (Science Edition),2012,50 (6):1199-1203 (in Chinese). [廖浩偉,楊燕,賈真,等.一種改進的基于樹路徑匹配的網(wǎng)頁結(jié)構(gòu)相似度算法[J].吉林大學(xué)學(xué)報 (理學(xué)版),2012,50 (6):1199-1203.]
[10]ZHANG Chen,WANG Yongyi,WANG Xiong,et al.SQL injection vulnerability detection based on webpage DOM tree comparison [J].Computer Engineering,2012,38 (18):111-115 (in Chinese).[張晨,汪永益,王雄,等.基于網(wǎng)頁DOM 樹比對的SQL注入漏洞檢測 [J].計算機工程,2012,38 (18):111-115.]
[11]LIU Shuyi.Strategy of eliminating duplicated web pages based on text similarity [J].Computer Applications and Software,2011,28 (11):229-229 (in Chinese). [劉書一.基于文本相似度的網(wǎng)頁消重策略 [J].計算機應(yīng)用與軟件,2011,28(11):228-229.]