文獻(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ù)輸入動(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]。因此,對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ù)雜,隨著子樹的變化,需要對其進(jìn)行修改。為此,文獻(xiàn)[5]提出了一種基于多維度序列的方法,可以對樹結(jié)構(gòu)進(jìn)行調(diào)整。但是,由于輸入樹結(jié)構(gòu)不同,多維度序列中的連續(xù)維度并不相同,這需要利用特殊方式對多維度序列進(jìn)行相似度測量。對于特征的提取,文獻(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ù)庫級別上正確檢測出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ù)的相似性測量和模式識別。
訓(xùn)練階段中,利用基于向量表示的特征來對SVM進(jìn)行訓(xùn)練,用于后續(xù)檢測階段。在訓(xùn)練階段中,通過向量表示的查詢樹特征作為訓(xùn)練數(shù)據(jù)來構(gòu)建一個(gè)SVM分類模型。
檢測階段中,利用訓(xùn)練好的SVM分類模型對新查詢樹的向量表示特征進(jìn)行處理,以確定這些新查詢樹為正?;驉阂獠樵?,從而檢測SQLIA。
但是,由于原始查詢樹結(jié)構(gòu)十分復(fù)雜,因此轉(zhuǎn)換后的向量也不是線性可分的。對于非線性可分問題,本文采用非線性核函數(shù)來代替數(shù)據(jù)間的點(diǎn)乘積,在原始維度空間上可以完成所有相似性的計(jì)算。本文在SVM中采用的核函數(shù)為多項(xiàng)式核函數(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)。本文首先利用提取的語法和語義特征生成一個(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)對整個(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)。對于路徑的截止節(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表示操作的類型名。對于,本文假設(shè)常量大小為8,使其包含在相應(yīng)的直方圖列的邊界中。然后,將轉(zhuǎn)換成數(shù)值大小8。對于,本文假設(shè)常量的大小為23,這個(gè)常量的值不在直方圖的邊界內(nèi)部。然后,將轉(zhuǎn)化為數(shù)值-23。對于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é)果。對于、和fc,將一個(gè)字符串的值映射為一個(gè)數(shù)值的值。通過采用聯(lián)合模型,一個(gè)數(shù)值對應(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的分量明確表明了查詢樹的語義特征。對于圖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)境對本文提方法進(jìn)行驗(yàn)證。實(shí)驗(yàn)平臺為一臺具備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)
為了評估分類器的性能,通常會(huì)采用受試者工作特征(ROC)曲線,其是以假陽性率(FPR)為橫軸、以真陽性率(TPR)為縱軸形成的二維空間。然而,ROC曲線間常存在交叉, 單純的“優(yōu)于”或“支配”關(guān)系通常并不存在,自然無法相互比較,因此代之以用標(biāo)量型的ROC曲線下的面積(Area Under ROC Curve,AUC)[10]來實(shí)現(xiàn)分類算法間的性能比較。本文以AUC值來評估SQLIA的檢測性能,其中,0.5對應(yīng)隨機(jī)猜測性能,1對應(yīng)最優(yōu)性能。AUC值越高,表明分類器對該類樣本的識別準(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é)果。對于SELECT語句,采用語法特征的方法在階數(shù)為7~8的情況下,AUC為0.963。由于語法結(jié)果根據(jù)用戶輸入數(shù)據(jù)的變化而變化,因此該方法禁用SELECT語句的常量值來獲得較好的性能?;谧址L度模型的方法獲取了優(yōu)異的性能,其中在階數(shù)為6~9的情況下,AUC為0.992?;谧址植寄P偷姆椒ㄒ搏@取了比較優(yōu)異的性能,在階數(shù)為3~7的情況下,其AUC達(dá)到了0.99。但是,這些方法的性能都低于本文方法,本文方法在階數(shù)為3~8時(shí),獲取的AUC都達(dá)到了0.994以上。這是因?yàn)?,本文采用了語義特征和語法特征,提高了對于各種SQL語句的SQLIA檢測的正確率。
圖7給出了組2中INSERT語句的SQLIA檢測精度實(shí)驗(yàn)結(jié)果,采用語法特征的方法獲得了較差的實(shí)驗(yàn)性能,在階數(shù)為1的最優(yōu)情況下,其AUC為0.744?;谧址L度模型的方法在階數(shù)為9時(shí),獲取的AUC最高為0.986?;谧址植寄P偷姆椒ǐ@取了比較優(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分類器的輸入,從而對SQLIA進(jìn)行檢測。構(gòu)建仿真實(shí)驗(yàn),以AUC值作為性能指標(biāo)。結(jié)果表明,與現(xiàn)有方法相比,對于UPDATE語句、SELECT語句以及INSERT語句,本文方案都有效提高了SQLIA的正確檢測率。
在本文的研究中,由于查詢樹具有可變性,所以找到標(biāo)準(zhǔn)的內(nèi)部路徑是本文的難點(diǎn)。在以后研究中,將會(huì)研究一種搜尋方法,使其能夠輕易找到各種數(shù)據(jù)庫系統(tǒng)中查詢樹的內(nèi)部路徑。
參考文獻(xiàn)
[1] 孫義,胡雨霽,黃皓.基于序列比對的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.