摘? 要:隨著基于Web的應(yīng)用程序越來越普及,攻擊者常通過欺騙服務(wù)器管理者執(zhí)行惡意的SQL命令,獲取數(shù)據(jù)和用戶密碼等信息,而獲取數(shù)據(jù)庫控制權(quán)限。本文闡述了SQL注入攻擊的類型和研究現(xiàn)狀,探索利用機(jī)器學(xué)習(xí)方法對其進(jìn)行檢測識(shí)別的方法。對URL進(jìn)行有效信息提取,將原始數(shù)據(jù)特征轉(zhuǎn)換為機(jī)器可識(shí)別的數(shù)值型特征,設(shè)計(jì)隨機(jī)森林算法模型和規(guī)則檢驗(yàn)。實(shí)驗(yàn)證明當(dāng)前檢測模型具有較高的準(zhǔn)確率和召回率。
關(guān)鍵詞:SQL注入;機(jī)器學(xué)習(xí);隨機(jī)森林
中圖分類號(hào):TP309.7? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):2096-4706(2019)15-0146-04
Research on SQL Injection Recognition Algorithms Based on Random Forest
CHEN Yonghua
(Information Center of Sichuan Business Department,Chengdu? 610081,China)
Abstract:With Web-based applications are becoming more and more popular. Attackers often obtain database control rights by deceiving server administrators to execute malicious SQL commands,obtain data and user passwords,and so on. This paper describes the types and research status of SQL injection attacks,and explores the use of machine learning methods to detect and identify them. To extract effective information from URL,transform the original data features into machine-recognizable numerical features,and design random forest algorithm model and rule checking. Experiments show that the current detection model has high accuracy and recall rate.
Keywords:SQL injection;machine learning;random forest
0? 引? 言
Web前端與后臺(tái)數(shù)據(jù)庫的交互是通過傳遞請求與應(yīng)答消息來實(shí)現(xiàn)的。這一前后端分離機(jī)制為Web網(wǎng)站帶來了很強(qiáng)的靈活性的同時(shí),也留下了前后端之間的傳遞的消息命令可能被惡意修改的安全隱患。SQL注入(SQL injection)[1]就是惡意攻擊者利用這一漏洞,將特定的SQL語句插入到數(shù)據(jù)庫查詢代碼中,根據(jù)程序返回的結(jié)果,獲得某些其想得知的數(shù)據(jù)(如用戶名、密碼等)。隨著B/S(Browser/Server)模式應(yīng)用開發(fā)的發(fā)展,使用這種模式編寫的應(yīng)用程序越來越多,現(xiàn)如今,SQL注入攻擊成為黑客對數(shù)據(jù)庫進(jìn)行攻擊的常用手段之一。
目前防御SQL注入的方法主要分為兩類,一種是在編碼時(shí)考慮安全因素,盡量減少SQL注入漏洞的存在,另一種是在程序運(yùn)行期間通過額外的措施檢測SQL注入攻擊從而保護(hù)運(yùn)行安全。雖然在編碼階段,通過一定的編碼技巧,可以減少部分SQL注入漏洞[2],但是這種方法會(huì)加大編碼難度和系統(tǒng)的負(fù)荷,而且一些經(jīng)驗(yàn)豐富的攻擊者仍可以通過巧妙地構(gòu)造各種SQL語句繞過這些防御措施,因此程序運(yùn)行階段和用戶輸入階段的防御措施就顯得尤為重要。
程序運(yùn)行階段的安全防御措施主要以各種入侵檢測系統(tǒng)為主,需要采集的信息也不僅僅是應(yīng)用程序本身,而需要擴(kuò)展到用戶的輸入和網(wǎng)絡(luò)流量上來。在基于程序分析的SQL注入檢測系統(tǒng)中,程序分析是指對計(jì)算機(jī)程序進(jìn)行自動(dòng)分析的過程,主要包括靜態(tài)分析和動(dòng)態(tài)分析兩種策略[3]。其中靜態(tài)分析不需要運(yùn)行具體程序,而是通過分析程序的源代碼找到潛在的安全漏洞,具體實(shí)現(xiàn)方法有抽象解釋、約束分析、詞法分析和語法分析等。
近來,隨著機(jī)器學(xué)習(xí)技術(shù)的發(fā)展,大量的研究人員開始采用機(jī)器學(xué)習(xí)方法進(jìn)行SQL注入識(shí)別,如基于特征匹配的SQL注入檢測系統(tǒng)和基于無監(jiān)督的網(wǎng)絡(luò)異常溯源算法的SQL注入檢測系統(tǒng)。用戶輸入階段的防御措施區(qū)別于傳統(tǒng)的SQL注入檢測模型,在對后臺(tái)情況一無所知的情況下,僅通過分析用戶的輸入就可以檢測出可能的SQL注入。文獻(xiàn)[4]提出一種基于關(guān)聯(lián)分析Adaboost+FP-growth算法的SQL注入檢測技術(shù)。在算法層面上,挑選出兩種算法用于設(shè)計(jì)SQL注入檢測模型,其中Adaboost算法可以輸出[0,1]之間的值,最適用于威脅分級(jí)思想,在Adaboost算法分類效果不佳時(shí),則使用FP-growth算法輔助評分,盡可能提高機(jī)器學(xué)習(xí)模塊的準(zhǔn)確性。
本文在綜合國內(nèi)外研究的基礎(chǔ)上,針對目前市場上SQL注入防御系統(tǒng)部署繁瑣、誤報(bào)漏報(bào)率高、效率難以滿足在線檢測的情況,提出一種基于隨機(jī)森林算法的SQL檢測模型,該模型區(qū)別于傳統(tǒng)的SQL注入檢測模型,該模型的最大優(yōu)點(diǎn)在于不用寫千變?nèi)f化的規(guī)則,降低了誤報(bào)的可能。實(shí)驗(yàn)結(jié)果表明本文提出的方法的檢測性能優(yōu)于當(dāng)前其他機(jī)器學(xué)習(xí)模型。
1? 隨機(jī)森林模型
隨機(jī)森林方法最初于2001年提出,其通過重復(fù)采樣技術(shù)從原始訓(xùn)練樣本數(shù)據(jù)集中隨機(jī)提取k個(gè)樣本生成n個(gè)新的訓(xùn)練樣本數(shù)據(jù)集,對新產(chǎn)生的n個(gè)數(shù)據(jù)集生成n個(gè)決策樹組成隨機(jī)森林,測試數(shù)據(jù)的類別根據(jù)隨機(jī)森林中所有決策樹的分類結(jié)果總和確定。隨機(jī)森林是決策樹算法的一種改進(jìn),它結(jié)合了多個(gè)決策樹。每棵樹的建立取決于獨(dú)立提取的樣本。森林中的每棵樹都具有相同的分布,分類錯(cuò)誤取決于樹的分類能力和它們之間的相關(guān)性。特征選擇使用隨機(jī)方法分割每個(gè)節(jié)點(diǎn),然后比較在不同情況下產(chǎn)生的錯(cuò)誤。單個(gè)樹的分類能力可能很小,但在隨機(jī)生成大量決策樹之后,可以通過每個(gè)樹的分類結(jié)果選擇測試樣本以選擇最可能的分類。
基于決策樹構(gòu)建隨機(jī)森林分類模型,隨機(jī)森林模型對數(shù)據(jù)適應(yīng)度非常高,基于大數(shù)據(jù)的訓(xùn)練效率高,能進(jìn)行分布式的并行計(jì)算,且能夠處理非常高維的數(shù)據(jù),對于較稀疏的數(shù)據(jù)集也能很好地適應(yīng),因?yàn)橐腚S機(jī)性較多,基本不會(huì)過擬合。而在決策樹中較為核心的方法為隨機(jī)采樣和特征分裂。隨機(jī)采樣使用了行列采樣的方式,行為有放回的重復(fù)采樣,列為無放回的采樣方式。重復(fù)采樣過程形成采樣數(shù)據(jù)集,包含兩部分?jǐn)?shù)據(jù),分別是訓(xùn)練數(shù)據(jù)集和評估數(shù)據(jù)集。
隨機(jī)森林選擇最佳的特征進(jìn)行分裂時(shí)選擇信息增益進(jìn)行選擇。因此信息增益在隨機(jī)森林中是非常核心的一個(gè)步驟。信息增益計(jì)算如下:
info(D)=pilog2pi
gain(A)=info(D)-info(Dj)
其中,D為訓(xùn)練數(shù)據(jù)集,A為劃分的屬性,m為D的分類數(shù)目,pi為分類i的概率,j為基于A屬性的v個(gè)不同取值。
2? 基于隨機(jī)森林的SQL注入識(shí)別
2.1? 數(shù)據(jù)預(yù)處理
數(shù)據(jù)預(yù)處理的目的一方面是為了提高數(shù)據(jù)的質(zhì)量,另一方面也是為了適應(yīng)所做數(shù)據(jù)分析方法,在本文SQL注入識(shí)別中,除了常規(guī)的數(shù)據(jù)清洗、集成、變換、規(guī)約,還應(yīng)包括如下兩個(gè)預(yù)處理過程。
2.1.1? 編碼處理
URL(Uniform Resource Locator)是分析SQL注入的重要數(shù)據(jù)源,URL通常會(huì)被進(jìn)行Base64編碼、HTTP編碼處理,因此進(jìn)入模型提取特征之前需進(jìn)行解碼預(yù)處理。
2.1.2? 信息提取
完成解碼后,考慮到攻擊通常只會(huì)出現(xiàn)在URL中的特定位置,以此繼續(xù)對URL進(jìn)行有效信息提取,提取主要考慮:
(1)首先刪除URL域名。
(2)如域名后的URL是key-value形式(以多個(gè)“&”分隔),則只對vaue部分進(jìn)行提取。
(3)對URL中可能出現(xiàn)的注釋進(jìn)行刪除。
2.2? 特征工程
特征工程是機(jī)器學(xué)習(xí)重要環(huán)節(jié),直接影響到算法的檢測結(jié)果。本文通過觀察常見的SQL注入和正常的URL之間的區(qū)別,設(shè)計(jì)出以下4大類特征(常規(guī)特征、g檢驗(yàn)特征、特殊符號(hào)特征、關(guān)鍵詞特征),共計(jì)24種特征。
2.2.1? 常規(guī)特征
(1)Parsed_len:使用sqlparse嘗試SQL語句解析,看解析結(jié)果是否包含有效的SQL語句。
(2)Entropy:計(jì)算整個(gè)URL的信息熵,信息熵的計(jì)算公式為:
H(x)=-p(xi)log2 p(xi)
其中,x表示隨機(jī)變量,與之相對應(yīng)的是所有可能輸出的集合,定義為符號(hào)集,隨機(jī)變量的輸出用x表示。p(x)表示輸出概率函數(shù)。變量的不確定性越大,熵也越大,信息量也越大。
(3)Paren_match:計(jì)算URL中不匹配的括號(hào)個(gè)數(shù)。
(4)quotations:計(jì)算URL中不匹配的引號(hào)的個(gè)數(shù)。
2.2.2? G檢驗(yàn)特征
(1)Gtest_mal:計(jì)算一個(gè)解析之后的Token屬于反例的G檢驗(yàn)值。統(tǒng)計(jì)n-gram(這里我們n取3)組成所屬于的類別,然后統(tǒng)計(jì)出n-gram之后每個(gè)Token總的出現(xiàn)的次數(shù),這里定義為t,然后在統(tǒng)計(jì)正常的數(shù)目,這里定義為g,計(jì)算n-gram劃分之后每一個(gè)Token分別屬于正常的數(shù)目和異常的數(shù)目記為,P=G*t。數(shù)據(jù)集總共的條目定義為T,然后得到一個(gè)“經(jīng)驗(yàn)”e=P/T,那么具體的一個(gè)Token的得分就可以描述為:g_score=2.0*I*math.log(I/e),一個(gè)SQL語句通過解析,在通過3-gram就會(huì)得到多個(gè)Tokens,然后分別計(jì)算每個(gè)Token的值,然后取均值:sum(g_scores)/len(g_scores)。
(2)Gtest_leg:和Gtest_mal相似,不同之處在于統(tǒng)計(jì)Token總的出現(xiàn)為惡意的次數(shù)。
2.2.3? 特殊符號(hào)特征
(1)pattern_symbols:計(jì)算URI(Universal Resource Identifier)中特殊符號(hào)的數(shù)量。
(2)pattern_funcs:計(jì)算URI中特殊函數(shù)的數(shù)量。
(3)pattern_encodes:計(jì)算URI中包含的特殊編碼的數(shù)量。
(4)pattern_puncs:計(jì)算URI中包含的特殊操作符的數(shù)量。
(5)pattern_not_keywords:計(jì)算非SQL注入的特殊操作符的數(shù)量。
2.2.4? 關(guān)鍵詞特征
把解碼后的數(shù)據(jù)去掉特殊字符,去掉多余的空格后用sqlparse解析,解析后的每個(gè)單詞對應(yīng)不同的repr_name,具體包括如下五類:
(1)把keyword分為4種類型,不同的詞對應(yīng)不同的權(quán)重,把相對重要的詞歸為一類,相對不重要的詞歸為不同的類。
(2)把Identifier分為2種類型,Sqlparse模塊解析單個(gè)Token后,認(rèn)為無用的詞被劃分為Identifier,但其中包含很多SQL中的關(guān)鍵詞。提取關(guān)鍵詞,把相對重要的詞歸為一類,相對不重要的詞歸為另一類。
(3)Case類型中還包括完整的SQL語句,提取單個(gè)Case語句后,再單獨(dú)解析里面的SQL關(guān)鍵詞。
(4)Where類型中可能還包括完整的SQL語句,因觀測樣本較少,暫未對Where語句做更多的關(guān)鍵詞提取。
(5)Irregular_count:計(jì)算URL中大小寫不規(guī)范詞的數(shù)量。
2.3? 算法
在數(shù)據(jù)預(yù)處理和特征工程后,就能采用隨機(jī)森林進(jìn)行SQL注入識(shí)別,基于決策樹構(gòu)建隨機(jī)森林分類模型的算法流程如表1所示。
基于隨機(jī)森林模型進(jìn)行K折交叉訓(xùn)練,最終確定模型參數(shù)并將生成模型,進(jìn)行下一步的模型預(yù)測。模型由默認(rèn)的10棵樹組成,訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù)按照60%比40%劃分。
3? 性能測試與分析
3.1? 數(shù)據(jù)來源
3.1.1? 訓(xùn)練與驗(yàn)證數(shù)據(jù)
正樣本包含一個(gè)數(shù)據(jù)文本samples.txt,共計(jì)1594996正例樣本。負(fù)樣本包含三個(gè)數(shù)據(jù)文本,共計(jì)215920負(fù)例樣本。正樣本數(shù)據(jù)明顯高于負(fù)樣本數(shù)據(jù),采用欠采樣的方式平衡數(shù)據(jù)集,平衡后的數(shù)據(jù)按照6:4的比例劃分為訓(xùn)練集和測試集。
3.1.2? 測試數(shù)據(jù)
測試數(shù)據(jù)分為漏報(bào)率測試數(shù)據(jù)和誤報(bào)率測試數(shù)據(jù)。誤報(bào)測試數(shù)據(jù)包括10余個(gè)數(shù)據(jù)文本,共計(jì)2785測試樣本。誤報(bào)測試數(shù)據(jù)包括14011000誤報(bào)日志等5個(gè)數(shù)據(jù)文本,共計(jì)9245測試樣本。
3.2? 測試環(huán)境
在數(shù)據(jù)分析和模型建立之前需要搭建一套完整的環(huán)境,供測試和開發(fā)使用,需要對環(huán)境中各個(gè)軟件和包進(jìn)行說明。具體見表2所示。
3.3? 模型調(diào)優(yōu)
本文采用sklearn中的RandomForestClassifier類來實(shí)現(xiàn)隨機(jī)森林模型,其含有大量可調(diào)參數(shù),主要包括如下參數(shù):
(1)max_features:RF劃分時(shí)考慮的最大特征數(shù)。
(2)max_depth:決策樹最大深度。
(3)min_samples_split:內(nèi)部節(jié)點(diǎn)再劃分所需最小樣本數(shù)。
(4)min_samples_leaf:葉子節(jié)點(diǎn)最少樣本數(shù)。
(5)min_weight_fraction_leaf:葉子節(jié)點(diǎn)最小的樣本權(quán)重和。
(6)max_leaf_nodes:最大葉子節(jié)點(diǎn)數(shù)。
(7)min_impurity_split:節(jié)點(diǎn)劃分最小不純度。
本文使用網(wǎng)格搜索對上述每個(gè)參數(shù)進(jìn)行調(diào)優(yōu),調(diào)優(yōu)前和調(diào)優(yōu)后的學(xué)習(xí)曲線分別如圖1所示??梢娬{(diào)優(yōu)后,訓(xùn)練集和驗(yàn)證集的準(zhǔn)確度都相差不大,在現(xiàn)有的數(shù)據(jù)集上已經(jīng)相對減小了過擬合現(xiàn)象,提高了模型的泛化能力。
3.4? 測試結(jié)果
本文采用漏報(bào)率、誤報(bào)率指標(biāo)分析各個(gè)算法的SQL注入識(shí)別性能。誤報(bào)率和漏報(bào)率是廣泛用于信息檢索和統(tǒng)計(jì)學(xué)分類領(lǐng)域的兩個(gè)度量值,用來評價(jià)檢測結(jié)果的質(zhì)量。其定義如下:
誤報(bào)率:FN/(TP+FN)
漏報(bào)率:FP/(FP+TN)
其中:
TP:預(yù)測為正,實(shí)際為正的樣本數(shù);
FP:預(yù)測為正,實(shí)際為負(fù)的樣本數(shù);
TN:預(yù)測為負(fù),實(shí)際為負(fù)的樣本數(shù);
FN:預(yù)測為負(fù),實(shí)際為正的樣本數(shù)。
本文和近幾年SQL注入檢測的算法精度進(jìn)行對比,比較結(jié)果如表3所示。
由表3可見,和其他方法相比,本文所使用的隨機(jī)森林方法準(zhǔn)確率最高,且漏報(bào)率和誤報(bào)率最低,證實(shí)本文方法在SQL注入識(shí)別上的有效性。
4? 結(jié)? 論
本文使用隨機(jī)森林算法做SQL注入檢測。在隨機(jī)森林算法建模前,加入Base64解碼函數(shù)和HTTP解碼函數(shù),規(guī)范了數(shù)據(jù)集,減少了噪聲對數(shù)據(jù)的干擾。特征構(gòu)建過程中,通過一邊訓(xùn)練模型一邊觀測模型效果和數(shù)據(jù)集的方式,最后將特征分為4大類,24種小類的特征進(jìn)行模型訓(xùn)練。
相比其他算法,隨機(jī)森林算法在大數(shù)據(jù)集上有著很大的優(yōu)勢:由于特征子集在算法中是隨機(jī)選擇的,每次訓(xùn)練不同的模型,選取的特征都不一樣,能夠處理很高維度的數(shù)據(jù)并且不用做特征選擇;模型的泛化能力強(qiáng),對于不同的噪聲數(shù)據(jù)有著很好的區(qū)分能力;訓(xùn)練速度快,容易做成并行化方法。實(shí)驗(yàn)表明本文所提方法具有較高的準(zhǔn)確率,且漏報(bào)率和誤報(bào)率較低。
參考文獻(xiàn):
[1] 羅麗紅,柯靈,楊華瓊.web安全之SQL注入漏洞及其防御 [J].網(wǎng)絡(luò)安全技術(shù)與應(yīng)用,2017(11):81-82.
[2] 萬欣.網(wǎng)絡(luò)日志在網(wǎng)絡(luò)信息安全中的應(yīng)用 [J].網(wǎng)絡(luò)空間安全,2018,9(3):78-81.
[3] 劉祎璠.基于靜態(tài)分析的SQL注入漏洞檢測方法研究 [D].長沙:湖南大學(xué),2015.
[4] 鄭彥,蔣磊.基于機(jī)器學(xué)習(xí)的SQL注入檢測技術(shù)研究 [D].南京:南京郵電大學(xué),2017.
作者簡介:陳擁華(1971.08-),男,漢族,四川安岳人,工程師,工學(xué)學(xué)士,研究方向:網(wǎng)絡(luò)安全、人工智能。