羅明宇,凌 捷
(廣東工業大學 計算機學院,廣東 廣州510006)
SQL注入漏洞被利用的典型是從數據庫中盜取敏感信息或擅自添加數據庫中的賬戶,以獲取操作數據庫的權限[1-3],這種攻擊具有較強的隱蔽性,容易造成敏感信息的泄露或破壞。因此,對SQL注入漏洞檢測方法的研究已成為提高網站安全防護能力的熱點問題。近年來,研究SQL注入攻擊檢測和防御的文獻有不少,但大多都存在效率不高、誤報率較高的情況。例如SQL 注入檢測中的靜態分析法,該方法是指通過在Web應用程序中分析SQL查詢語句以檢測并防止SQL注入攻擊,其重點是檢測用戶的輸入類型而不是檢測SQL注入攻擊,如果攻擊者使用正常的類型和語法,該方法就不能夠有效發揮作用。不同于靜態分析法,動態分析法在不對應用程序做任何修改的前提下,能夠找到SQL注入攻擊漏洞,但該方法只能找到已經得到開發者確認的漏洞,不能全部發現那些沒有預先定義的漏洞[4]。本文在研究網頁比對算法基礎上,提出了一種基于DOM 樹葉子節點序列值的快速比對的判定技術,設計并實現了相應的SQL注入漏洞檢測原型系統,實驗結果表明該方法不僅能夠提高對于SQL漏洞檢測的準確率,更在一定程度上提高了檢測的效率。
Web應用程序可簡單的認為是Web 瀏覽器運行的程序,它一般具有三層結構:表示層、CGI層和數據庫層。
(1)表示層:主要接收用戶的輸入和顯示經過處理的結果。它可以被認為是圖形用戶界面。Flash、HTML 及Java的腳本都是表示層的一部分,它直接與用戶進行交互。
(2)CGI層:也稱為服務器腳本程序。數據庫發送數據存儲備份到CGI層,并最后發送到表示層,呈現給用戶觀看。
(3)數據庫層:這層只有存儲和檢索的所有數據。由于這層直接連接到CGI層并沒有在數據庫中做任何安全檢查,如果CGI層的攻擊成功,數據將會被發現并可以被修改[5]。
目前常用的SQL注入漏洞檢測的方法可分為入侵前檢測與入侵后檢測[6]。入侵前檢測一般應用在客戶端,主要方法就是在有參數傳入的地方輸入 “and 1=1”、 “and 1=2”或 “‘”等字符。入侵后檢測主要應用在服務端,包括:數據庫檢查、IIS日志檢查、其它相關信息判斷。
本文提出的漏洞檢測技術屬于應用在客戶端的入侵前檢測。通過對URL的檢測參數添加 “and 1=1”的正常頁面與對URL的檢測參數添加 “‘”或 “and 1=2”返回的頁面進行對比,若相同,則判定該頁面不存在SQL 注入漏洞,若不同,則判定存在SQL注入漏洞。研究的關鍵問題是如何快速準確地比對正常頁面與返回頁面,提高SQL 注入漏洞檢測的效率和正確率,其中網頁相似度的度量在漏洞檢測中有重要應用。
由于網頁具有一定的結構特性,可以通過比較網頁的結構特性來度量網頁的相似性。網頁的DOM (document object model)樹結構在一定程度上反映了頁面的內容以及內容間的關系。典型的網頁結構相似度度量算法主要有3種:基于編輯距離的網頁相似度度量算法、基于鏈路統計特征的網頁相似度度量算法和基于結點統計特征的網頁相似度度量算法[7]。基于這3種經典的相似度度量方法,衍生了許多改進算法,從效率或準確率上進行提升。文獻[8]提出了基于局部標簽匹配的網頁相似度計算方法,在分析DOM 樹的網頁層次結構特征的基礎上,計算兩棵DOM 樹所對應的標簽串的距離加權后作為兩個網頁的編輯距離,以衡量兩個網頁的相似性,降低了樹編輯距離計算復雜度。文獻 [9]提出了一種改進的基于樹路徑匹配的網頁結構相似度算法,通過網頁間的最佳樹路徑匹配計算結構相似度,比傳統樹路徑方法區分差異較小的網頁更有效。
文獻 [10]提出一種基于DOM 樹快速比對的判斷方法,不比較DOM 樹的全部節點序列,僅選能體現出這些變化的部分關鍵節點序列進行比對。在執行SQL 注入時,存在漏洞的Web頁面其布局結構或內容就會發生改變,這種改變會導致DOM 樹的結構或對應的內容發生改變。所以快速比對算法主要比對的是DOM 樹的葉子節點序列,若不同,則說明DOM 樹發生了變化,判定DOM 樹不同。若相同,則隨機抽取包含文本信息的3個葉子節點,依次比對到該葉子節點的鏈路標簽序列是否相同,若都相同,則說明DOM 樹相同。這種DOM 樹快速比對算法的本質是比較兩棵DOM 樹是否相同,用盡可能少的時間準確地判定兩棵DOM 樹的異同是該算法的核心。對于復雜的Web頁面來說,其構成的DOM 樹擁有大量的葉子節點,比對葉子節點序列需要耗費大量時間,執行SQL注入時,DOM樹變化有可能只是微小的,導致某個標簽里的內容發生了改變,算法平均消耗時間較長。其次,對于擁有大量的葉子節點的DOM 樹來說,僅僅隨機抽取3個葉子節點進行鏈路標簽序列的對比,并不具備代表性,不能因此說明兩棵DOM 樹是否相同,會造成結果的誤差。本文提出一種改進的基于序列值的快速比對算法,算法流程圖如圖1 所示,具體描述如下:
(1)按某種遍歷方式遍歷兩棵目標DOM 樹,分別獲取葉子節點標簽序列及每個葉子節點到根節點的路徑的長度;
(2)比較兩棵DOM 樹葉子節點序列的長度,若長度相同,則轉到步驟 (3),若長度不同,則轉到步驟 (6);
(3)根據步驟 (1)獲得的葉子節點序列及每條路徑的長度,分別算出每個標簽的序列值,計算出兩組標簽序列有幾種標簽,并根據質數列對標簽進行賦值;
(4)根據序列值公式計算出每個標簽的序列值,累加每個標簽序列值,得到整個序列的序列值;
(5)比較兩棵DOM 樹葉子節點序列的序列值,若相等,則轉到步驟 (7),若不等,則轉到步驟 (6);
(6)判定兩棵DOM 樹不同,結束;
(7)判定兩棵DOM 樹相同,結束。
下面提出本文計算DOM 樹葉子節點序列值的相關參數及序列值的相關計算公式。對于一組標簽序列

