關(guān) 慧,盛靖媛,曹同洲
(1.沈陽化工大學計算機科學與技術(shù)學院,遼寧 沈陽 110142; 2.遼寧省化工過程工業(yè)智能化技術(shù)重點實驗室,遼寧 沈陽 110142)
隨著互聯(lián)網(wǎng)時代的到來,Web的安全問題也因其易用性和開放性日益顯著[1-2],根據(jù)2017年開放式Web應用程序安全項目組織OWASP(Open Web Application Security Project) 10大安全漏洞評估的結(jié)果顯示[3],注入類攻擊仍排在前十位中的第一位。因此,如何準確有效地檢測SQL注入攻擊便成為一個值得研究者們思考的問題。
目前針對SQL注入攻擊檢測的研究,主要有基于污點分析的檢測方法[4-5]、基于規(guī)則匹配的檢測方法[6-8]和基于文本特征表示的方法。其中常用的基于文本特征表示的方法如基于改進查詢規(guī)范化的方法[9]、基于Token圖的方法[10]、基于Simhash指紋的方法[11]、基于N-gram的方法[12]、基于信息攜帶的方法[13]、基于六維特征(SDF)轉(zhuǎn)化的方法[14]、基于TFIDF文本向量化的方法[15-17],利用了TFIDF算法中所具有的詞頻以及逆文檔頻率2個指標,通過總結(jié)SQL語句敏感字符并計算其TFIDF值,設計文本向量化方法以實現(xiàn)SQL語句數(shù)據(jù)集到特征向量的轉(zhuǎn)化。
但傳統(tǒng)方法進行數(shù)據(jù)處理并檢測攻擊時會存在以下問題:使用該算法進行向量化后,由于會出現(xiàn)SQL語句中包含的常規(guī)詞與關(guān)鍵字的語句數(shù)量相等或相近的情況,從而使SQL語句所得特征向量屬性表示稍弱,結(jié)果導致關(guān)鍵字權(quán)重描述不準確。
TF表示詞ti出現(xiàn)在SQL語句dj中的頻率。SQL語句中每個詞的詞頻的計算方法如公式(1)所示:
(1)
IDF表示SQL數(shù)據(jù)集中詞ti的逆文檔頻率。SQL語句中每個詞的逆文檔頻率的計算方法如公式(2)所示:
(2)
其中,|D|是數(shù)據(jù)集中的語句總數(shù)目,|{j:ti∈dj}|表示在數(shù)據(jù)集中出現(xiàn)詞ti的語句數(shù)目。如果該詞語不在D中,就會導致除數(shù)為0,因此一般情況下使用|{j:ti∈dj}|+1,即公式(2)改為公式(3):
(3)
傳統(tǒng)的TF-IDF并不能很好地處理特征詞的權(quán)重問題[18-19]。傳統(tǒng)的TF-IDF算法思想認為,某個詞t對于該文本內(nèi)容的重要程度與它的數(shù)量呈現(xiàn)出正相關(guān),但是如果詞t在整個數(shù)據(jù)集中,也就是各個類型的文本中均有出現(xiàn)的話,其計算權(quán)值又會隨著出現(xiàn)次數(shù)的增多而下降,從而說明詞t的區(qū)分能力不強。但實際上,當某些詞多次出現(xiàn)在一個類別的語句中,則該詞幾乎能夠代表這個類的語句文本的特征,應給予較高的權(quán)重,并選來作為該類語句的特征詞。
計算IDF[20]的公式中可以看出,傳統(tǒng)的IDF計算方法僅與數(shù)據(jù)集總數(shù)量、包含特征詞的語句數(shù)量有關(guān),針對以上不足,本文采用加入文本數(shù)量比因子γ對特征詞出現(xiàn)的次數(shù)進行處理。計算方法如公式(4)所示:
(4)
其中,D為數(shù)據(jù)集中語句總數(shù),Ci為類別,Nci為詞ti在類別Ci中出現(xiàn)的語句數(shù)量,NDCi為類別Ci總的語句數(shù)量。
可以看出詞頻比因子的數(shù)值代表了詞ti在某個類別Ci的重要程度,當詞在一個類別中出現(xiàn)的次數(shù)越高,公式計算出的數(shù)值越大,這個詞就越能很好地代表這個類別,應選取作為特征詞。
然而當某個特征詞在每個類別中出現(xiàn)的頻率相同時得到的特征值仍然不能很好地區(qū)分,為解決這個問題引用卡方統(tǒng)計量CHI[21]。CHI的計算公式為:
(5)
其中,N為總語句數(shù)。表1給出了X、Y、M和Q的含義。CHI計算的值越大,說明詞ti與類別Ci之間的相關(guān)程度越高,可以作為該類的特征詞。
表1 類別特征表
為減小不同特征間的差異,加快訓練速度,因此還要對TF-IDF進行歸一化處理,采用min-max標準化(Min-Max Normalization),如公式(6)所示:
(6)
其中X表示當前樣本數(shù)據(jù)值;min表示樣本數(shù)據(jù)最小值;max表示樣本數(shù)據(jù)最大值。
因此,改進后的TF-IDF算法公式為:
(7)
改進后的TF-IDF算法的處理流程如圖1所示。
圖1 改進TF-IDF算法的處理流程圖
實驗流程如圖2所示。
圖2 實驗流程
將數(shù)據(jù)集數(shù)據(jù)進行預處理,首先是使用分詞工具將SQL語句劃分為單詞。分詞過程如表2所示。
表2 SQL語句分詞操作前后對比
在進行完分詞操作后,接下來就是基于改進的TFIDF算法對數(shù)據(jù)集進行文本向量化,每條SQL語句經(jīng)過處理后都可以表示成一個34維特征向量。首先通過對大量SQL注入攻擊語句與合法語句進行分析,并利用總結(jié)的32個敏感字符[15]的i_tfidf值作為SQL語句部分特征點,同時還選擇SQL語句長度和敏感關(guān)鍵詞詞頻[15]作為SQL語句的另外2個特征點。3條SQL注入攻擊樣本如表3所示。樣本經(jīng)過文本向量化處理后得到的文本向量如表4所示。
表3 SQL注入語句樣本
表4 SQL注入攻擊樣本特征
然后進行標記處理。如果該語句是攻擊樣本,則將其標記為-1;如果該語句是正常樣本,則將其標記為1。
實驗的硬件環(huán)境是處理器Intel? CoreTM i7-8850U CPU@1.80 GHz,內(nèi)存8 GB,64位的Win10家庭中文版操作系統(tǒng)。實驗環(huán)境為Python 2.7、Happier Fun Tokenizing。
SQL注入攻擊使用的數(shù)據(jù)來自GitHub上的開源libinjection項目[22],為了使數(shù)據(jù)集具有更多的注入攻擊特征,本文經(jīng)過刪除重復數(shù)據(jù)后挑選出1000條作為SQL注入攻擊語句數(shù)據(jù)集。此外,選擇1000條正常用戶在一定時間內(nèi)對數(shù)據(jù)庫的訪問記錄作為本文實驗中所使用的正常語句數(shù)據(jù)集。
實驗數(shù)據(jù)分為訓練集和測試集,其中每類中選出60%作為訓練集,40%作為測試集,最后根據(jù)實驗結(jié)果對不同種類的分類器進行結(jié)果分析。
本文采用的評價指標包括準確率(Precision)、召回率(Recall)、正確率(Accuracy)和F1值(F-Score)作為檢測分類器性能的綜合評估標準,其計算公式如式(8)~式(11)所示。
準確率指的是在已經(jīng)預測為真的SQL注入語句中,真正類所占的比例。其計算公式如式(8):
(8)
召回率指的是在所有為真的SQL注入語句中,被預測正確的個體所占的比例。其計算公式如式(9):
(9)
正確率指的是在正常語句和SQL注入語句中,正確分類的語句占總語句的比值。其計算公式如式(10):
(10)
為了能更加有效地衡量訓練出的分類器的綜合性能,通常會把F1值當作檢測指標。其數(shù)學公式如式(11):
(11)
公式中的TP、TN、FP、FN[23]含義如表5所示。
表5 混淆矩陣
實驗過程中將經(jīng)過向量化處理的數(shù)據(jù)集導入Python中,將本文提出的基于改進的TF-IDF文本向量化的SQL注入攻擊檢測方法與文獻[14]中提出的基于SVM的檢測方法和文獻[15]提出的基于TF-IDF的檢測方法進行對照實驗。然后分別使用3種不同的分類器進行實驗,排除模型的唯一性,從而使效果越發(fā)準確。
由表6可見,與其他2種方法相比,本文提出的算法的正確率、準確率、召回率和F1值均到達99.96%、99.95%、99.89%和99.92%。這是因為本文提出的改進方法很好地處理了特征詞的權(quán)重問題,彌補了傳統(tǒng)TF-IDF方法以術(shù)語頻率作為文本向量的不足,從而具有更好的檢測效果。
表6 實驗結(jié)果
由于在實際情況下SQL注入攻擊語句的數(shù)量要遠遠小于正常語句,因此將SQL注入攻擊語句數(shù)據(jù)集選擇500條,正常語句選擇1000條做一組實驗,以保證實驗的現(xiàn)實性。實驗結(jié)果如表7所示。
表7 實驗結(jié)果
圖3記錄了模型的訓練時間。
圖3 3種模型的訓練時間
通過圖3可以發(fā)現(xiàn),使用相同的2000條數(shù)據(jù)對3個分類器進行訓練,訓練時間最短的是Boosted Decision Tree。這說明,在同樣的條件下,如果使用Boosted Decision Tree作為分類器的算法,則分類的效率是最高的。
由表6和圖3分析可知,Boosted Decision Tree模型無論是從準確率、召回率、正確率,還是F1值的結(jié)果上來看,對于SQL注入攻擊檢測來說都是最好的分類模型。
本文提出了一種改進的TF-IDF算法的SQL注入檢測方法。經(jīng)過改進的TF-IDF算法對SQL語句的特征詞計算出相對應的權(quán)值,通過卡方統(tǒng)計量改進傳統(tǒng)TF-IDF算法的不足,提高了SQL注入攻擊識別準確率。從實驗結(jié)果可知,改進的TF-IDF算法提高了SQL注入攻擊識別的正確率、準確率、召回率和F1值,這4方面最高可達到99.96%、99.95%、99.89%和99.92%。因此表明,本文改進方法的提出能夠在SQL檢測上具有更好的效果。