一種sql注入檢測方法及裝置制造方法【專利摘要】本發(fā)明提供一種sql注入檢測方法及裝置,屬于網(wǎng)絡(luò)安全【
技術(shù)領(lǐng)域:
】。所述方法包括:從http請求中提取http參數(shù);將提取到的每個http參數(shù)分別與預(yù)定義的各種動態(tài)sql模板組合成sql語句;分別對每個sql語句進行語法分析,若該sql語句不符合sql語法規(guī)則,則確定該http參數(shù)不會導(dǎo)致sql注入攻擊,若該sql語句符合sql語法規(guī)則,則輸出與該sql語句對應(yīng)的標記字符串;將所述標記字符串與具有sql注入攻擊特征的標記字符串集合進行匹配,若匹配成功,則確定該http請求為sql注入攻擊。根據(jù)本發(fā)明,能夠提高sql注入檢測的執(zhí)行效率,并降低sql注入檢測的誤報率。【專利說明】—種sql注入檢測方法及裝置【
技術(shù)領(lǐng)域:
】[0001]本發(fā)明涉及網(wǎng)絡(luò)安全【
技術(shù)領(lǐng)域:
】,特別涉及一種sql注入檢測方法及裝置?!?br>背景技術(shù):
】[0002]黑客在入侵網(wǎng)站的時候經(jīng)常會利用sql(structurequerylanguage,結(jié)構(gòu)化查詢語言)注入漏洞執(zhí)行各種非法數(shù)據(jù)庫操作,比如盜取敏感信息、獲取系統(tǒng)管理權(quán)限等。傳統(tǒng)WAF(WebApplicationFirewall,Web應(yīng)用防火墻)在過濾sql注入攻擊時通常采用正則表達式進行sql注入匹配,或者直接進行sql語法關(guān)鍵詞查找。[0003]采用正則表達式進行匹配或者直接進行sql語法關(guān)鍵詞查找時,往往需要匹配完整個用戶提交的數(shù)據(jù)后才能進行攔截,這樣會導(dǎo)致執(zhí)行效率比較低。[0004]另外,正則表達式由于不具備上下文分析能力,因此當(dāng)用戶通過post方式提交一篇包含sql關(guān)鍵字的文章時就可能進行誤報攔截,而這有可能只是普通用戶發(fā)表的一篇帶有“select”關(guān)鍵詞的技術(shù)文章而已。例如,對于如下的http請求,“http://fo0.com/?id=1+foo+union+select+a+from+b”,傳統(tǒng)WAF會攔截并認為是sql注入行為,而實際上該http請求并非一個sql注入攻擊。[0005]可見,現(xiàn)有的sql注入檢測方法不僅執(zhí)行效率比較差,而且容易引起各種誤報,把正常的http(hypertexttransferprotocol,超文本傳輸協(xié)議)訪問也攔截了?!?br/>發(fā)明內(nèi)容】[0006]有鑒于此,本發(fā)明的目的是提供一種sql注入檢測方法及裝置,用以提高sql注入檢測的執(zhí)行效率,并降低sql注`入檢測的誤報率。[0007]為實現(xiàn)上述目的,本發(fā)明提供技術(shù)方案如下:[0008]一種sql注入檢測方法,包括:[0009]從http請求中提取http參數(shù);[0010]將提取到的每個http參數(shù)分別與預(yù)定義的各種動態(tài)sql模板組合成sql語句;[0011]分別對每個sql語句進行語法分析,若該sql語句不符合sql語法規(guī)則,則確定該http參數(shù)不會導(dǎo)致sql注入攻擊,若該sql語句符合sql語法規(guī)則,則輸出與該sql語句對應(yīng)的標記字符串;[0012]將所述標記字符串與具有sql注入攻擊特征的標記字符串集合進行匹配,若匹配成功,則確定該http請求為sql注入攻擊。[0013]上述的sql注入檢測方法,其中,還包括:若所有標記字符串均匹配失敗,則確定該http請求不是sql注入攻擊。[0014]上述的sql注入檢測方法,其中,所述http參數(shù)包括:url參數(shù)、cookie數(shù)據(jù)和表單數(shù)據(jù)。[0015]上述的sql注入檢測方法,其中,所述將提取到的每個http參數(shù)分別與預(yù)定義的各種動態(tài)sql模板組合成sql語句,包括:[0016]將http參數(shù)作為變量值傳入到動態(tài)sql模塊的變量中,從而得到組合后的sql語句。[0017]上述的sql注入檢測方法,其中,所述將http參數(shù)作為變量值傳入到動態(tài)sql模塊的變量中,包括:[0018]將http參數(shù)分別以數(shù)字型變量值和字符型變量值傳入到動態(tài)sql模塊的變量中。[0019]一種sql注入檢測裝置,包括:[0020]http參數(shù)提取單元,用于從http請求中提取http參數(shù);[0021]sql語句組合單元,用于將提取到的每個http參數(shù)分別與預(yù)定義的各種動態(tài)sql模板組合成sql語句;[0022]sql語法分析單元,用于分別對每個sql語句進行語法分析,若該sql語句不符合sql語法規(guī)則,則確定該http參數(shù)不會導(dǎo)致sql注入攻擊,若該sql語句符合sql語法規(guī)貝U,則輸出與該sql語句對應(yīng)的標記字符串;[0023]標記字符串匹配單元,用于將所述標記字符串與具有sql注入攻擊特征的標記字符串集合進行匹配,若匹配成功,則確定該http請求為sql注入攻擊。[0024]上述的sql注入檢測裝置,其中,所述標記字符串匹配單元進一步用于:若所有標記字符串均匹配失敗,則確定該http請求不是sql注入攻擊。[0025]上述的sql注入檢測裝置,其中,所述http參數(shù)包括:url參數(shù)、cookie數(shù)據(jù)和表單數(shù)據(jù)。[0026]上述的sql注入檢測裝置,其中,所述sql語句組合單元進一步用于:將http參數(shù)作為變量值傳入到動態(tài)sql模塊的變量中,從而得到組合后的sql語句。[0027]上述述的sql注入檢測裝置,其中,所述sql語句組合單元進一步用于:將http參數(shù)分別以數(shù)字型變量值和字符型變量值傳入到動態(tài)sql模塊的變量中,得到對應(yīng)的sql語句。[0028]與現(xiàn)有技術(shù)相比,本發(fā)明的有益效果如下:[0029]本發(fā)明通過對從http請求中提取出來的http參數(shù)進行sql語句模擬和sql語法分析,如果發(fā)現(xiàn)所有http參數(shù)對應(yīng)的sql語句都不符合sql語法,就可以確定該http請求并非sql注入攻擊,于是可以停止檢測,從而執(zhí)行效率更高;對于符合sql語法的sql語句,則進一步獲取sql語法分析輸出的標記字符串,通過將該標記字符串與具有sql注入攻擊特征的標記字符串集合進行匹配,來確定該http請求是否為sql注入攻擊,從而能夠降低sql注入檢測的誤報率?!緦@綀D】【附圖說明】[0030]圖1是根據(jù)本發(fā)明一個實施例的sql注入檢測方法流程圖;[0031]圖2是根據(jù)本發(fā)明一個實施例的sql注入檢測裝置結(jié)構(gòu)圖?!揪唧w實施方式】[0032]以下結(jié)合附圖對本發(fā)明實施例進行詳細描述。[0033]現(xiàn)有技術(shù)通過采用正則表達式進行匹配或者直接進行sql語法關(guān)鍵詞查找來檢測sql注入攻擊時,由于沒有sql語句模擬和sql語法分析功能,往往需要匹配完整個用戶提交的數(shù)據(jù)后才能進行攔截,這樣會導(dǎo)致執(zhí)行效率比較差;另外,由于正則表達式不具備上下文分析能力,可能會將正常的http請求檢測為sql注入攻擊,存在較高的誤報率。[0034]為解決現(xiàn)有技術(shù)中存在的上述問題,本發(fā)明實施例提供一種sql注入檢測方法和裝置,通過對從http請求中提取出來的http參數(shù)進行sql語句模擬和sql語法分析,如果發(fā)現(xiàn)所有http參數(shù)對應(yīng)的sql語句都不符合sql語法,就可以確定該http請求并非sql注入攻擊,于是可以停止檢測,從而執(zhí)行效率更高;對于符合sql語法的sql語句,則進一步獲取sql語法分析輸出的標記字符串,通過將該標記字符串與具有sql注入攻擊特征的標記字符串集合進行匹配,來確定該http請求是否為sql注入攻擊,從而能夠降低sql注入檢測的誤報率。[0035]圖1是根據(jù)本發(fā)明一個實施例的sql注入檢測方法流程圖。參照圖1,所述sql注入檢測方法可以包括:[0036]步驟101,從http請求中提取http參數(shù);[0037]Web應(yīng)用程序中,url參數(shù)、cookie數(shù)據(jù)和表單數(shù)據(jù)這三個數(shù)據(jù)源包含了web用戶提交的輸入數(shù)據(jù),是可能引入sql注入漏洞的位置。在本發(fā)明實施例中,從http請求中提取http參數(shù)是指從http請求中提取用戶輸入數(shù)據(jù),即前述的url參數(shù)、cookie數(shù)據(jù)和表單數(shù)據(jù)。[0038]根據(jù)http協(xié)議規(guī)范,url參數(shù)位于url字符串的尾部,并由“?”字符分割開,后面為多個由“&”字符分割開的形式為NAME=VALUE的{NAME,VALUE}序列;C00KIE數(shù)據(jù)和表單數(shù)據(jù)均為多個由“;”字符分割開的形式為NAME=VALUE的{NAME,VALUE}序列;各種HTTP參數(shù)有可能按照HTTP編碼方法進行了編碼,因此,在本發(fā)明實施例中,還對HTTP參數(shù)按照HTTP解碼方法進行解碼,也就是說,后續(xù)步驟中的http參數(shù)是指解碼后的http參數(shù)。[0039]例如,對于“GET/?id=I+and+1=l&class=2qHTTP/1.1”,提取到的URL參數(shù)為“id=1+and+l=I”以及“class=2q”,對這兩個參數(shù)進行解碼(“+”被解碼為空格)后按照json格式輸出為:[{"id":"Iandl=I","class":"2q"},];類似地,對于“Cookie:a=l’;b=2p”,提取到的COOKIE數(shù)據(jù)為[{"a":"I'","b":"2p"},]。[0040]步驟102,將提取到的每個http參數(shù)分別與預(yù)定義的各種動態(tài)sql模板組合成sql語句;[0041]根據(jù)步驟101,提取到了多個http參數(shù),在本步驟中,分別對每個http參數(shù)進行處理。[0042]具體地,對于每個http參數(shù),將其作為變量值傳入到動態(tài)sql模板的變量中,從而得到組合后的sql語句。其中,可以將http參數(shù)分別以數(shù)字型變量值和字符型變量值傳入到動態(tài)sql模板的變量中。也就是說,每個http參數(shù)與一個動態(tài)sql模塊會組合得到兩個sql語句,這樣,如果有N個動態(tài)sql模板,則會組合得到2*N個sql語句。如果有M個http參數(shù),則總共會組合得到2*M*N個sql語句。[0043]在一般的web數(shù)據(jù)庫程序開發(fā)中,可能使用的動態(tài)SQL模板包括SELECT、INSERT、DELETE、UPDATE和子查詢等。在本發(fā)明實施例中,所述預(yù)定義的各種動態(tài)sql模板可以為web數(shù)據(jù)庫程序開發(fā)中用到的所有動態(tài)SQL模板`。[0044]步驟103,分別對每個sql語句進行語法分析,若該sql語句不符合sql語法規(guī)則,則確定該http參數(shù)不會導(dǎo)致sql注入攻擊,若該sql語句符合sql語法規(guī)則,則輸出與該sql語句對應(yīng)的標記字符串;[0045]根據(jù)步驟101,組合得到了多個sql語句,在本步驟中,分別對每個sql語句進行sql語法分析。如果某個sql語句不符合sql語法規(guī)則,則可以確定與該sql語句對應(yīng)的http參數(shù)不會導(dǎo)致sql注入攻擊,于是,就不需要進一步對該sql語句執(zhí)行后續(xù)輸出標記字符串以及匹配的過程。如果所有的sql語句都不符合sql語法規(guī)則,則可以確定該http請求不是sql注入攻擊,并結(jié)束本流程(不執(zhí)行步驟104)。[0046]在本步驟中,可以采用SQL語法分析器對sql語句進行語法分析,現(xiàn)有技術(shù)中有各種各樣的SQL語法分析器,本領(lǐng)域技術(shù)人員可以根據(jù)需要從中選擇一種語法分析器來實施本發(fā)明,例如,可以選擇BISON語法分析工具(一種流行的開源語法分析器生成工具)。[0047]進行語法分析后,若該sql語句符合sql語法規(guī)則,則輸出與該sql語句對應(yīng)的標記字符串。在各種語法分析工具中,定義有sql關(guān)鍵詞與標記(token)的對應(yīng)關(guān)系,例如,所述對應(yīng)關(guān)系如下:[0048]S=selectC=columnF=fromT=tableW=whereE=equaln=number&=ands=string[0049]根據(jù)上述對應(yīng)關(guān)系,并可以將sql語句轉(zhuǎn)換為標記字符串(token字符串)。例如,對于如下的sql語句($a為變量a的值,單引號表示字符型):[0050]selectxfromxwhereid='$a[0051]轉(zhuǎn)換得到的token字符串為:SCFTWCEs。[0052]步驟104,將所述標記字符串與具有sql注入攻擊特征的標記字符串集合進行匹配,若匹配成功,則確定該http請求為sql注入攻擊,若所有標記字符串均匹配失敗,則確定該http請求不是sql注入攻擊。[0053]可以預(yù)先收集導(dǎo)致sql注入攻擊的sql語句集合,將這些sql語句分別轉(zhuǎn)換為標記字符串,得到具有sql注入攻擊特征的標記字符串集合。將某個sql語句對應(yīng)的標記字符串與具有sql注入攻擊特征的標記字符串集合進行匹配,當(dāng)匹配到一個sql語句時,表示匹配成功,則確定該http請求為sql注入攻擊,可以繼續(xù)進行其他標記字符串的匹配,也可以不繼續(xù)進行其他標記字符串的匹配,從而結(jié)束本流程;當(dāng)匹配不到sql語句時,表示匹配失敗。當(dāng)所有標記字符串均匹配失敗時,則可以確定該http請求不是sql注入攻擊。[0054]根據(jù)本發(fā)明實施例的技術(shù)方案,若該sql語句不符合sql語法規(guī)則,則確定該http參數(shù)不會導(dǎo)致sql注入攻擊,當(dāng)確定所有參數(shù)都不會導(dǎo)致sql注入攻擊時,就可以不必執(zhí)行后續(xù)的匹配過程,從而提高了執(zhí)行效率,并降低了誤報率。[0055]例如,對于http請求http://fo0.com/?id=1+foo+union+select+a+from+b,傳統(tǒng)waf會攔截并認為是sql注入行為。使用本發(fā)明實施例的技術(shù)方案時,提取到的http數(shù)據(jù)為Ifoounionselectafromb,經(jīng)過組合后變?yōu)閟electafrombwhereId=Ifoounionselectafromb,因為語法結(jié)構(gòu)錯誤,則判斷為非sql注入行為。[0056]上述sql注入檢測方法可以在web代理網(wǎng)關(guān)上執(zhí)行,也可以直接在web服務(wù)器上執(zhí)行,當(dāng)檢測到sql注入攻擊時,直接丟棄該http請求,并進行報警或者向用戶進行提示。[0057]對應(yīng)于上述sql注入檢測方法,本發(fā)明實施例還提供一種sql注入檢測裝置,該裝置可以設(shè)置在web代理網(wǎng)關(guān)中,也可以設(shè)置在web服務(wù)器中。[0058]圖2是根據(jù)本發(fā)明一個實施例的sql注入檢測裝置結(jié)構(gòu)圖。參照圖2,所述裝置可以包括http參數(shù)提取單元10、sql語句組合單元20、sql語法分析單元30和標記字符串匹配單元40。[0059]http參數(shù)提取單元10用于從http請求中提取http參數(shù),所述http參數(shù)包括:urI參數(shù)、cookie數(shù)據(jù)和表單數(shù)據(jù)。[0060]sql語句組合單元20用于將提取到的每個http參數(shù)分別與預(yù)定義的各種動態(tài)sql模板組合成sql語句。其中,可以http參數(shù)作為變量值傳入到動態(tài)sql模塊的變量中,從而得到組合后的sql語句,并且,可以將http參數(shù)分別以數(shù)字型變量值和字符型變量值傳入到動態(tài)sql模塊的變量中,得到對應(yīng)的sql語句。[0061]sql語法分析單元30用于分別對每個sql語句進行語法分析,若該sql語句不符合sql語法規(guī)則,則確定該http參數(shù)不會導(dǎo)致sql注入攻擊,若該sql語句符合sql語法規(guī)則,貝1J輸出與該sql語句對應(yīng)的標記字符串。[0062]標記字符串匹配單元40用于將所述標記字符串與具有sql注入攻擊特征的標記字符串集合進行匹配,若匹配成功,則確定該http請求為sql注入攻擊,若所有標記字符串均匹配失敗,則確定該http請求不是sql注入攻擊。[0063]以下給出本發(fā)明的一個應(yīng)用實例:[0064]假設(shè)獲取到的http請求如下:[0065]GET/?id=I+and+1=l&class=2qHTTP/11[0066]Accept:text/html,application/xhtml+xml,氺/氺[0067]Accept-Language:zh_CN[0068]User-Agent:Mozilla/`50(compatible;MSIE90;ffindowsNT61;Trident/5.0)[0069]Connection:close[0070]Host:Wffffanquanbaocom[0071]Cookie:a=I,;b=2p[0072]Pragma:no_cache[0073]從該http請求中提取url參數(shù)和Cookie數(shù)據(jù),進行http解碼后生成json結(jié)構(gòu)如下:[0074]"querystring":[{"id":"landl=I","class":"2q"},]//url參數(shù)[0075]"cookie":[{"a":"I'","b":"2p"},]//cookie數(shù)據(jù)[0076]將各種http參數(shù)與預(yù)定義的sql組合成完整的sql語句,如下:[0077]selectxfromxwhereid=$id[0078]selectxfromxwhereid=$class[0079]selectxfromxwhereid=$a[0080]selectxfromxwhereid=$b[0081]selectxfromxwhereid='$id[0082]selectxfromxwhereid='$class[0083]selectxfromxwhereid='$a[0084]selectxfromxwhereid='$b[0085]對于每個sql語句,利用sql語法分析引擎生成對應(yīng)的token字符串。[0086]S=selectC=colummF=ffomT=tableW=whereE=equaln=number&=ands=strmg[0087]上述8個sql語句對應(yīng)如下三種token字符串:[0088]SCFTWCEn&nEn[0089]SCFTffCEn[0090]SCFTffCEs[0091]進行token字符串匹配時,上述的SCFTWCEn&nEn等于內(nèi)置具有sql注入攻擊特征的標記字符串:SCFTWCEn&nEn,判斷該http請求為攻擊請求。[0092]需要說明的是,在附圖的流程圖示出的步驟可以在諸如設(shè)置有一組計算機可執(zhí)行指令的計算機系統(tǒng)中執(zhí)行,并且,雖然在流程圖中示出了邏輯順序,但是在某些情況下,可以以不同于此處的順序執(zhí)行所示出或描述的步驟。另外,本領(lǐng)域的技術(shù)人員應(yīng)該明白,上述的本發(fā)明的各模塊或各步驟可以用通用的計算裝置來實現(xiàn),它們可以集中在單個的計算裝置上,或者分布在多個計算裝置所組成的網(wǎng)絡(luò)上,可選地,它們可以用計算裝置可執(zhí)行的程序代碼來實現(xiàn),從而,可以將它們存儲在存儲裝置中由計算裝置來執(zhí)行,或者將它們分別制作成各個集成電路模塊,或者將它們中的多個模塊或步驟制作成單個集成電路模塊來實現(xiàn)。這樣,本發(fā)明不限制于任何特定的硬件和軟件結(jié)合。[0093]以上所述僅為本發(fā)明的較佳實施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所做的任何修改、等同替換、改進等,均應(yīng)包含在本發(fā)明保護的范圍之內(nèi)?!緳?quán)利要求】1.一種sql注入檢測方法,其特征在于,包括:從http請求中提取http參數(shù);將提取到的每個http參數(shù)分別與預(yù)定義的各種動態(tài)sql模板組合成sql語句;分別對每個sql語句進行語法分析,若該sql語句不符合sql語法規(guī)則,則確定該http參數(shù)不會導(dǎo)致sql注入攻擊,若該sql語句符合sql語法規(guī)則,則輸出與該sql語句對應(yīng)的標記字符串;將所述標記字符串與具有sql注入攻擊特征的標記字符串集合進行匹配,若匹配成功,則確定該http請求為sql注入攻擊。2.如權(quán)利要求1所述的sql注入檢測方法,其特征在于,還包括:若所有標記字符串均匹配失敗,則確定該http請求不是sql注入攻擊。3.如權(quán)利要求1或2所述的sql注入檢測方法,其特征在于,所述http參數(shù)包括:url參數(shù)、cookie數(shù)據(jù)和表單數(shù)據(jù)。4.如權(quán)利要求3所述的sql注入檢測方法,其特征在于,所述將提取到的每個http參數(shù)分別與預(yù)定義的各種動態(tài)sql模板組合成sql語句,包括:將http參數(shù)作為變量值傳入到動態(tài)sql模塊的變量中,從而得到組合后的sql語句。5.如權(quán)利要求4所述的sql注入檢測方法,其特征在于,所述將http參數(shù)作為變量值傳入到動態(tài)sql模塊的變量中,包括:將http參數(shù)分別以數(shù)字型變量值和字符型變量值傳入到動態(tài)sql模塊的變量中。6.一種sql注入檢測裝置,其特征在于,包括:http參數(shù)提取單元,用于從http請求中提取http參數(shù);sql語句組合單元,用于將提取到的每個http參數(shù)分別與預(yù)定義的各種動態(tài)sql模板組合成sql語句;sql語法分析單元,用于分別對每個sql語句進行語法分析,若該sql語句不符合sql語法規(guī)則,則確定該http參數(shù)不會導(dǎo)致sql注入攻擊,若該sql語句符合sql語法規(guī)則,則輸出與該sql語句對應(yīng)的標記字符串;標記字符串匹配單元,用于將所述標記字符串與具有sql注入攻擊特征的標記字符串集合進行匹配,若匹配成功,則確定該http請求為sql注入攻擊。7.如權(quán)利要求6所述的sql注入檢測裝置,其特征在于,所述標記字符串匹配單元進一步用于:若所有標記字符串均匹配失敗,則確定該http請求不是sql注入攻擊。8.如權(quán)利要求6或7所述的sql注入檢測裝置,其特征在于,所述http參數(shù)包括:url參數(shù)、cookie數(shù)據(jù)和表單數(shù)據(jù)。9.如權(quán)利要求8所述的sql注入檢測裝置,其特征在于,所述sql語句組合單元進一步用于:將http參數(shù)作為變量值傳入到動態(tài)sql模塊的變量中,從而得到組合后的sql語句。10.如權(quán)利要求9所述的sql注入檢測裝置,其特征在于,所述sql語句組合單元進一步用于:將http參數(shù)分別以數(shù)字型變量值和字符型變量值傳入到動態(tài)sql模塊的變量中,得到對應(yīng)的sql語句?!疚臋n編號】G06F17/27GK103559444SQ201310541430【公開日】2014年2月5日申請日期:2013年11月5日優(yōu)先權(quán)日:2013年11月5日【發(fā)明者】石祖文申請人:星云融創(chuàng)(北京)信息技術(shù)有限公司