QueV(Pi)表示它的序列值

quev(pi)表示標簽pi在序列Pi中的序列值

式中:st(pi)——標簽pi的標簽值;i——標簽pi所在序列中的位置;len(pi)——根節點到pi的路徑的長度。

圖1 序列值比對算法流程
標簽值st(pi)主要通過質數列來構成,從對比的兩棵DOM 中取其中一組葉子節點序列并用質數列 (1除外)對它依此進行賦值,若出現重復的標簽則跳過且該標簽的標簽值為第一個出現時所賦的值。另一組節點序列則參照第一組標簽值對其每個節點進行賦值,若出現了新的標簽,則繼續用質數列對其賦值。從式 (2)得,一組標簽序列的序列值是由每個標簽在此序列中的序列值累加得到的,而從式 (3)得,每個標簽的序列值quev(pi)是由st(pi)(標簽值)、i(該標簽在序列中的位置)和len(pi)(根節點到節點pi的路徑長度)這3個部分組成的,分別體現了標簽的差異、位置與樹結構這3種影響因素。例如圖2 (a)和圖2 (b),有兩棵簡單的DOM 樹。
可以得到葉子節點序列分別為

因為兩個葉子節點序列Pi、Pj總共出現了4種不同的標簽,所以根據質數列,得到的標簽值見表1。由式 (2)、式 (3)可得Pi的序列值QueV(Pi)為0.9126,Pj的序列值QueV(Pj)的序列值為0.8824。雖然標簽序列Pi與Pj長度相同、各種標簽出現的次數相同,但是由于標簽序列的次序不同,所以序列值也不同,因此判定兩棵DOM 樹不相同。

圖2 節點序列順序不同的DOM 樹

