袁梁
(無錫城市職業技術學院,江蘇 無錫 214153)
SQL注入攻擊漏洞是Web應用程序最嚴重的安全風險之一,通常攻擊者利用服務器變量、Cookie注冊表、二階注入等攻擊方式,在用網絡戶向Web應用程序提交輸入信息時發起攻擊,修改一階SQL注入的結構化查詢語句,或者將二階SQL注入信息存儲至數據庫中,但不立即執行,直到下一個調用該數據的SQL語句執行時發起攻擊。針對此問題,本文利用模糊測試的SQL注入漏洞攻擊檢測模型,對不同分級漏洞的SQL注入攻擊作出檢測分析,從而提升Web應用程序中SQL注入攻擊的檢測精度。
根據SQL注入攻擊發生方式不同可分為SQL常規注入、SQL二階注入、SQL盲注等方式。SQL常規注入攻擊是通過修改數據庫執行的SQL語句,或在容易遭受攻擊的SQL語句中嵌入updatexml()惡意函數,來完成SQL語句信息的錯誤修改、并從數據庫中獲取到有價值的數據信息。[1]其中updatexml()惡意函數包括xml_document、XPathstring、new_value等組成參量,xml_document表示文檔名稱、XPathstring表示查詢定位的字符串格式、new_value表示替換的符合條件值。如在SQL Server數據庫的數據訪問過程中,數據庫內部的訪問函數參數產生錯誤,這時SQL常規注入會查詢帶有錯誤信息的函數,展開某一部位SQL語句的修改、嵌入updatexml()惡意函數。
SQL二階注入攻擊是相對一階SQL注入攻擊的漏洞攻擊模式。一階SQL注入是將惡意字符寫入到SQL語句中,SQL語句惡意字符串插入與修改后的傳播路徑為從source源點輸入、傳播至sink匯聚結點結束,當外部用戶提交請求方為該SQL語句,立即引發SQL注入攻擊。SQL二階注入攻擊則是對插入的SQL語句惡意字符串數據進行轉義,將SQL語句寫入數據庫,但不會立即執行攻擊,而是等待下一個調用該數據的SQL語句執行時發起攻擊,也即當用戶再次調用SQL語句、使用存儲的惡意字符串數據時,才會間接觸發SQL注入攻擊。
SQL盲注是由客戶端向服務端發送SQL注入請求語句,根據服務器端返回的“true or fales”信息,獲取攻擊所需網絡頁面、SQL語句相關信息[2]。若Web應用程序未對上述輸入數據請求變量實施過濾處理,那么可利用該變量偽造HTTP網絡消息的報頭值、修改SQL語句,包括對Web系統用戶輸入信息、Cookie內容的修改。服務器端執行被修改的SQL語句時,可能會誤刪后臺數據庫的存儲數據來完成SQL盲注攻擊。
SQL注入攻擊利用在系統表單或URL查詢字符串后,插入特殊字符構造非法的SQL語句,并作為輸入參數經由source源點傳播至sink匯聚結點、傳遞至Web應用程序。當服務器端執行輸入的非法SQL語句時,攻擊方會對關系型數據庫存儲的xml文檔漏洞發起攻擊,便成功實現自己所要執行的操作。[3]對不同關系型數據庫而言,SQL注入攻擊存在差異,具體的SQL注入攻擊執行流程如下:
(1)判斷Web應用程序是否可SQL注入。當用戶只訪問Web應用程序的URL列表、網頁內容時不發生SQL注入攻擊,只有從數據庫中動態查詢存儲的網頁數據信息時,才有可能發生SQL注入攻擊問題。
(2)查找SQL語句注入點。確定Web網頁可SQL注入后利用帶特殊參數的查詢條件語句如"select*from books",在有SQL語句參數傳遞的位置輸入查詢語句、查找網頁中存在的SQL注入漏洞,根據服務器端返回的“true or fales”信息,判斷該頁面存在(不存在)SQL注入漏洞,僅當對“and 1=1”“and 1=2”查詢條件語句返回錯誤信息時,則表明Web應用程序存在漏洞、且容易遭受SQL注入攻擊。
(3)判斷數據庫類型。不同關系數據庫類型所使用的SQL注入攻擊方式不同,如對SQLServer數據庫、MySql數據庫、Access數據庫進行SQL注入攻擊的手段存在差異,在發動SQL注入攻擊前需判斷選擇的數據庫類型。
(4)權限擴張。在確定數據庫類型后擴張訪問與操作數據庫的用戶權限。例如以SQL Server數據庫作為SQL注入攻擊的數據庫類型,判斷SQL注入攻擊的輸入source源點是否支持多語句查詢,若用戶擁有最高權限(SuperAdmin,SA)、且數據庫存在xp_cmdshell擴展存儲,則可執行SQL shell命令字符串來完成用戶權限擴張;若用戶不存在SA權限,那么需要針對獲取的SQL Server數據庫表名稱、URL列表名稱,使用邏輯值錯誤查詢與判斷法確定用戶權限字段值進行權限擴張。
按照SQL注入攻擊漏洞由弱到強的防御強度等級,將其分為0級、1級、2級和3級漏洞。0級漏洞指若Web應用程序未對輸入SQL數據請求變量實施過濾處理,表明Web系統對SQL注入攻擊的防御強度最低,如假設用戶登錄Web系統的代碼為“string sql="select*from user where user__name='"+t1.Text.Trim()+"'and user_password='"+t2”,那么若輸入用戶名為“abc or 1=1--?”時即可通過系統身份驗證。
1級漏洞指Web系統在過濾SQL語句的“’”“#”insert”“mid”等特殊字符時,插入特殊字符構造的非法SQL語句可繞過過濾機制,對Web應用程序作出SQL注入攻擊,表明該SQL注入攻擊漏洞為1級漏洞[4]。較為常見的非法SQL語句字符串構造法,包含替換編碼法(ASCII與UNICODE編碼替換)、大小寫混合編碼法與重組法,其中大小寫混合編碼法、ASCII與UNICODE替換編碼法可騙過單一的字符串過濾機制。重組繞過法是將用戶提交的信息進行修改,如將過濾關鍵字“and”修改為“aandnandd”,那么即使Web系統完成SQL語句的關鍵字過濾,仍然存在該關鍵字的字符,也就可能導致SQL注入攻擊的發生。
2級漏洞指若Web應用程序、后臺數據庫的通信方式存在漏洞,如用戶輸入信息的存儲可能存在未被篩選的字符串,那么存儲過程中可能會發生SQL注入攻擊,攻擊方登錄Web應用程序后,會在后臺數據庫執行惡意命令。
3級漏洞指使用參數化查詢法構建Web應用程序的SQL語句時,若參數化查詢法所耗時間過長則二階SQL注入漏洞的查詢、檢測容易出現問題,當外部數據項與二階SQL注入字符串形成連接將發生數據攻擊情況。
按照SQL注入攻擊0級、1級、2級和3級的漏洞分級策略將其分為如表1所示的測試等價類。其中0級、1級和2級(即二階SQL注入攻擊)的SQL注入攻擊漏洞都可劃分為相應的有效等價類,3級漏洞由于并非自動化SQL注入攻擊,因此不能對其作出測試等價類劃分[5]。之后根據SQL注入攻擊漏洞等級所劃分的有效等價類,設置每種等價類所對應的測試用例,保證在Web應用程序的SQL注入攻擊漏洞檢測時,能夠針對不同的情況采用不同的測試用例,有助于消除在測試時的數據信息冗余,確保測試檢測完備性。

