基於意圖的SQLIA防禦方法與流程
2023-05-21 18:35:16 1
技術領域
本發明涉及一種攻擊Java EE程序的防禦方法,尤其涉及一種基於意圖的針對SQLIA攻擊的防禦方案,屬於WEB應用和計算機安全領域。
背景技術:
Java EE平臺是三大WEB程序開發平臺之一,針對該平臺程序的攻擊層出不窮。Cenzic歷年的應用程式漏洞趨勢報告(Application Vulnerability Trends)顯示絕大部分WEB程序存在漏洞,而針對注入漏洞的SQL注入攻擊(SQL Injection Attack,SQLIA)是對WEB程序最有威脅的攻擊之一。SQLIA指攻擊者利用WEB程序未對輸入數據進行有效檢查的漏洞,構造符合SQL語法但違背程序語義的惡意SQL語句,從而執行未經授權的資料庫操作。
現有靜態防禦技術主要有兩種:一是利用字符串分析技術直接獲取執行資料庫操作時可能的SQL操作集合,如果該集合與現有攻擊模式不存在交集則可認為WEB程序不存在SQLIA;二是應用汙點分析技術跟蹤WEB輸入,如果存在執行路徑使得該輸入未經檢查並傳播到SQL操作語句,則報警可能有SQLIA。但是字符串分析存在精確度較低的問題,而汙點分析則存在虛警過多問題。
現有動態防禦技術包括:1)動態汙點分析。運行時跟蹤WEB輸入(汙點),如果汙點隨著程序執行傳播到SQL操作語句則實時報警;2)對比分析。主要以兩次不同輸入執行相同程序路徑,比較生成的SQL字符串的語法結構,如果結構存在差異表明該程序存在SQLIA;3)基於文法的分析。利用字符串分析技術生成上下文無關文法(CFG)形式表示的SQL字符串集合,將輸入標記為CFG的終結符,在程序執行後檢查生成的SQL字符串是否滿足該CFG,如果不滿足則存在SQLIA。
現有防禦技術都從SQL字符串的語法分析的角度來判定是否存在SQLIA,無法理解WEB程序設計者的資料庫操作意圖。本發明提出一種基於意圖的SQLIA防禦方法,設計了一種描述SQL操作意圖的語言SQLIDL(SQL Intent Definition Language),用於描述WEB程序設計者允許用戶執行的SQL操作集合,並設計解釋程序將SQLIDL程序轉換為確定有限自動機(DFA)表示的SQL操作意圖集合。為了降低運行時開銷,本發明預先應用靜態字符串分析提取程序中每個SQL操作的所有可能取值,並生成由DFA表示的字符串值集合的上界,如果一個SQL操作的值集是預定義的SQL操作意圖集合的子集,則運行時不需要動態檢測該操作,否則需要對提交該SQL操作的方法調用語句進行插樁,即對SQL操作字符串進行標記,運行時提示檢測模塊對其進行檢測。本發明在WEB程序執行時,攔截所有提交給資料庫的SQL操作,僅檢測帶標記的SQL字符串,檢測其是否屬於預定義的操作意圖集合,如不是則報警發現SQLIA攻擊。
技術實現要素:
本發明的目的是針對現有技術不足,提出一種基於意圖的SQLIA防禦方法,以提高Java EE程序抵禦外部SQLIA攻擊的能力,為達到此目的,本發明採用以下技術方案。
本發明的方法總體架構分為三部分:一是SQL操作意圖的表示和解析,包括SQL意圖描述語言SQLIDL的文法設計和SQLIDL的意圖生成;二是SQL字符串的靜態分析和插樁,包括SQL字符串的提取、SQL字符串與SQL操作意圖的交集判定、可疑SQL字符串的插樁和標記;三是SQL操作的攔截與檢測,包括攔截和檢測;
1)SQL操作意圖的表示和解析
1.1)本發明所述SQL操作意圖描述語言SQLIDL的語法設計描述WEB程序的SQL操作集合和操作對象集合,操作對象包括值對象、列對象、表對象和方法名對象;一個SQLIDL程序包括變量聲明語句、變量賦值語句和SQL操作語句,變量分為表變量、列變量、值變量和方法名變量;變量賦值語句將聲明的變量賦予常量字符串值或正則表達式表示的字符串值,用於表示WEB程序允許操作哪些表或列,可以根據表名、列名和列值來表示程序的操作意圖;表變量表示允許操作的表名,列變量表示允許操作的列名,值變量表示允許讀取、修改、添加或刪除的列值,方法名變量表示允許調用哪些內置過程和存貯過程;SQL操作語句由關鍵字、變量和常量構成,SQLIDL的關鍵字與標準SQL語言的關鍵字相同,用於表示允許的SQL操作和查詢條件等,變量必須預先聲明和賦值,常量包括字符串和數字;
1.2)本發明的SQLIDL意圖生成用於解釋SQLIDL程序,把用戶編寫的SQLIDL程序解釋為確定有限自動機(DFA)表示的SQL操作意圖字符串集合;首先通過自頂向下的語法分析方法,將SQLIDL的每一條SQL操作語句轉換為由關鍵字、SQL操作符號、常量串和變量組成的符號序列,然後將序列中的變量替換為變量賦值語句中對相應變量的賦值,該值為常量或正則表達式表示的值集合,即每條SQL操作語句被解釋為由常量串和正則表達式組成的符號序列;然後使用自動機的基本操作實現DFA的構建,使用的基本操作包括創建新的自動機,即設置開始狀態為接受狀態,聯結自動機操作,即在一個自動機的接受狀態之前增加一個狀態,聯合自動機操作,即將原自動機的開始狀態作為目標自動機的開始狀態,原自動機的結束狀態作為目標自動機的結束狀態,使用上述操作將所有的符號序列轉換為確定的字符串有限自動機;
2)SQL字符串的靜態分析和插樁
2.1)本發明的SQL字符串提取首先根據預先配置的方法模板提取程序中所有相應SQL操作的方法調用語句並生成待分析語句集合,模板中指明方法的返回值類型、參數數量、參數類型、方法名以及方法調用類型;然後對每條語句提交的SQL字符串應用靜態字符串分析,近似估計該串在程序中不同位置的取值,並生成一個用正則文法表示的字符串集合包含該串在程序中的所有可能取值;
2.2)本發明的SQL字符串與SQL意圖的交集判定應用自動機的交集計算方法;令正則文法表示的字符串集合為語言LN,預定義的DFA表示的SQL操作集合對應的語言為LM,如果LM的補集與LN不相交,即該SQL字符串的所有取值都屬於預定義的操作意圖集合,則該字符串不需要在運行時進行檢測;否則它是需要檢測的可疑SQL字符串;
2.3)本發明的可疑SQL字符串的插樁和標記對可疑SQL字符串變量所在方法調用語句進行插樁,對可能提交給資料庫的SQL字符串變量加上標記;本發明的插樁過程在Jimple中間代碼上完成,無需修改程序邏輯和原始碼,僅對可疑變量的字符串的頭部增加一個」—BADSQL--」標記,用於檢測模塊識別可疑SQL字符串;
3) SQL操作的攔截與檢測
3.1)本發明的攔截模塊是一個基於JDBC驅動的代理,可以跟蹤任何使用JDBC的程序產生的SQL操作,並進行攔截和轉發,在WEB程序部署時必須將資料庫連接配置文件中的驅動程序改為本發明的攔截模塊;
3.2)本發明的檢測模塊首先分析攔截到的SQL字符串是否包含」—BADSQL—「標記,對於不包含標記的字符串,直接轉發並提交資料庫;否則,在去除SQL字符串中的標記後,應用自動機判定方法檢測該字符串是否屬於預定義意圖對應的語言L(M),如是則轉發並提交資料庫,否則不轉發並報警發現SQLIA攻擊;
本發明的有益效果是設計一種基於意圖的SQLIA防禦方法,發明了一種SQL操作意圖描述語言SQLIDL,將程序允許的SQL操作意圖解釋為DFA表示的SQL操作字符串集合,並結合字符串分析技術和自動機的交集判定方法提取可疑的SQL字符串進行插樁和標記,避免運行時檢測所有SQL操作,在運行時動態截取提交資料庫的所有SQL操作,對於有標記的SQL操作字符串,應用自動機判定方法檢測其是否屬於DFA表示的預定義意圖的SQL操作字符串集合,若不屬於則違背預定義意圖,即為SQLIA攻擊。
本發明的設計方案可以實時防禦針對Java EE程序的SQLIA攻擊。
附圖說明
圖1為本發明的實施方案的總體結構和處理流程;
圖2為實施方案中目前設計實現的SQLIDL語言的具體文法;
圖3為Java EE程序示例片段1,判定輸入的用戶名和密碼是否與資料庫中的數據匹配,用於舉例說明SQLIDL如何表示SQL操作意圖;
圖4為Java EE程序示例片段2,該片段相比圖3更為複雜一些,用於說明SQLIDL可以表示較為複雜的SQL操作意圖;
圖5為SQLIDL程序,表示圖3和圖4程序的SQL操作意圖;
圖6為表示圖3和圖4程序SQL操作意圖的確定有限自動機DFA,由解釋器對圖5的SQLIDL程序解析生成;
圖7為對應圖3程序的Jimple代碼;
圖8為對圖7的Jimple代碼插樁後的Jimple代碼;
圖9為SQLIA攻擊發生時的效果截圖。
具體實施方式
本發明的設計方案的實施需要完成以下幾項工作,一是根據SQLIDL語言的文法開發相應解釋器程序,二是設計SQL方法模板並實現靜態字符串分析,三是基於Jimple代碼實現對可疑字符串變量的插樁,四是基於已有JDBC代理程序實現攔截和檢測,五是基於已有自動機算法庫實現自動機的交集判定。
圖1給出本發明的實施方案的總體結構和處理流程。
首先,基於Java語言開發SQLIDL解釋器程序,負責將表示SQL操作意圖的SQLIDL程序解釋為DFA表示的意圖集合。圖2給出當前SQLIDL語言的具體文法,支持插入、刪除、查詢和修改數據操作,表變量、列變量、值變量和方法名變量可以使用標準的正則表達式表示。圖3和圖4給出了兩個Java EE程序片段,圖5的SQLIDL程序表示這兩個程序片段的SQL操作意圖,圖6的自動機表示由圖5的SQLIDL程序解釋生成。
其次需要對具體的WEB應用編寫SQLIDL程序,表示SQL操作意圖集合。針對圖3和圖4程序片段,圖5的SQLIDL程序使用值變量v1表示應用程式的userid變量,並使用正則式「[0-9]+」指明userid必須是數字串,值變量v2表示程序中的password變量,並使用正則式」/^[A-Za-z0-9\_]{6,22}$/」表示password為長度6-22個字符的串,且只能是字母和數字以及下劃線,對表變量t1的賦值指明圖3程序只對表employee操作。圖3程序的第3行SQL語句在運行時,如果用戶輸入的userid或password不符合SQLIDL程序中給出的正則式,則會報警。
靜態SQL操作抽取需要預先配置方法模板,對於圖3和圖4程序,可設置模板的方法名為executeQuery,參數個數為1,第1個參數即為SQL字符串。靜態分析模塊需要識別出圖3和圖4的第3行語句為有關方法,圖1將這兩條方法調用語句稱為熱點。基於開源Java字符串分析庫Java String Analysis,對語句中的實參query進行靜態字符串分析,使用正則表達式近似估計兩個query變量在程序中的所有可能取值。基於開源自動機算法庫dk.brics.automaton,判定query變量的所有可能取值是否都能用圖6自動機表示的語言描述,如果不是則將query變量所在語句加入待插樁方法集。
可疑SQL字符串插樁模塊基於開源Java編譯框架SOOT實現,首先把WEB應用的字節碼轉化為Jimple代碼,圖7給出對應圖3程序的Jimple代碼,Label10為變量賦值部分包括變量的申明和實例化,Label11為方法調用部分。然後,對待插樁方法集的所有方法調用語句中的SQL字符串變量進行插樁,添加」—BADSQL--」標記,實現方案基於SOOT框架的PackManager.v.getPack("jtp").add(...)接口實現插樁,利用字符串相加的方法生成插樁代碼塊,圖8給出對圖7的Jimple代碼插樁後的Jimple代碼,其中省去了與插樁無關的操作,第2-3行是變量聲明和實例化,第4-7行為針對圖7代碼的插樁結果,即在query變量的頭部添加了」—BADSQL--」,圖8的第7行對應圖7的第6行。對插樁後的Jimple代碼重新編譯即可生成插樁後的WEB應用。
攔截和檢測模塊基於已有的JDBC代理程序實現,方法的當前實現基於開源JDBC驅動Ps6spy,增加字符串標記檢測和刪除功能,並調用開源自動機方法庫dk.brics.automaton,判定可疑字符串是否屬於DFA表示的SQL操作意圖集合,如是則提交資料庫,否則報警。
本發明的實施最終以Java的JAR包方式實現,包括兩個組件。一是根據用戶編寫的SQLIDL程序和預先配置的方法模板,對WEB應用進行靜態分析,生成待插樁方法集合。二是對所有待插樁方法的可疑SQL字符串變量進行插樁,並編譯生成插樁後的新應用,新的應用與原有應用在功能上完全一致。但是在發生SQLIA攻擊時,該SQL字符串會被攔截並顯示在控制臺,圖9給出了方案實施時的效果圖。