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