文獻(xiàn)標(biāo)識碼: A
DOI:10.16157/j.issn.0258-7998.2016.03.026
中文引用格式: 張燕. 數(shù)據(jù)挖掘提取查詢樹特征的SQL注入攻擊檢測[J].電子技術(shù)應(yīng)用,,2016,,42(3):90-94.
英文引用格式: Zhang Yan. Query tree feature extraction based on data mining for detecting SQL injection attack[J].Application of Electronic Technique,2016,,42(3):90-94.
0 引言
目前,越來越多的Web 應(yīng)用都采取了應(yīng)用程序+數(shù)據(jù)庫的交互式結(jié)構(gòu),,應(yīng)用程序根據(jù)輸入動態(tài)構(gòu)建結(jié)構(gòu)化查詢語言(Structured Query Language,,SQL)語句,在數(shù)據(jù)庫中進(jìn)行相應(yīng)的操作,,并將結(jié)果返回給用戶,。數(shù)據(jù)庫中存儲著用戶的很多敏感信息,正是由于數(shù)據(jù)庫中信息的重要性,,導(dǎo)致了這種交互式應(yīng)用頻繁地遭到攻擊[1],。其中,SQL注入攻擊(SQL-Injection Attacks,,SQLIA)會從數(shù)據(jù)庫中盜取敏感信息或擅自添加數(shù)據(jù)庫中的賬戶,,以獲取操作數(shù)據(jù)庫的權(quán)限[2]。因此,,對SQL注入漏洞檢測方法的研究已成為提高網(wǎng)站安全防護(hù)能力的熱點問題,。
目前,有學(xué)者通過數(shù)據(jù)挖掘(Data Mining,,DM)的方法從SQL數(shù)據(jù)庫日志中提取一些特征作為攻擊檢測的依據(jù),。但是,數(shù)據(jù)庫日志中的查詢采用復(fù)雜的樹結(jié)構(gòu)表示,,如何將其轉(zhuǎn)換成可作為分類器的輸入特征是一個難題[3],。文獻(xiàn)[4]將樹結(jié)構(gòu)轉(zhuǎn)化為樹向量,以每個子樹發(fā)生的次數(shù)作為樹向量中的特征表示,。然而,,這些算法十分復(fù)雜,隨著子樹的變化,需要對其進(jìn)行修改,。為此,,文獻(xiàn)[5]提出了一種基于多維度序列的方法,可以對樹結(jié)構(gòu)進(jìn)行調(diào)整,。但是,,由于輸入樹結(jié)構(gòu)不同,多維度序列中的連續(xù)維度并不相同,,這需要利用特殊方式對多維度序列進(jìn)行相似度測量,。對于特征的提取,文獻(xiàn)[6]從查詢樹中僅提取SQL語法特征作為分類依據(jù),,但這會增加假陽性概率,。文獻(xiàn)[7]分析了SQL語句中的隱含意義,提取了語法和語義特征,,并采用字符串長度模型來檢查有限可替代集合中是否存在常數(shù),,從而形成數(shù)值特征。文獻(xiàn)[8]則采用字符串分布模型來轉(zhuǎn)換查詢樹特征,。但這些方法僅利用一種統(tǒng)計模型,,在查詢樹結(jié)構(gòu)多樣性的情況下,所提取的特征表征能力有限,。
本文基于數(shù)據(jù)挖掘技術(shù),,提出一種用于SQL注入攻擊檢測的查詢樹特征提取和轉(zhuǎn)換技術(shù)。利用Web數(shù)據(jù)庫日志中記錄的查詢樹(查詢樹是SQL語句的一種內(nèi)部表示)在數(shù)據(jù)庫級別上正確檢測出SQLIA,。為了將惡意查詢樹與正常查詢樹區(qū)分開來,,本文從查詢樹中提取出語義和語法特征,并利用多維序列和統(tǒng)計模型將其轉(zhuǎn)換成n維數(shù)值特征向量,,最終利用多項式核函數(shù)支持向量機(jī)(Support Vector Machine,,SVM)進(jìn)行分類。以ROC曲線下的面積(AUC)為性能指標(biāo)進(jìn)行實驗,,結(jié)果表明本文提出的特征提取和轉(zhuǎn)換方法獲得了較高的AUC值,,具有優(yōu)異的SQLIA檢測性能。
1 提出的SQLIA檢測方法
本文利用基于數(shù)據(jù)挖掘的二值分類方法來檢測SQL語句是否正常,。其中,,提取SQL數(shù)據(jù)庫日志中的語義和語法特征,并轉(zhuǎn)換成多維特征向量,,然后利用多項式核函數(shù)支持向量機(jī)(SVM)構(gòu)建一個SQLIA檢測框架,,來求解二值分類問題。
提出的SQLIA檢測框架分為四個階段:數(shù)據(jù)收集階段,、數(shù)據(jù)預(yù)處理階段,、SVM訓(xùn)練階段和檢測階段,。本文SQLIA檢測框架如圖1所示。
數(shù)據(jù)收集階段中,,從數(shù)據(jù)庫系統(tǒng)中收集正常和惡意SQL語句信息,,并將每個SQL用查詢樹表示。然后,,將每個查詢樹寫入到數(shù)據(jù)庫日志中,,創(chuàng)建一個樹形數(shù)據(jù)結(jié)構(gòu)。
數(shù)據(jù)預(yù)處理階段中,,將查詢樹轉(zhuǎn)化為n維特征向量,。特征提取器模塊從查詢樹中提取語法和語義特征,并與特征轉(zhuǎn)換器相結(jié)合生成多維度序列,。向量生成器模塊與每個多維度序列的數(shù)值元素相連接生成了n維特征向量,,即將每個查詢樹轉(zhuǎn)換為向量表示的特征,用于后續(xù)的相似性測量和模式識別,。
訓(xùn)練階段中,利用基于向量表示的特征來對SVM進(jìn)行訓(xùn)練,,用于后續(xù)檢測階段,。在訓(xùn)練階段中,通過向量表示的查詢樹特征作為訓(xùn)練數(shù)據(jù)來構(gòu)建一個SVM分類模型,。
檢測階段中,,利用訓(xùn)練好的SVM分類模型對新查詢樹的向量表示特征進(jìn)行處理,以確定這些新查詢樹為正?;驉阂獠樵?,從而檢測SQLIA。
但是,,由于原始查詢樹結(jié)構(gòu)十分復(fù)雜,,因此轉(zhuǎn)換后的向量也不是線性可分的。對于非線性可分問題,,本文采用非線性核函數(shù)來代替數(shù)據(jù)間的點乘積,,在原始維度空間上可以完成所有相似性的計算。本文在SVM中采用的核函數(shù)為多項式核函數(shù),,其表達(dá)式為[9]:K(χu,,χv)=(χu·χv+1)h。
2 查詢樹特征提取及轉(zhuǎn)換
為了利用SVM對查詢樹的特征進(jìn)行學(xué)習(xí)和檢測,,需要將復(fù)雜的查詢樹結(jié)構(gòu)轉(zhuǎn)化為n維數(shù)值特征向量,。查詢樹的樹結(jié)構(gòu)中含有SQL語句的語法和語義信息。語法信息是對SQL語句進(jìn)行解析的輸出信息,,其表示了樹的骨架,。通過查詢系統(tǒng)目錄可以獲得語句信息,,語句信息中含有SQL語句引用的目標(biāo)。本文首先利用提取的語法和語義特征生成一個多維序列作為中間表示,,然后將多維序列轉(zhuǎn)化為n維特征向量,。
2.1 定義
設(shè)定查詢樹Γ由一個節(jié)點集合和一個邊集合構(gòu)成。設(shè)定根(Γ)表示樹根節(jié)點,,路徑(n1,,nd)表示節(jié)點n1到節(jié)點nd的路徑,節(jié)點n的父節(jié)點定義為父母(n),,節(jié)點n的子節(jié)點集合定義為子(n),。將沒有子節(jié)點的節(jié)點稱為葉子節(jié)點,內(nèi)部節(jié)點是指具有子節(jié)點的節(jié)點,,將根節(jié)點和一個內(nèi)部節(jié)點間的路徑稱為內(nèi)部路徑,。需要注意,根節(jié)點和任何節(jié)點之間存在唯一的路徑,。在一個有標(biāo)簽的樹中,,標(biāo)簽值與樹中的每個節(jié)點相關(guān)聯(lián)。
序列S是目標(biāo)的有序列表,,用S={φ1,,φ2,…,,φk}表示,。有序目標(biāo)的個數(shù)稱為序列的長度,用|S|表示,。具有有限長度n的序列稱為n元組,。多維序列是一個有序序列的集合,用R={S1,,S2,,…,Sw}表示,,其中Si表示一個序列,。多維度序列含有兩種類型的維度:連續(xù)維度和空間維度。連續(xù)維度的長度為序列的個數(shù),,空間維度的長度為|Si|中的最大長度m,,1≤i≤w。換句話說,,可將R稱為w×m多維度序列,。
2.2 特征提取
本文在數(shù)據(jù)庫系統(tǒng)中處理日志文件中記錄的查詢樹,樹Γ的特征提取結(jié)果為一個多維度序列R,。首先,,確定生成多維度序列中每個序列的基,。為此,利用深度優(yōu)先遍歷算法(DFS)對整個查詢樹的內(nèi)部路徑進(jìn)行遍歷,,生成了標(biāo)準(zhǔn)序列P={p1,,p2,…,,pk},,其中pi為路徑(根(Γ),ni),,即從根(Γ)到第i個內(nèi)部節(jié)點ni的內(nèi)部路徑,。在多維度序列中序列維度的長度設(shè)置為標(biāo)準(zhǔn)序列的長度,即|P|=k,。
為了生成多維度序列,,本文提取葉子節(jié)點的值,這些葉子節(jié)點與查詢樹的每個pi相關(guān)聯(lián),。對于路徑的截止節(jié)點n,,若子(n)是葉子節(jié)點,則提取這個子(n)的值,。此外,,若提取的特征值類型為字符串,那么將字符串值轉(zhuǎn)化為數(shù)值,。
特征提取過程為每個內(nèi)部路徑pi生成了一個序列Si={φi1,φi2,,…,,φil},其中l(wèi)表示子(ni)的個數(shù),,φij表示數(shù)值大小,,1≤i≤k且1≤j≤l。多維度序列是一個連續(xù)的序列,,即R={S1,,S2,…,,Sk},。
由于一般所采用的SQL語句僅由全部SQL語法的一小部分構(gòu)成,如圖2所示,,因此多維度序列R可能是稀疏序列,。但是,本文提出的方法使得R具有語法特征和語義特征,,因此減少了R中的目標(biāo)個數(shù),。通過本文提出的方法,,根據(jù)內(nèi)部路徑可以生成R的序列,序列的階和每個序列的長度隱含了查詢樹的語法特征,。因此,,R的目標(biāo)僅明確表示了查詢樹的語義特征。圖3描述了圖2中部分查詢樹的多維度序列Rb的例子,,其中序列維度的長度為4,。
2.3 特征轉(zhuǎn)換
本文根據(jù)查詢樹的不同類型,采用3種統(tǒng)計方法將從查詢樹中提取字符串特征轉(zhuǎn)換成數(shù)值特征:
(1)在恒定列大小的情況下,,轉(zhuǎn)換方法將字符串長度模型和直方圖模型相結(jié)合,。直方圖模型能夠確定是否字符串的值位于直方圖邊界內(nèi),并且計算出指示器,,指示器利用布爾值B表示,,其中B∈{true=1,false=-1},。利用字符串長度和指示器值乘積的值替換字符串的值,。
(2)在函數(shù)參數(shù)恒定的情況下,轉(zhuǎn)換方法將字符串長度模型和字符分布模型相結(jié)合,。字符分布模型可以確定字符串的每個字符是否為先前觀察的字符集合中的元素,,并計算出指示器,指示器用布爾值B表示,。利用字符串長度和指示器值的乘積替換字符串的值,。
(3)在節(jié)點類型確定的情況下,將字符串的值作為名義上的特征,。利用枚舉法的離散數(shù)值替代字符串的值,。
在圖2中,利用和表示列的恒定值,,利用fc表示恒定的函數(shù)參數(shù)值,,用ot表示操作的類型名。對于,,本文假設(shè)常量大小為8,,使其包含在相應(yīng)的直方圖列的邊界中。然后,,將轉(zhuǎn)換成數(shù)值大小8,。對于,本文假設(shè)常量的大小為23,,這個常量的值不在直方圖的邊界內(nèi)部,。然后,將轉(zhuǎn)化為數(shù)值-23,。對于fc,,如果常量的大小為4,,并且所有的4個字符都是觀察字符集合中的元素,那么將fc轉(zhuǎn)化為數(shù)值大小4,。如果ot=′AND′并且ot∈{′AND′,,′OR′,′NOT′},,那么將ot轉(zhuǎn)化為枚舉數(shù)1,。
經(jīng)過特征轉(zhuǎn)化過程之后,圖4給出了圖3中多維度序列轉(zhuǎn)換的結(jié)果,。對于,、和fc,將一個字符串的值映射為一個數(shù)值的值,。通過采用聯(lián)合模型,,一個數(shù)值對應(yīng)于字符串值的多個特性,因此減少了多維度序列中的目標(biāo)個數(shù),。
2.4 構(gòu)建n維特征向量
在生成所有查詢樹日志的多維度序列之后,,本文將每個多維度序列轉(zhuǎn)換為n維數(shù)值特征向量。利用RR={R1,,R2,,…,Rz}表示多維度序列的集合,,其中Rx={Sx1,,Sx2,…,,Sxk},;z表示查詢樹的個數(shù),k表示內(nèi)部路徑的個數(shù),,并且1≤x≤z。利用VX={vx1,,vx2,,…,vxn}表示特征向量,,其中n表示分量的個數(shù),,vxw表示向量的分量,其中1≤w≤n,。
最后,,根據(jù)填充后的多維序列RX生成特征向量,即將RX轉(zhuǎn)化為其中向量的長度為|VX|保持了序列的階,,RX中有意義目標(biāo)的位置并不用填充值′NaN′進(jìn)行表示,。因此,,VX也表示了相應(yīng)查詢樹的語法特征和分量順序。VX的分量明確表明了查詢樹的語義特征,。對于圖5中的例子,,最后構(gòu)建的n維特征向量為VX=(1,8,,-23,,0,0,,0,,4,7),。
3 實驗及分析
3.1 實驗環(huán)境及數(shù)據(jù)
構(gòu)建一個實驗環(huán)境對本文提方法進(jìn)行驗證,。實驗平臺為一臺具備2.4 GHz的Intel Core i5、4 GB內(nèi)存和Windows7系統(tǒng)的PC,。利用Java庫和WEKA 3.7.9庫執(zhí)行本文SQLIA檢測方法,。
為了進(jìn)行綜合型實驗,本文利用一個簡單的電影推薦系統(tǒng),。網(wǎng)絡(luò)應(yīng)用使用PHP語言開發(fā),,其能夠與PostgreSQL數(shù)據(jù)庫進(jìn)行存取操作。利用MovieLens數(shù)據(jù)構(gòu)建一個包含大量用戶信息的電影推薦系統(tǒng)的數(shù)據(jù)庫,。本文生成了兩種類型的數(shù)據(jù)庫:正常查詢數(shù)據(jù)庫和惡意查詢數(shù)據(jù)庫,。利用Java庫和Apache HTTPC客戶端庫構(gòu)建正常查詢生成器。采用了SQLMAP構(gòu)建惡意查詢生成器,,包含6種SQLIA:內(nèi)聯(lián)查詢攻擊,、聯(lián)合查詢攻擊、堆疊查詢攻擊,、基于錯誤,、基于時間和基于布爾類型的盲注攻擊。
實驗中,,模擬了SQL存儲過程中的注入攻擊,,根據(jù)SQL存儲語句的前綴信息將收集到的查詢分成3個組,組1中包含“SELECT”語句,,組2中包含“INSERT”語句,,組3中包含“UPDATE”語句。表1中顯示了每個組中正常和惡意查詢操作的數(shù)量,。
3.2 性能指標(biāo)
為了評估分類器的性能,,通常會采用受試者工作特征(ROC)曲線,其是以假陽性率(FPR)為橫軸、以真陽性率(TPR)為縱軸形成的二維空間,。然而,,ROC曲線間常存在交叉, 單純的“優(yōu)于”或“支配”關(guān)系通常并不存在,自然無法相互比較,,因此代之以用標(biāo)量型的ROC曲線下的面積(Area Under ROC Curve,,AUC)[10]來實現(xiàn)分類算法間的性能比較。本文以AUC值來評估SQLIA的檢測性能,,其中,,0.5對應(yīng)隨機(jī)猜測性能,1對應(yīng)最優(yōu)性能,。AUC值越高,,表明分類器對該類樣本的識別準(zhǔn)確率越高。
3.3 性能比較
為了驗證本文方法中特征提取和特征轉(zhuǎn)換技術(shù)的優(yōu)異性能,,將其與其他幾個文獻(xiàn)中的特征提取方法進(jìn)行比較:(1)文獻(xiàn)[6]中只使用語法特征的方法,,(2)文獻(xiàn)[7]中基于字符串長度模型來轉(zhuǎn)換特征的方法,(3)文獻(xiàn)[8]基于字符串分布模型轉(zhuǎn)換特征的方法,。實驗中,,為了公平性,分類器都采用多項式核函數(shù)的SVM,,其中SVM核函數(shù)中的階數(shù)值設(shè)置為從1~10變化,。
圖6給出了組1中SELECT語句的SQLIA檢測精度實驗結(jié)果。對于SELECT語句,,采用語法特征的方法在階數(shù)為7~8的情況下,,AUC為0.963。由于語法結(jié)果根據(jù)用戶輸入數(shù)據(jù)的變化而變化,,因此該方法禁用SELECT語句的常量值來獲得較好的性能,。基于字符串長度模型的方法獲取了優(yōu)異的性能,,其中在階數(shù)為6~9的情況下,,AUC為0.992?;谧址植寄P偷姆椒ㄒ搏@取了比較優(yōu)異的性能,,在階數(shù)為3~7的情況下,其AUC達(dá)到了0.99,。但是,這些方法的性能都低于本文方法,,本文方法在階數(shù)為3~8時,,獲取的AUC都達(dá)到了0.994以上。這是因為,本文采用了語義特征和語法特征,,提高了對于各種SQL語句的SQLIA檢測的正確率,。
圖7給出了組2中INSERT語句的SQLIA檢測精度實驗結(jié)果,采用語法特征的方法獲得了較差的實驗性能,,在階數(shù)為1的最優(yōu)情況下,,其AUC為0.744?;谧址L度模型的方法在階數(shù)為9時,,獲取的AUC最高為0.986?;谧址植寄P偷姆椒ǐ@取了比較優(yōu)異的性能,,其在階數(shù)為1和7的情況下,獲取的AUC都達(dá)到了0.98,。但是,,這個性能也略微低于本文方法,本文方法在階數(shù)為6~9的情況下獲取的AUC都達(dá)到了0.99,。
圖8給出了組3中UPDATE語句的SQLIA檢測精度實驗結(jié)果,,基于語法特征的方法獲得了較差的性能,在階數(shù)為1的情況下,,其AUC為0.97,。基于字符串長度模型的方法也獲取了較差的性能,,即使在階數(shù)為1的最優(yōu)情況下,,其獲取的AUC為0.804?;谧址植寄P偷姆椒ㄔ陔A數(shù)為5~9時,,獲得的AUC達(dá)到了0.97。這個性能也低于本文方法,,本文方法在階數(shù)為8~10的情況下獲取的AUC達(dá)到了0.99,。
表2統(tǒng)計了各種方法在3組數(shù)據(jù)集上的平均AUC值??梢钥闯?,本文方法獲得了0.963的AUC值,比語法特征,、字符串長度模型和字符串分布模型分別提高了 36.6%,、18.1%和1.4%。
4 結(jié)語
本文提出了一種基于數(shù)據(jù)挖掘的SQLIA檢測方案,,從SQL查詢樹中提取語義和語法特征,,將其轉(zhuǎn)換成n維數(shù)值特征向量,,并將其作為多核SVM分類器的輸入,從而對SQLIA進(jìn)行檢測,。構(gòu)建仿真實驗,,以AUC值作為性能指標(biāo)。結(jié)果表明,,與現(xiàn)有方法相比,,對于UPDATE語句、SELECT語句以及INSERT語句,,本文方案都有效提高了SQLIA的正確檢測率,。
在本文的研究中,由于查詢樹具有可變性,,所以找到標(biāo)準(zhǔn)的內(nèi)部路徑是本文的難點,。在以后研究中,將會研究一種搜尋方法,,使其能夠輕易找到各種數(shù)據(jù)庫系統(tǒng)中查詢樹的內(nèi)部路徑,。
參考文獻(xiàn)
[1] 孫義,胡雨霽,,黃皓.基于序列比對的SQL注入攻擊檢測方法[J].計算機(jī)應(yīng)用研究,,2010,27(9):3525-3528.
[2] 劉毅,,劉益和.基于jQuery的SQL注入攻擊防范實現(xiàn)[J].計算機(jī)技術(shù)與發(fā)展,,2011,21(2):177-180.
[3] SADEGHIAN A,,ZAMANI M,,MANAF A A.A taxonomy of SQL injection detection and prevention techniques[C].2013 International Conference on Informatics and Creative Multimedia.IEEE Computer Society,2013:53-56.
[4] WANG Y,,LI Z.SQL injection detection via program tracing and machine learning[J].Lecture Notes in Computer Science,,2012,76(4):264-274.
[5] LIN Z,,WANG H,,MCCLEAN S.A multidimensional sequence approach to measuring tree similarity[J].IEEE Transactions on Knowledge & Data Engineering,2010,,24(2):197-208.
[6] NATARAJAN K,,SUBRAMANI S.Generation of sql-injection free secure algorithm to detect and prevent sql-injection attacks[J].Procedia Technology,2012,,4(4):790-796.
[7] SONODA M,,MATSUDA T,KOIZUMI D,,et al.On automatic detection of SQL injection attacks by the feature extraction of the single character[C].Proceedings of the 4th International Conference on Security of Information and Networks.ACM,,2011:81-86.
[8] ELSHAZLY K,,F(xiàn)OUAD Y,SALEH M,,et al.A survey of SQL injection attack detection and prevention[J].Journal of Computer & Communications,2014:36(7):150-162.
[9] 張瑞,,楊曉,,譚秀林.基于蓋根鮑爾多項式的SVM核函數(shù)[J].山西大學(xué)學(xué)報:自然科學(xué)版,2013,,36(1):30-33.
[10] 吳少華,,程書寶,胡勇.基于SVM的Web攻擊檢測技術(shù)[J].計算機(jī)科學(xué),,2015,,42(6):362-364.