表1 基于模糊測試法的SQL注入攻擊測試模型用例
依照一階、二階SQL注入攻擊威脅的檢測要求,采用模塊化開發設計理念完成SQL注入漏洞檢測模型的結構設計,包括信息收集模塊、漏洞模糊測試模塊、數據庫組件等組成部分設置[6],具體如圖1所示。

圖1 基于模糊測試技術的SQL注入攻擊檢測模型架構
信息收集模塊負責對待測Web應用程序的頁面信息收集包括URL列表獲取、HTML網頁、一階SQL注入疑似路徑獲取、二階SQL注入疑似路徑獲取等。首先利用Python Scrapy網絡爬蟲框架獲取網頁URL,對整個系統運行頁面的URL列表進行下載解析,提取重要的SQL語句信息。使用程序切片(chopping)規則通過查找一階、二階注入操作對,獲取到一階、二階SQL注入攻擊的疑似路徑,包括source源點至sink匯聚結點的惡意字符串傳播路徑,并作為漏洞檢測的輸入信息存儲至數據庫中。
漏洞檢測模塊在接收到信息收集模塊提取的待測數據后,基于以上不同漏洞等級構建的測試用例向Web應用程序發出SQL注入攻擊的連接請求,從測試用例庫中讀取檢測腳本文件開始SQL注入攻擊測試、修改SQL語句,根據獲取到的請求反饋信息判斷實施攻擊后,檢測腳本文件的測試用例是否與遭受該級別SQL注入攻擊的URL專有標識相匹配,若匹配則表明存在該級別的SQL注入攻擊漏洞,否則表明不存在這一級別的SQL注入攻擊漏洞,將得到的檢測結果信息存儲至數據庫中,具體執行流程如圖2所示。之后重復以上步驟,直到信息收集模塊獲取到的Web應用程序所有URL列表網頁,都完成SQL注入攻擊的漏洞模糊測試為止。