表1 標簽值
文獻 [10]提出的快速比對算法,對于不同的DOM 樹也是僅僅比對3個葉子節點的路徑是否相同,對于擁有大量葉子節點的DOM 樹來說,不能準確地區分不同結構卻擁有相同葉子節點序列的DOM 樹。本文提出的改進的基于序列值比對算法,不僅僅比對了葉子序列的異同,更引進了每個葉子節點的路徑長度作為計算序列值的其中一個參數,也就是說DOM 樹的結構會影響最終得出的序列值,不同的DOM 樹結構即使有著相同的葉子節點序列,得到的序列值應該是不同的。上面的例子說明序列值比對算法能夠區分擁有相同葉子節點序列且結構不同的DOM 樹。若DOM 樹能夠以近似一一映射關系對應于序列值,避免序列值的碰撞,有利于提高算法的準確性[11]。本文算法標簽值的設置見表1,采用了質數列可減少序列值的碰撞。算法在葉子序列長度相等的前提下,分別計算出葉子節點序列的序列值,再通過比較序列值,判斷兩組序列是否相等,從而判斷兩棵DOM 樹的異同。若兩棵DOM 樹葉子節點序列長度不等,則直接判定不同。在判斷DOM 樹的過程中,傳統算法是基于全部節點的個數或者葉子節點的對比,算法復雜度較大,本文算法改進為數值的比對,減少了時間復雜度。
本 文 實 驗 環 境 如 下:①CPU 為Intel Core i3,2.40GHz;②內存為2GB;③操作系統使用Windows XP;④使用C#實現算法。實驗選擇節點序列比對算法、快速比對算法與本文算法進行比較。
首先在互聯網上選取一個存在SQL 注入漏洞的網頁。該網頁對應的DOM 樹共有324 個節點,其中葉子節點為116個,最大路徑長度為8。經過SQL 注入測試后返回的網頁對應的DOM 樹共有307 個節點,其中葉子節點134個,最大路徑長度為5。分別采用基于節點序列的比對算法、快速比對算法以及本文算法進行對比,所消耗的時間見表2。可以看出,本文算法所消耗時間約為節點序列比對算法的29%,為快速比對算法的75%,驗證了改進算法提高了效率。

表2 算法消耗時間
生成節點數為10、20、50、70、100和120的DOM 樹各一對。分別利用上面3種算法分別進行比對,并統計出相同節點比對所消耗的時間情況如圖3所示。

圖3 算法效率比較
從圖3可以看出,節點序列比對算法和快速比對算法消耗時間呈指數級增長,而本文提出的序列值比對算法呈線性變化。對于節點序列比對算法,其時間復雜度為O(n2),其中n為兩棵DOM 樹對應節點的序列長度的最小值,效率偏低。對于快速比對算法,該算法的時間復雜度為O(n×N)+3O(L),其中N 為兩棵DOM 樹中葉子節點數目的最小值,L 為兩棵DOM 樹待對比鏈路節點序列長度的最大值。本文算法中比較兩棵DOM 樹是否相同,只需計算出葉子序列的序列值,然后比較葉子的序列值,不需要花費過多的時間對葉子節點進行一一比對,時間復雜度為O(n),比對時間不會隨著網頁節點數的增加而迅速增大。
為了驗證本文提出的序列值算法應用在漏洞檢測系統中的有效性,作者對序列值比對算法進行了實現,并與當前常用的兩款檢測工具BSQL Hacker和Pangolin進行比較實驗,分別對測試樣本進行檢測。首先通過表3的關鍵語句在Google中搜索出一定的URL 以構建測試樣本集;然后對獲取的URL 測試樣本進行SQL 漏洞檢測,根據對獲取的URL添加不同的注入命令的返回頁面與正常頁面的異同來判定URL是否存在漏洞,如果判定存在,則通過人工注入進一步確定。實驗結果見表4。

表3 不同關鍵語句獲得的URL數量

表4 與不同檢測工具的比較
從上面的結果可以看出,基于序列值比對算法的檢測系統在正確率上明顯高于其它兩種工具,在消耗時間上開銷比其它兩種檢測工具要大,但消耗時間還在可接受范圍之內。
SQL漏洞檢測技術在網絡安全中具有重要的實用價值,本文提出了一種改進的網頁比對算法,定義了DOM 樹序列值的計算方法,把DOM 樹葉子節點標簽值與每個葉子節點路徑長度作為計算DOM 樹序列值的關鍵參數,計算出DOM 樹的序列值。通過比較序列值的異同來判斷DOM樹是否相同,進而可以判斷兩個頁面是否相同。該算法相較于傳統網頁比對方法,更加適合在SQL 漏洞檢測中,能夠準確、高效的比對網頁異同,把樹結構對頁面異同影響體現出來,又通過比對數值的方法來取代一一比對節點的方法,有效地提高了比對效率。不足之處在于對于返回的頁面未進行詳盡的分析,會對結果產生一定的誤差,另外與當前常用檢測工具的效率上存在一定差距。接下來將會對算法過程進行改進,優化檢測過程,提高檢測效率。
[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 注入漏洞檢測與防御技術研究 [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應用SQL注入漏洞測試系統的研究與實現 [D].成都:西南交通大學,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注入攻擊及其防范檢測技術研究 [J].計算機工程與應用,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 樹的網頁相似度研究與應用 [D].大連:大連理工大學,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).[李睿,曾俊瑀,周四望,等.基于局部標簽樹匹配的改進網頁聚類算法 [J].計算機應用,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). [廖浩偉,楊燕,賈真,等.一種改進的基于樹路徑匹配的網頁結構相似度算法[J].吉林大學學報 (理學版),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).[張晨,汪永益,王雄,等.基于網頁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). [劉書一.基于文本相似度的網頁消重策略 [J].計算機應用與軟件,2011,28(11):228-229.]