周 穎,方 勇,黃 誠,劉 亮
(1.四川大學 電子信息學院,成都 610065; 2.四川大學 網(wǎng)絡空間安全學院,成都 610207)(*通信作者電子郵箱opcodesec@gmail.com)
隨著互聯(lián)網(wǎng)技術的高速發(fā)展,Web應用程序在人類生活發(fā)展中起到重要的媒介和資產(chǎn)管理作用。然而由于開發(fā)人員安全意識不足,全球大部分網(wǎng)站遭受了不同程度的Web攻擊。據(jù)2016年中國網(wǎng)站安全漏洞形勢分析報告[1],SQL(Structured Query Language)注入[2]攻擊占據(jù)漏洞類型的44.9%,占網(wǎng)站衛(wèi)士攔截攻擊類型的39.8%;而且Web應用一旦被發(fā)現(xiàn)SQL注入漏洞,容易形成通用漏洞,威脅范圍廣泛,影響巨大。所以,為保護互聯(lián)網(wǎng)信息安全,SQL注入行為檢測是至關重要的一個環(huán)節(jié)。PHP(Hypertext Preprocessor)作為一個優(yōu)秀的腳本語言,由于其開發(fā)周期短、成本低和豐富的擴展資源等優(yōu)秀特性,在Web技術上已成為主流。據(jù)2016年Web漏洞統(tǒng)計[3],87%的漏洞對應的開發(fā)語言為PHP,那么,在PHP應用程序中,檢測SQL注入行為愈顯重要。
對于SQL注入行為檢測技術,國內外學者進行了如下研究。Kar等[4]提出基于文檔相似性匹配的檢測方法,在最常發(fā)生SQL注入的位置提取子句,建立惡意子句的哈希庫;由于在實際應用中發(fā)生SQL注入的位置較多,難以建立起覆蓋面較全的惡意子句庫。趙宇飛等[5]以網(wǎng)絡流量作為數(shù)據(jù)源,從網(wǎng)絡環(huán)境中提取惡意請求較正常請求流量中有較大區(qū)別的特征檢測SQL注入;但該檢測方法缺乏SQL注入行為的針對性,容易將其他攻擊行為誤判為SQL注入行為。由于SQL語句的上下文無關性,惡意語句和正常語句在語義和語法上有較明顯的區(qū)別,因此,語法分析技術被應用在SQL注入行為的檢測中。Priyaa等[6]運用支持向量機(Supported Vector Machine, SVM)分類算法檢測SQL注入,通過片段化的SQL語法樹,提取語法和語義特征建立多維特征向量,訓練SVM分類器。該方法的數(shù)據(jù)來源為數(shù)據(jù)庫日志,由于數(shù)據(jù)庫日志缺少訪問者信息,因此該方法并不適用于攻擊溯源。傳統(tǒng)的基于Web日志[7]的SQL注入檢測技術,將日志中的訪問信息作為SQL注入檢測憑證時,由于信息的不完整性,無法判斷用戶輸入是否進入數(shù)據(jù)庫層。對于PHP應用程序,污點分析技術被應用于SQL注入行為檢測中,分為基于不可信源[8]和可信源[9]進行污點分析,通過污點分析技術,能夠定位SQL語句中外部輸入點。上述文獻在實現(xiàn)異常檢測中,只通過檢測不可信源中的攻擊關鍵詞等單一特征,并使用規(guī)則性的檢測方法,存在較高誤報率。上述文獻在進行污點標記時,對每個字符都進行來源標記,這種標記方法為其后分詞添加了大量不確定性;過多的污點標記和污點凈化,難免對正常的業(yè)務邏輯產(chǎn)生影響。通常產(chǎn)生SQL注入的外部輸入點有限,若是對所有可信源進行標記將產(chǎn)生大量冗余操作,并使服務器負載較大。
為提高SQL注入行為檢測的有效性和準確率,基于PHP應用程序,本文將污點分析和日志分析技術相結合,進行了如下研究工作。
1)本文基于PHP擴展技術[10],重寫PHP原生方法,在代碼層對SQL語句執(zhí)行函數(shù)進行監(jiān)聽,對不可信源進行屬性標記以實現(xiàn)對攻擊者可控點的跟蹤,不影響變量存取過程。
2)本文基于抽象語法樹[11]和SQL語法,將污點標記技術[12]應用于詞法分析和語法分析中,實現(xiàn)SQL語句和內部污點的抽象化。
3)本文通過對語法樹中的污點節(jié)點進行分析,基于詞法、語法和語義,提取了SQL注入語句區(qū)別于正常語句的多方面特征,并使用機器學習方法,實現(xiàn)了SQL注入行為檢測模型。
本文提出了基于污點分析的SQL注入行為檢測模型,模型設計如圖1所示。
圖1 模型設計圖
按以下流程進行SQL注入行為檢測:
1)信息提取過程。
外部輸入進入PHP應用程序,在PHP代碼編譯時,通過PHP擴展獲取包含外部輸入的SQL語句、外部變量和攻擊者請求頭信息,并將上述信息按格式存入日志文件。
2)污點標記過程。
從日志文件中讀取SQL語句和外部變量,生成污點標記源,經(jīng)過污點標記后,生成污點語法樹。
3)異常檢測模型。
基于污點語法樹,提取污點子樹和詞法兩類特征,選擇隨機森林算法[13]對SQL注入行為和正常行為進行分類訓練,得出異常檢測模型。對異常檢測模型篩選出的SQL注入行為,記錄其攻擊載荷(payload)和攻擊者信息。
通過對圖2攻擊語句流動分析可知,攻擊語句作為HTTP(HyperText Transfer Protocol)請求參數(shù)傳入服務器,經(jīng)由服務端代碼渲染后,傳遞給SQL函數(shù),最終在數(shù)據(jù)庫中執(zhí)行。在PHP應用程序中,可通過擴展技術在代碼層獲取SQL語句、外部變量和攻擊者信息。
圖2 攻擊語句流動圖
對于上述信息,本文通過內核提供的“PG(http_globals)”對攻擊者可控點進行請求初始化。定義全局數(shù)組存取外部變量和外部變量來源,當攻擊者可控全局變量被賦值,將信息依次存入數(shù)組中,以數(shù)組索引值對該變量進行外部標記。重寫PHP基礎函數(shù)中的字符串類和解碼類,當傳入?yún)?shù)帶有外部標記,將標記轉移給返回值,并以標記值作為索引覆蓋上述數(shù)組中的值。對OPCODE(Operation Code)[14]中函數(shù)執(zhí)行類“DO_FCALL”和“DO_FCALL_BY_NAME”自定義處理函數(shù)。在處理函數(shù)中監(jiān)控SQL函數(shù)調用,當傳入?yún)?shù)帶有外部標記,記錄該SQL語句。從全局變量“SERVER”中可獲取攻擊者請求頭信息,以IP地址(Internet Protocol Address)、用戶代理(User-Agent)、HTTP cookie(Cookie)、當前時間戳(Timestamp)作為攻擊者的標識參數(shù),使用MurmurHash算法對以上參數(shù)加密,得到識別攻擊者的Hash值。
通過“php_log_err”接口,將上述信息存入日志文件,如表1所示。對于日志中的內容,以攻擊者Hash作為請求區(qū)分點,對日志中記錄的信息進行處理。如圖3所示,將外部變量中的元素代入SQL語句中進行匹配,對匹配到的內容使用上文中的Hash值進行首尾標記,作為觀測點。將帶觀測點的SQL語句作為污點標記源。
表1 日志保存的信息
圖3 污點標記源生成圖
對污點標記源作語法分析,以主要SQL保留字作為樹枝節(jié)點,對樹枝節(jié)點分別描述語法規(guī)則[15]。以“SELECT”為例,一條完整的“SELECT”語句將引用“WHERE”“GROUP BY”等其他保留字語法規(guī)則,其語法規(guī)則如下:
SELECT[ALL|DISTINCT|DISTINCTROW|TOP]
{*|table.*|[table.]col[AS alias1][,[table.]field2[AS alias2][,…]]}
[FROM table_expr[,…][IN external_database] [WHERE condition_expr operator condition_expr]
[GROUP BY group_by_expr]
[HAVING condition_expr operator condition_expr]
[ORDER BY condition_expr [ACS|DESC]]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
[PROCEDURE procedure_name(argument_list)]
[FOR UPDATE|LOCK IN SHARE MODE]]
語法樹建立過程如下。
1)節(jié)點結構定義。在構建語法樹前,定義語法樹的節(jié)點結構,如圖4所示,包含節(jié)點類型、節(jié)點值和污點標記。以節(jié)點值作為污點語法樹的主節(jié)點,相鄰右節(jié)點為污點標記節(jié)點,相鄰左節(jié)點表示節(jié)點類型。
圖4 節(jié)點結構
2)詞法分析階段。根據(jù)SQL語言特性,定義分隔符將SQL語句數(shù)組化,針對轉義符和其他特殊字符對分隔后的數(shù)組進行合并或分割處理。根據(jù)觀測點的首尾標記,對標記之間的元素設置污點標記值為1。由于包含子句的元素在語法分析階段將被再次分詞,因此,若元素包含子句,保留其觀測點首尾標記;否則去掉觀測點首尾標記。
3)語法分析階段。檢測節(jié)點中的SQL保留字,以保留字作為樹枝節(jié)點,其后節(jié)點作為葉節(jié)點,并根據(jù)保留字選擇處理分支,按相應語法規(guī)則基于深度優(yōu)先原則進行解析。以SELECT處理分支為例,使用偽代碼描述算法如下。
算法1 樹枝節(jié)點子句語法分析。
輸入:node
/*樹枝節(jié)點*/
node_attr
/*樹枝節(jié)點污點屬性*/
tokens
/*葉節(jié)點*/
tokens_attr
/*葉節(jié)點污點屬性*/
輸出:sub_tree
/*污點子樹*/
BEGIN
初始化:令SELECT表達式expression和表達式屬性
expression_attr為空;
switch node do
case node=′SELECT′:
for i=0 to length(tokens) do
if tokens[i]=′,′ then
SELECT表達式分析(expression,expression_a ttr)
置空expression和expression_attr
else
expression=expression+tokens[i]
token_attr=token_attr||node_attr[i]
expression_attr=[node_attr[i-1],token_att r,
node _attr[i+1]]
function SELECT表達式分析:
(sub_tokens,sub_tokens_attr)=lexer(expressio n,
expression_attr)
/*再次進行詞法分析*/
sub_tree=parser(sub_tokens,sub_tokens_attr)
/*再次進行語法分析,返回子樹節(jié)點和污點屬性*/
設置sub_tree節(jié)點結構
end
output sub_tree
case node=′FROM′:…
case node=′ORDER′:…
…
END
語法分析完成后,生成污點語法樹。例如SQL語句“select * from ___”,若下劃線處為外部輸入點,該SQL語句本意為拼接表名,因此正常語句將輸入符合表名格式的單一字符串,例如,“select * from abc”;而異常語句的輸入則為帶攻擊或測試目的的非單一字符串,例如,“select * from abc where 1=2”,該異常語句通過引入“where”關鍵字與表達式,并根據(jù)與正常語句返回結果的異同,測試該處是否存在SQL注入。異常語句和正常語句的污點語法樹數(shù)組結構分別如圖5~6所示。
圖5 異常語句污點語法樹
圖6 正常語句污點語法樹
SQL注入的目的是改變原有語句的邏輯,以SQL保留字和運算符替換原本只能作為數(shù)值傳入SQL語句的內容,而上述改變在污點節(jié)點中能夠得到體現(xiàn)。本文對SQL注入行為在污點語法樹中表現(xiàn)出的特征進行分析和提取,將特征分為污點子樹特征和詞法特征兩類。
1.3.1 污點子樹特征
SQL注入行為,由于其目的在于數(shù)據(jù)竊取和遠程命令執(zhí)行,其請求數(shù)據(jù)會帶有SQL保留字、函數(shù)和相應運算符等。上述惡意關鍵字將直接影響語法樹結構,并根據(jù)污點節(jié)點中的“SELECT”等關鍵字產(chǎn)生一個或多個污點子樹。
1)污點子樹的提取。
基于深度優(yōu)先(Depth-First-Search, DFS)算法[16]遍歷語法樹,從頭節(jié)點開始,搜索污點標記節(jié)點,將最先搜索到的污點節(jié)點作為污點子樹頭節(jié)點,語法樹中的邊表示節(jié)點與節(jié)點之前的嵌套關系,當邊同時連接兩個污點節(jié)點時,將被連接節(jié)點加入相應污點子樹。最終生成污點子樹集中包含了所有污點子樹和節(jié)點信息。算法描述如下。
算法2 污點語法樹遍歷。
輸入:taintTree
/*污點語法樹*/
輸出:subTaintTree
/*污點子樹集*/
BEGIN
初始化:存儲節(jié)點棧stack為空;污點子樹集subTaintTree為空;當前節(jié)點Vm為空,當前節(jié)點父節(jié)點Vn為空;
for i=0 to length(taintTree) do
stack.push(taintTree[i])
/*第一層節(jié)點入棧*/
end
while stack非空 do
Vm = stack.pop()
/*從棧頂取出當前節(jié)點*/
if Vm[1].children非空 then
/*Vm存在子節(jié)點*/
Vn=Vm
/*Vm作為下一元素父節(jié)點*/
stack.push(Vm[1].children)
if Vm[2]=1 then
/*添加節(jié)點至污點子樹*/
switch Vn do
case subTaintTree中存在Vn
subTaintTree[Vn].add(Vm[1].key)
/*將Vm添加至其父節(jié)點中*/
case subTaintTree中不存在Vn or Vn=null
subTaintTree.add(Vm[1].key)
/*將Vm加入污點子樹集*/
end
output subTaintTree
END
2)污點子樹基本特征。
通過對正常樣本進行污點子樹提取后發(fā)現(xiàn),正常語句中的污點節(jié)點通常以單節(jié)點子樹的形式組成污點子樹集。而惡意樣本中的SQL注入語句,在污點子樹集中體現(xiàn)為一個或多個包含子節(jié)點的污點子樹,因此,異常語句的污點子樹集在寬度和深度上較正常語句有明顯的區(qū)別。所以本文選擇污點子樹的寬度和深度作為一組基本結構特征。
將算法2得出的污點子樹集表示為:subTaintTree={T0,T1,…,Tn}。將污點子樹子節(jié)點最大層數(shù)作為其深度,并計算整個污點子樹集的平均深度作為結構特征之一;將污點子樹中每層節(jié)點數(shù)的最大值作為寬度,并計算污點子樹集中子樹的平均寬度作為結構特征之一:
(1)
(2)
當污點子樹深度大于1時,表明頭節(jié)點帶有關鍵字,并和其后內容產(chǎn)生了嵌套關系,將其稱為嵌套子樹。當SQL語句中出現(xiàn)了較多外部輸入拼接點時,如“insert”型注入,由于其產(chǎn)生注入的位置單一,此時,平均深度和寬度特征的可信度被降低,因此,通過計算污點子樹集中的嵌套子樹所占比,同作為基本特征,以減小上述情況出現(xiàn)的誤差。
3)污點子樹語義相似度。
語義相似度能表示詞語的相似性,由于污點子樹頭節(jié)點能體現(xiàn)一個嵌套子樹的SQL語句類型;而惡意關鍵字通常出現(xiàn)在頭節(jié)點,且在SQL語義上與正常值的相似度較低。當SQL語句中存在多個外部輸入拼接點,或單個拼接點的外部輸入被分為多個子樹時,由于正常請求中外部輸入值的數(shù)值性和賦值規(guī)范性,在生成的污點子樹集中,每個子樹的頭節(jié)點語義相似度較高;而異常請求生成的污點子樹集中,由于某些子樹中出現(xiàn)嵌套,其頭節(jié)點為各類關鍵字,因此語義相似度較低?;谏鲜鰠^(qū)別,本文對污點子樹集中的子樹頭節(jié)點計算語義相似度作為特征。
基于信息量理論,Lin[17]提出了基于樹狀結構中兩個節(jié)點所含的信息量的大小計算語義相似度的方法:
(3)
其中:S1、S2表示兩個子樹頭節(jié)點,Sp表示S1、S2的最近共同父節(jié)點,P表示該節(jié)點的子節(jié)點個數(shù)和樹中的所有節(jié)點個數(shù)比值。本文在計算過程中,S1為污點子樹集中第一個單節(jié)點,其他子樹頭節(jié)點分別作為S2,與S1計算相似度,取其平均值;當子樹集不存在單節(jié)點時,S1為第一個子樹的頭節(jié)點;當子樹集只有一個污點子樹時,將該特征設置為缺省。
1.3.2 詞法特征
為降低誤報率,本文收集了大量假陽性樣本,樣本中的內容為無SQL語義的復雜語句。例如“union selected 1”。傳統(tǒng)的異常檢測方法將其判定為注入行為,但實際上因關鍵字錯誤,屬于非注入行為。經(jīng)過污點子樹特征提取后發(fā)現(xiàn),部分假陽性樣本的污點子樹集中也出現(xiàn)了嵌套子樹,單從污點子樹結構特征進行異常判定存在誤報,所以本文對污點語法樹中的詞法特征進行分析提取。
1)惡意節(jié)點泛化。
經(jīng)過語法分析,污點語法樹的節(jié)點中已定義了節(jié)點類型,將節(jié)點類型作為詞性標注。通過詞性可得出污點子樹中為關鍵字、運算符、SQL函數(shù)的節(jié)點。從SQL語法規(guī)則中提取出985個關鍵詞作為惡意節(jié)點內容,如表2所示。將出現(xiàn)表中關鍵詞的節(jié)點作為惡意節(jié)點并作泛化處理。對于不在表中的特殊字符,如“(”等,保留其原始形式,將其他字符串歸一為常量。按照表2和部分特殊字符組成惡意節(jié)點表。
2)節(jié)點基本特征。
為驗證惡意節(jié)點中哪些特征對區(qū)分SQL注入行為有明顯的效果,本文從實驗數(shù)據(jù)中隨機抽選了500個正常樣本和等量惡意樣本進行分析計算。其中正常樣本中包含部分假陽性樣本。對惡意樣本和正常樣本中的節(jié)點數(shù)和惡意節(jié)點數(shù)進行統(tǒng)計,如圖7所示。從圖中可看出,惡意樣本中節(jié)點數(shù)普遍高于正常樣本,由于假陽性樣本的加入,正常樣本中也體現(xiàn)出多節(jié)點的情況。而正常樣本在節(jié)點數(shù)增加時,惡意節(jié)點所占比例并不會隨著增加。反而惡意樣本中惡意節(jié)點所占比普遍保持在0.3至0.6之間。所以本文選擇惡意節(jié)點所占比和節(jié)點總數(shù)作為基本特征。
表2 關鍵詞泛化表
圖7 節(jié)點基本特征比較
3)惡意節(jié)點組合概率。
當出現(xiàn)單個惡意節(jié)點時,并不能體現(xiàn)語句是否是SQL注入行為,例如“union selected 1”,所以本文對惡意節(jié)點組合出現(xiàn)概率進行計算。對泛化后的節(jié)點刪除內部常量,以父節(jié)點和左節(jié)點作為前序節(jié)點,組合為只有關鍵詞組成的表達式。該表達式滿足內部某關鍵詞狀態(tài)只與前一關鍵詞狀態(tài)有關。該表達式作為一個序列具有馬爾可夫性質。本文采用N-Gram模型[18]建立惡意節(jié)點組合的概率模型。利用惡意樣本建立一步狀態(tài)轉移矩陣P,Pij表示第n位為j的前提下,第n+1位為i的概率:
Pij=P(Xn+1=i|Xn=j)
(4)
以“^”和“$”作為起始符和結束符。通過一步狀態(tài)轉移矩陣,可以得出序列Xn={^,x0,x1,…,xn,$}滿足上述轉移矩陣的概率Pn。Pn體現(xiàn)了一個序列中出現(xiàn)惡意節(jié)點組合的概率:
(5)
在訓練過程中,直接相乘會導致數(shù)據(jù)下溢,因此對上述結果作對數(shù)處理;為避免概率為0導致樣本數(shù)據(jù)稀疏,使用回退算法(Katz Backoff)對數(shù)據(jù)進行平滑處理。將結果作為惡意節(jié)點組合概率特征。
隨機森林算法能夠快速處理大量數(shù)據(jù)并實現(xiàn)高準確率的分類效果。由于本文提取的污點子樹語義相似度特征存在缺省值,而隨機森林算法對缺省值并不敏感?;谏鲜鰞?yōu)點,本文選擇隨機森林算法建立分類模型。過程如下:
1)從SQL注入攻擊工具中提取各類SQL注入的攻擊載荷(payload),以其為樣本,基于N-Gram模型建立惡意節(jié)點組合的概率模型。
2)獲得訓練樣本的污點語法樹后,根據(jù)惡意節(jié)點表,計算節(jié)點基本特征;將污點節(jié)點序列化,計算惡意節(jié)點組合概率。
3)按1.3.1節(jié)中方法提取污點子樹,計算污點子樹基本特征,對于非單一元素子樹集,計算其子樹語義相似度。
4)數(shù)字化特征與其類別如表3所示。利用隨機森林算法對正常樣本和惡意樣本進行分類訓練,并使用十字交叉驗證對其分類性能進行驗證。將得到的隨機森林分類模型作為異常檢測模型。
表3 基于污點語法樹提取的特征
本文采用以下步驟實現(xiàn)基于污點分析的SQL注入行為檢測模型:
1)本文使用PHP源碼中提供的動態(tài)編譯擴展的方法,將信息提取部分作為一個可裝載的so文件加載在PHP中。
2)本文參照了SQL-parser[19],對詞法分析器和語法分析器算法和邏輯進行改進,實現(xiàn)污點標記的語法分析過程,最終生成污點語法樹。
3)對于異常檢測模型,實驗分別選取了5 000個惡意樣本和正常樣本。其中正常樣本中包含了無SQL語義字符串和其他類型攻擊樣本,如跨站腳本攻擊(Cross Site Script Attack, XSS);惡意樣本中包含了從Github[20]中搜集的SQL注入攻擊載荷(payload),包括5種常見SQL注入攻擊語句:布爾型注入、報錯型注入、聯(lián)合查詢注入、多語句查詢注入和時間延遲注入。此外使用SQL自動攻擊工具,針對不同的注入點,生成相匹配的攻擊載荷。
為驗證方法有效性,本文在一個PHP應用程序中預設了數(shù)據(jù)操縱語言(Data Manipulation Language, DML)中的四種語句,在每個語句中設置多個外部輸入點,分別為查詢項、表名、賦值語句等常見注入發(fā)生點。測試過程中,本文在該應用程序中每個注入點下模擬攻擊者行為,通過工具和手工頻繁發(fā)送SQL注入行為請求,并對本文模型的檢測結果進行統(tǒng)計和準確性計算。實驗詳細測試環(huán)境:操作系統(tǒng)為Linux ubuntu 4.4.0- 75-generic;內存為2 GB;Web服務器版本為Apache 2.4.10;PHP版本為PHP 5.3.10。
為驗證基于污點分析的SQL注入行為檢測模型的準確性,并和現(xiàn)有SQL注入檢測技術進行對比,本文對兩種方法和所提模型進行對比實驗。包括基于關鍵字的檢測方法和基于正則表達式的檢測方法。
基于關鍵字的檢測方法:根據(jù)表2建立關鍵字列表,待檢測樣本中一旦出現(xiàn)關鍵詞則判定為注入行為?;谡齽t表達式的檢測方法:使用開源Web框架中的通用PHP防護代碼[21],其中防御SQL注入的功能由正則表達式實現(xiàn)。
本文對1.3節(jié)中提出的兩類特征進行了評估,分別只采用污點子樹結構特征和詞法特征與本文模型進行對比實驗。采用混淆矩陣的評估方法評估檢測結果,評價指標包括精確率(Precision, P)、準確率(Accuracy, ACC)、召回率(Recall, R),及精確率和召回率的調和均值(F1-Measure,F1)。
通過檢測結果表4可看出,本文模型相對于基于關鍵字和正則表達式的檢測方法,準確率明顯提高;只選取污點子樹結構特征和詞法特征進行檢測時,準確率皆低于本文模型準確率。與文獻[6]中提出的SVM檢測算法相比,本文模型的準確率提升了1.1個百分點;并且,對于被編碼的請求,使用基于流量的第三方SQL注入行為檢測工具,例如網(wǎng)站安全狗[22],并未檢測出其中的SQL注入行為,但由于本文模型在代碼層截獲數(shù)據(jù),編碼后的請求在代碼層內被解碼,所以能準確地檢測出編碼請求是否是SQL注入行為。
表4 測試數(shù)據(jù)檢測結果 %
本文研究了在PHP應用程序下檢測SQL注入行為的方法,提出了基于污點分析的SQL注入行為檢測模型,其中主要運用的技術點為:PHP擴展開發(fā)、SQL語法分析、污點分析技術和隨機森林分類算法。實驗結果表明,本文提出的模型在PHP應用程序中檢測SQL注入行為有著較高的準確率。
由于本文通過PHP擴展獲取信息后基于日志文件進行提取,因此具有一定滯后性;今后的研究方向在于將污點標記過程和異常檢測模型融合在PHP擴展中,實現(xiàn)SQL注入行為的實時檢測和攔截。
References)
[1] 360安全.2016年中國網(wǎng)站安全漏洞形勢分析報告[EB/OL].(2017- 01- 05)[2017- 06- 20]. http://bobao.#/news/detail/3905.html.(360 safe. Analysis report of Chinese Website security vulnerability in 2016 [EB/OL]. (2017- 01- 05)[2017- 06- 20]. http://bobao.#/news/detail/3905.html.)
[2] 王丹,趙文兵,丁治明.Web應用常見注入式安全漏洞檢測關鍵技術綜述[J].北京工業(yè)大學學報,2016,42(12):1822-1832.(WANG D, ZHAO W B, DING Z M. Review of detection for injection vulnerability of Web applications [J]. Journal of Beijing University of Technology, 2016, 42(12): 1822-1832.)
[3] youyou0635.2016年度Web漏洞統(tǒng)計之Exploit-db[EB/OL].(2017- 01- 23)[2017- 06- 20].http://www.freebuf.com/vuls/125382.html.(youyou0635. Web vulnerability statistics from Exploit-db in 2016 [EB/OL]. (2017- 01- 23)[2017- 06- 20]. http://www.freebuf.com/vuls/125382.html.)
[4] KAR D, PANIGRAHI S, SUNDARARAJAN S. SQLiDDS: SQL injection detection using query transformation and document similarity [C]// Proceedings of the 2015 International Conference on Distributed Computing and Internet Technology. Berlin: Springer, 2015: 377-390.
[5] 趙宇飛,熊剛,賀龍濤,等.面向網(wǎng)絡環(huán)境的SQL注入行為檢測方法[J].通信學報,2016,37(2):88-97.(ZHAO Y F, XIONG G, HE L T, et al. Approach to detection SQL injection behaviors in network environment [J]. Journal on Communications, 2016, 37(2): 88-97.)
[6] PRIYAA B D, DEVI M I. Fragmented query parse tree based SQL injection detection system for Web applications [C]// Proceedings of the 2016 International Conference on Computing Technologies and Intelligent Data Engineering. Piscataway, NJ: IEEE, 2016: 1-5.
[7] 范春榮.基于Web日志的入侵檢測系統(tǒng)設計與實現(xiàn)[D].石家莊:河北科技大學,2011:4-36.(FAN C R. Design and implementation of the Web log-based intrusion detection system [D]. Shijiazhuang: Hebei University of Science and Technology, 2011: 4-36.)
[8] NGUYEN-TUONG A, GUARNIERI S, GREENE D, et al. Automatically hardening Web applications using precise tainting [C]// SEC 2005: IFIP International Information Security Conference on Security and Privacy in the Age of Ubiquitous Computing. Berlin: Springer, 2005: 295-307.
[9] 王溢,李舟軍,郭濤.防御代碼注入式攻擊的字面值污染方法[J].計算機研究與發(fā)展,2012,49(11):2414-2423.(WANG Y, LI Z J, GUO T. Literal tainting method for preventing code injection attack in Web application [J]. Journal of Computer Research and Development, 2012, 49(11): 2414-2423.)
[10] GOLEMON S. Extending and Embedding PHP [M]. Indianapolis, Indiana: SAMS Publishing, 2006: 269.
[11] WANG Y, WANG D, ZHAO W, et al. Detecting SQL vulnerability attack based on the dynamic and static analysis technology [C]// Proceedings of the 2015 IEEE Computer Software & Applications Conference. Piscataway, NJ: IEEE, 2015: 604-607.
[12] 陸開奎.基于動態(tài)污點分析的漏洞攻擊檢測技術研究與實現(xiàn)[D].成都:電子科技大學,2013:28-35.(LU K K. The research and realization of dynamic taint analysis based security attack detection technology [D]. Chengdu: University of Electronic Science and Technology of China, 2013: 28-35.)
[13] BREIMAN L. Random forest [J]. Machine Learning, 2001, 45(1): 5-32.
[14] The PHP Group. Zend Engine 2 opcode [EB/OL]. (2017- 05- 25)[2017- 08- 26]. http://php.net/manual/zh/internals2.opcodes.php.
[15] 吳江.SQL語言預編譯器的構架——基于Linux操作系統(tǒng)[D].北京:北京化工大學,2002:15-37.(WU J. The construction of complier for SQL-basing on Linux operating system [D]. Beijing: Beijing University of Chemical Technology, 2002: 15-37.)
[16] 張炘,廖頻,郭波.一種挖掘頻繁閉項集的深度優(yōu)先算法[J].計算機應用,2010,30(3):806-809.(ZHANG X, LIAO P, GUO B. Depth-first search algorithm for mining frequent closed itemsets [J]. Journal of Computer Applications, 2010, 30(3): 806-809.)
[17] LIN D. An information-theoretic definition of similarity [C]// ICML’98: Proceedings of the Fifteenth International Conference on Machine Learning. Madison: Morgan Kaufmann, 1998: 296-304.
[18] ABOU-ASSALEH T, CERCONE N, KEELJ V, et al. N-gram-based detection of new malicious code [C]// Proceedings of the 28th Annual International Computer Software & Applications Conference-Workshops & Fast Abstracts. Washington, DC: IEEE Computer Society, 2004, 2: 41-42.
[19] SWANHART J. greenlion/PHP-SQL-parser [EB/OL]. (2016- 08- 01)[2017- 06- 20]. https://github.com/greenlion/PHP-SQL-Parser.
[20] TRIET P T M. SQL-injection-payloads [EB/OL]. (2017- 08- 20)[2017- 08- 26]. https://github.com/trietptm/SQL-Injection-Payloads/blob/master/LINKS.md.
[21] 360. 360_safe3.php [EB/OL]. (2017- 05- 29) [2017- 08- 26]. https://github.com/luislv/easycms/blob/master/lib/plugins/filecheck/tool/360_safe3.php.
[22] safedog. safedog [EB/OL]. (2017- 04- 26)[2017- 08- 26]. http://www.safedog.cn/website_safedog.html.
ZHOUYing, born in 1993, M. S. candidate. Her research interests include Web security, network attack and defense.
FANGYong, born in 1966, Ph. D., professor. His research interests include information security, network information confrontation.
HUANGCheng, born in 1987, Ph. D. His research interests include information security, network attack and defense.
LIULiang, born in 1982, Ph. D., lecturer. His research interests include network system and information security.