專利名稱:一種sql注入漏洞檢測方法
技術領域:
本發明涉及一種針對SQL注入威脅的可以用于web防護及入侵檢測的檢測方法, 屬于網絡信息安全領域。
背景技術:
數據庫與TOB之間的關聯已經越來越密切,而web方便快捷,面向用戶群體廣泛的特點使B/S開發的熱度逐年增加,可以說web大大擴展了數據庫的用戶群,使其真正影響到了個人的生活方式。但是web在給數據庫帶來這些優點的同時也為數據庫帶來了許多安全隱患。其中危害最大,攻擊手段最多,最難防范的便是SQL注入(SQL Injection)攻擊。
在TOB應用常見的前臺語言,如ASP. NET,PHP或JSP中,一個典型的處理登錄的 SQL語句可以寫作 Query = "SELECT * FROM user WHERE user =,,+ ‘“$username,,,+ "AND pass =”+ " iSpassword'"; 通常我們通過獲取用戶提交的變量Susername、$password來處理該次登錄請求, 將其提交給數據庫并查看返回的Query值,從而決定本次登錄是否成功。這條查詢SQL語句在大多數情況下均能很好的工作。然而不幸的是,當攻擊者輸入一些精心構造的語句時,我們提交給數據庫的SQL語句的執行結果就會偏離編寫者的本意。如攻擊者輸入的 $username為admin,OR ‘1,= ‘1,一。此時整條查詢語句變成了 Query ="SELECT * FROM user WHERE user =,,+‘‘ ‘admin,0R‘1,= ‘1,一,,,+‘‘AND pass =,,+ “ iSpassword'“; 這條SQL語句由于存在了 OR ‘1’ = ‘1’這個恒真子查詢,所以不管攻擊者提交的用戶名密碼是否正確,攻擊者輸入得到的Query返回值總是真,也就是攻擊者通過這種SQL 注入攻擊行為,繞過了登錄檢測,從而可以以任何用戶名登錄系統。
SQL注入漏洞更為可怕的一點在于,他為攻擊者提供了一條可以隨意操作數據庫的最大權限的通道,從而可以隨意對WEB應用程序的后臺數據庫進行查詢,增加,修改,刪除等操作。
然而SQL注入漏洞在理論上存在于所有應用程序與數據庫交互之處,一個中等規模的應用即可能有上百處,且由于整條SQL語句是由用戶輸入與程序提供的原語句拼合而成,對于用戶可能的復雜輸入,分析防范非常困難。
通過分析,我們可以看到SQL注入具有危害大,漏洞存在離散,分析防御困難的特點。且漏洞覆蓋所有支持標準SQL的數據庫,SQL Server、MySql、Oracle、DB2、Sybase等數據庫均不能幸免。故而其被OWASP評定為2007-2010年最大網絡安全威脅。
SQL注入漏洞的危害是如此之大,從常理上講存在這一漏洞的網站應該非常少才對。不幸的是,通過使用Google對中國地區網站搜索關鍵字為“.asp ? ”,“.php ?”, “.jsp ?,,的網址鏈接,進而采用SQL注入掃描工具進行檢測,我們驚人的發現13%的asp 鏈接,8%的php鏈接以及3%的jsp鏈接存在著一種或多種類型的SQL注入漏洞,這也就意味著十分之一左右的網頁存在著潛在風險,瀏覽這樣的網頁很可能被植入的木馬攻擊。
目前,對SQL注入攻擊的防御方式主要有以下幾種 1.人工管理手工添加參數過濾語句,對用戶輸入進行嚴格過濾。主要不足在于復雜的應用程序需要處理大量的用戶輸入,手工檢測不僅極大地增加了程序員的負擔,也使程序變的難以維護。同時也因為SQL注入攻擊的多樣性使得該方法難以防御所有類型的 SQL注入攻擊。
2.關鍵詞過濾制定一個關鍵詞集合(主要為SQL語言的關鍵字及符號,如AND、 單引號),對于所有的用戶輸入均與該集合中的每一個關鍵詞匹配,如果用戶的輸入中存在關鍵字,則判定為非法輸入。主要不足在于,SQL語句是千變萬化的,一種語句的執行結果可以等價轉換為成其他多句語句執行結果,利用編碼和利用數據庫命令動態構造結構字符串都可繞過這類防范。且由于關鍵詞過濾,導致一些含關鍵詞的正常輸入(如YOU AND ME) 也被影響,這是關鍵詞過濾的最大弊病。
3. API及存儲過程編寫專用的API或者采用存儲過程的方式避免使用SQL語句的拼接,從而屏蔽SQL注入攻擊。主要不足在于,對于WEB應用所有與數據庫交互的地方均使用API或存儲過程成本高昂,開發不便。且所編寫的一套API在內部執行過程中依舊采用關鍵字過濾技術,換湯不換藥。一般只有企業級應用才采用,雖然付出許多額外代價可以做到比較安全,但是依舊不能從根本上完全防止SQL注入攻擊。
總體來看,因為其攻擊的隱蔽性與多樣性,同時有些關鍵字也常常為普通用戶使用,對SQL注入的檢測難點在于難以保證不漏報且不錯報。
發明內容
本發明的目的是針對SQL注入攻擊的檢測與防御,提出一種全新、高效的檢測模式與防御思路,從根本上阻斷SQL注入途徑,不漏報非法用戶的SQL注入行為同時不錯報合法用戶的正常行為。
SQL是一種結構化的查詢語言,對于固定的查詢他有著固定的語法結構,而在進行 SQL注入攻擊時,由于攻擊者必須改變SQL語句的語義,而語義的改變也必將影響到其提交查詢的語法樹形結構。于是,根據無害的標準輸入及可疑輸入所構成的語法樹形結構的比對結果,即可判斷用戶輸入是否含有惡意。本發明就是基于該思想實現的。
本發明提供了一種SQL注入漏洞檢測方法,包括以下步驟 一、用戶輸入數據截獲 (1)獲取用戶向應用程序提交的HTTP包; (2)將用戶提交的GET、POST數據按URL、COOKIE、表單分類,并按類型提取用戶數據包中提交的所有參數值; (3)將獲得的多組參數值按照URL編碼和其他HTTP包指定編碼方式解碼參數值; 二、無害化輸入生成 (1)將步驟一中得到的η組參數值記為Ql,Q2……Qn,同時生成等量的空白字串 Q,1,Q,2......Q,η ; (2)按照無害化規則將Qi字串轉化為無害字串拷貝至字串Q’i,Qi仍保留原內容 (i = 1,2,……η); (3)將η組用戶輸入的原始字串Qi與η組由用戶輸入生成的無害化字串Q’ i歸為η組待測試字串組Si (i = 1,2,3……η); 三、SQL語法樹生成 (1)預設SQL語句的注入點模板,將待測試字串組Si(i = 1,2,3,……η)按序同 SQL語句注入點模板組合,生成包含用戶輸入的SQL語句和包含無害字串的SQL語句,分別輸入SQL詞法分析器; (2)將詞法分析結果輸入SQL語法分析器; (3)將語法分析結果生成兩棵語法樹,分別是基于用戶輸入字串Qi的語法樹Ti以及基于無害化字串Q’ i的語法樹T’ i ; 四、SQL語法樹比對 (1)將兩棵語法樹Ti及T’ i通過孩子-兄弟表示法轉為等價的二叉樹形式BTi 及 BT,i ; (2)對BTi及BT’ i進行前序遍歷,得到前序序列Fi,F’ i,通過字符串比較算法對 Fi與F’ i進行比較,如發現不相同,則判定用戶在進行SQL注入,直接轉入步驟五; (3)對BTi和BT’i進行中序遍歷,得到中序序列Mi,M’i,通過字符串比較算法對 Mi與M’ i進行比較,如發現不相同,則判定用戶在進行SQL注入,直接轉入步驟五,否則認為該組測試字串通過本輪測試; (4)更換組合的SQL語句模板,如已經組合了全部模板,則認為該組測試字串通過本次檢測,否則轉到步驟三繼續測試; (5)將i值加1,如i <= η轉入步驟三繼續測試,否則轉入步驟五; 五、結果響應 (1)如果有任意一組測試發現了用戶有SQL注入的企圖,則阻止該HTTP包,并產生一個警告,按系統配置顯示在本地或遠程屏幕上,同時記錄進入日志文件; (2)如果所有測試均沒有發現用戶有SQL注入的企圖,則將該HTTP包放行。
有益效果 本發明分析對象均直接或間接來源于用戶輸入,這樣可以最大限度還原用戶本意,降低了誤報率。同時基于SQL語法樹分析,能夠從根本上阻斷進行SQL注入的可能,從而提高檢測的準確率。
圖1為本發明的五個主要步驟; 圖2為本發明主要步驟的流程圖; 圖3為用戶輸入為admin,OR ‘ 1,= ‘ 1,一時的SQL語法樹; 圖4為用戶輸入為admin,OR ‘1,= ‘1,--時的無害化輸入的SQL語法樹; 圖5為語法樹比對的流程圖; 圖6為用戶輸入為and’ AND時的SQL語法樹; 圖7為用戶輸入為and’ AND時的無害化輸入的SQL語法樹。
具體實施例方式下面結合附圖,具體說明本發明的優選實施方式。
本實施例具體實現了本發明所述的一種SQL注入漏洞檢測方法,包括以下步驟 一、用戶輸入數據截獲 在用戶輸入數據截獲步驟中,如何在完全獲取到用戶可能向應用程序提交參數的同時忽略與數據庫無關的數據,是進行后續檢測工作的關鍵。
在本實施例中,提供了兩種方法獲取輸入數據 1、標準的web應用總是要通過服務器來使其可以被訪問(或者該應用本身就是服務器),而最常見的流行的WEB服務器總是為我們提供一組接口來對用戶提交的數據進行再加工,即WEB服務器的核心組件,可以理解為WEB服務器的內核程序。
IIS/APACHE均提供這樣的接口,例如ISAPI以及Apache Module,本實施例正是使用WEB服務器提供的接口來獲取用戶向服務器提交的所有參數。
2、本實施例同時還采用了另一種方法,即對TOB應用進行語法分析和預編譯,在其調用與數據庫交互的API處插入一段“交流程序”,這段程序的任務是在將參數提交數據庫前先使用本實施例提供的檢測方法進行檢測,并根據檢測程序的檢測結果判斷是否該繼續向數據庫提交這段參數。本質上就是一段對被保護程序的hook程序。
以上兩種獲取用戶輸入參數的方法各有側重,通過服務器核心組件方式簡單高效適應性強,而通過Hook程序則準確、全面; 獲取用戶輸入的過程為 (1)通過數據過濾程序獲取用戶向應用程序提交的HTTP包; (2)將用戶提交的GET、POST數據按URL、COOKIE、表單分類,并按類型提取用戶數據包中提交的所有參數值; (3)將獲得的多組參數值按照URL編碼和其他HTTP包指定編碼方式解碼參數值; 二、無害化輸入生成 (1)將步驟一中得到的η組參數值記為Ql,Q2……Qn,同時生成等量的空白字串 Q,1,Q,2......Q,η ; (2)按照無害化規則將Qi字串轉化為無害字串拷貝至字串Q’i,Qi仍保留原內容 (i = 1,2,……η); 無害化轉換是計算機領域研究人員的一種常見技術手段,研究人員需要根據解決的問題制定無害化規則,然后進行轉換。由于SQL語言中并沒有全部由χ構成的關鍵字,故我們將輸入的字符替換成等長度的χ字串以達到還原用戶輸入并做無害化處理的目的。同理,用戶輸入的數字被替換為等長度的數字3。本實施例中采用的無害化規則為將數字轉為等長度的數字3,將字符信息轉為等長度的X,對空格予以保留。比如,對于輸入 admin’ OR ‘1’ = ‘ 1’ 一這樣一個輸入,替換后的無害輸入為χχχχχχ χχ χ3χχχ3χχχ0可以看到,由于字符及數字均被替換,該輸入已經變為無害輸入,但是又因為無害輸入是由用戶輸入轉換而來的,所以很好的還原了用戶本意,因此本發明可以更容易區分攻擊者與普通用戶。
(3)將η組用戶輸入的原始字串Qi與η組由用戶輸入生成的無害化字串Q’ i歸為η組待測試字串組Si (i = 1,2,3……η); 三、SQL語法樹生成 不同的SQL注入點采用的SQL注入手法是不同的,為了不漏掉任何一種情況,本實施方式預設了所有類型SQL語句的注入點模板,即對下表中關鍵字的合法SQL語句表示形式中,可以插入用戶輸入數據的位置都視為注入點,并按編號標記。
權利要求
1.一種SQL注入漏洞檢測方法,包括以下步驟一、用戶輸入數據截獲(1)獲取用戶向應用程序提交的HTTP包;(2)將用戶提交的GET、POST數據按URL、COOKIE、表單分類,并按類型提取用戶數據包中提交的所有參數值;(3)將獲得的多組參數值按照URL編碼和其他HTTP包指定編碼方式解碼參數值;二、無害化輸入生成(1)將步驟一中得到的η組參數值記為Q1,Q2……Qn,同時生成等量的空白字串Q’1, Q,2......Q,η ;(2)按照無害化規則將Qi字串轉化為無害字串拷貝至字串Q’i,Qi仍保留原內容(i =1,2, ......η);(3)將η組用戶輸入的原始字串Qi與η組由用戶輸入生成的無害化字串Q’i歸為η 組待測試字串組Si (i = 1,2,3……η);三、SQL語法樹生成(1)預設SQL語句的注入點模板,將待測試字串組Si(i = 1,2,3,……η)按序同SQL 語句注入點模板組合,生成包含用戶輸入的SQL語句和包含無害字串的SQL語句,分別輸入 SQL詞法分析器;(2)將詞法分析結果輸入SQL語法分析器;(3)將語法分析結果生成兩棵語法樹,分別是基于用戶輸入字串Qi的語法樹Ti以及基于無害化字串Q’i的語法樹T’i;四、SQL語法樹比對(1)將兩棵語法樹Ti及T’i通過孩子-兄弟表示法轉為等價的二叉樹形式BTi及 BT' i ;(2)對BTi及BT’i進行前序遍歷,得到前序序列Fi,F’ i,通過字符串比較算法對Fi 與F’ i進行比較,如發現不相同,則判定用戶在進行SQL注入,直接轉入步驟五;(3)對BTi和BT’i進行中序遍歷,得到中序序列Mi,Μ’ i,通過字符串比較算法對Mi 與M,i進行比較,如發現不相同,則判定用戶在進行SQL注入,直接轉入步驟五,否則認為該組測試字串通過本輪測試;(4)更換組合的SQL語句模板,如已經組合了全部模板,則認為該組測試字串通過本次檢測,否則轉到步驟三繼續測試;(5)將i值加1,如i<= η轉入步驟三繼續測試,否則轉入步驟五;五、結果響應(1)如果有任意一組測試發現了用戶有SQL注入的企圖,則阻止該HTTP包,并產生一個警告,按系統配置顯示在本地或遠程屏幕上,同時記錄進入日志文件;(2)如果所有測試均沒有發現用戶有SQL注入的企圖,則將該HTTP包放行。
2.根據權利要求1所述的一種SQL注入漏洞檢測方法,其特征在于,步驟二中所述的無害化規則為將數字轉為等長度的數字3,將字符信息轉為等長度的X,對空格予以保留。
3.根據權利要求1或2所述的一種SQL注入漏洞檢測方法,其特征在于,步驟三種 SQL語句的注入點模板為選擇涵蓋所有注入點類型的SQL語句,有SELECT CREATE DROPALTER INSERT UPDATE DELETE GRANT REVOKE這九種類型;對每種類型可能插入用戶輸入數據的地方進行標注,用戶輸入或者無害化輸入只需要填充到有同樣標注的地方即可構成相同類型的兩句完整的SQL語句。
4.根據權利要求1至3任一項所述的一種SQL注入漏洞檢測方法,其特征在于,步驟三中所述詞法分析器為以SQL99為標準建立的對標準SQL語句進行詞法分析的詞法分析器, 及語法分析器,語法分析器為以SQL99為標準建立的對標準SQL語句進行語法分析的語法分析器。
5.根據權利要求1至4任一項所述的一種SQL注入漏洞檢測方法,其特征在于,在語法樹中加入一種類型的語法節點ERRSTR,ERRSTR表示在語法分析中由用戶輸入部分引發了不能識別的關鍵字及未封閉的引號之后的一串字符串類型錯誤的節點,在進行語法樹比較時ERRSTR被當做空節點。
6.根據權利要求1至5任一項所述的一種SQL注入漏洞檢測方法,其特征在于,獲取用戶輸入數據的方法包括(1)通過WEB服務器提供的接口即WEB服務器的核心組件獲取用戶向服務器提交的所有參數;(2)對TOB應用進行語法分析和預編譯,在其調用與數據庫交互的API處插入一段“交流程序”,這段程序的任務是在將參數提交數據庫前先使用SQL注入漏洞檢測方法進行檢測,并根據檢測程序的檢測結果判斷是否該繼續向數據庫提交這段參數。
7.根據權利要求1至6任一項所述的一種SQL注入漏洞檢測方法,其特征在于,步驟四中字符串比較算法為改進KMP算法即改進的克努特——莫里斯——普拉特操作。
全文摘要
本發明涉及一種SQL注入漏洞檢測方法,包括以下步驟一、用戶輸入數據截獲;二、無害化輸入生成;三、進行SQL詞法分析和語法分析,生成SQL語法樹,分別是基于用戶輸入字串的語法樹以及基于無害化字串的語法樹;四、SQL語法樹比對,如果相同認為該組測試字串通過本輪測試;五、結果響應如果發現了用戶有SQL注入的企圖,則阻止該HTTP包,否則將該HTTP包放行。本發明分析對象均直接或間接來源于用戶輸入,這樣可以最大限度還原用戶本意,降低了誤報率。同時基于SQL語法樹分析,能夠從根本上阻斷進行SQL注入的可能,從而提高檢測的準確率。
文檔編號H04L29/06GK102185930SQ20111015350
公開日2011年9月14日 申請日期2011年6月9日 優先權日2011年6月9日
發明者金福生, 宋挺, 戴銀濤, 牛振東, 韓翔宇 申請人:北京理工大學