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