圖2 漏洞模糊測試模塊的執行流程
為驗證模糊測試技術的SQL注入漏洞檢測有效性,本文利用ASP.NET、Microsoft Visual Studio、IIS服務器、SQLServer數據庫等軟硬件搭建實驗環境,使用BSQL Hacker自動注入工具實施Web應用程序的網頁注入攻擊,選取某高校校內圖書館Web管理程序(JSPLibrary)對不同層級SQL注入攻擊的漏洞檢測效果進行實驗論證,對基于模糊測試技術的SQL注入漏洞檢測模型進行實驗論證。
圖書館Web管理程序(JSPLibrary)的被測文件數為55個、后臺代碼行數為3352行,在一階SQL注入疑似路徑查找過程中,以Web應用管理程序的后臺代碼作為輸入進行預處理,然后使用不同等級漏洞的測試用例,對收集到的URL列表獲取、HTML網頁等信息進行查找與過濾,通過與測試用例的字符匹配檢測得到一階SQL注入疑似路徑數。然后在一階SQL注入疑似路徑數的基礎上,按照文件邏輯地址的依照順序存取操作規則(如表1(7)所示),得到二階SQL注入攻擊的操作對,檢測出的二階SQL注入攻擊威脅數如表2所示。

表2 一階、二階SQL注入攻擊威脅數檢測結果
從表2的一階、二階SQL注入攻擊威脅數檢測結果可以發現:使用BSQL Hacker注入攻擊工具、基于模糊測試技術的測試用例設計方案,能夠獲取到被攻擊的數據庫名、二階注入操作對文件名、數據庫表名,且檢測到的一階、二階SQL注入攻擊疑似威脅數分別為10個和4個,一階、二階SQL注入攻擊確認威脅數為8個和4個,檢測準確率達到90%以上,遠遠優于基于程序切片(chopping)法的SQL注入攻擊檢測結果,可被廣泛用于校園、醫院、社區等處的網絡Web應用程序SQL攻擊威脅檢測工作。
Web應用程序可通過SQL結構化查詢語言與后臺數據庫建立網絡通信的交互連接,但在用戶訪問Web應用網絡、SQL命令處理與執行過程中,外部SQL注入攻擊會針對應用程序的輸入數據過濾、驗證漏洞構造特殊的輸入SQL語句,達到控制服務器Web應用程序、獲取重要數據信息的目的。因此,針對一階、二階SQL注入攻擊執行過程中,在系統表單或URL查詢字符串后插入特殊字符,將非法數據插入系統數據庫、服務器端的情況,采用模糊測試的SQL注入漏洞攻擊檢測模型進行分級漏洞檢測,可實現系統數據庫、服務器端的安全配置和漏洞防御。