袁梁
(無錫城市職業(yè)技術(shù)學(xué)院,江蘇 無錫 214153)
SQL注入攻擊漏洞是Web應(yīng)用程序最嚴重的安全風(fēng)險之一,通常攻擊者利用服務(wù)器變量、Cookie注冊表、二階注入等攻擊方式,在用網(wǎng)絡(luò)戶向Web應(yīng)用程序提交輸入信息時發(fā)起攻擊,修改一階SQL注入的結(jié)構(gòu)化查詢語句,或者將二階SQL注入信息存儲至數(shù)據(jù)庫中,但不立即執(zhí)行,直到下一個調(diào)用該數(shù)據(jù)的SQL語句執(zhí)行時發(fā)起攻擊。針對此問題,本文利用模糊測試的SQL注入漏洞攻擊檢測模型,對不同分級漏洞的SQL注入攻擊作出檢測分析,從而提升Web應(yīng)用程序中SQL注入攻擊的檢測精度。
根據(jù)SQL注入攻擊發(fā)生方式不同可分為SQL常規(guī)注入、SQL二階注入、SQL盲注等方式。SQL常規(guī)注入攻擊是通過修改數(shù)據(jù)庫執(zhí)行的SQL語句,或在容易遭受攻擊的SQL語句中嵌入updatexml()惡意函數(shù),來完成SQL語句信息的錯誤修改、并從數(shù)據(jù)庫中獲取到有價值的數(shù)據(jù)信息。[1]其中updatexml()惡意函數(shù)包括xml_document、XPathstring、new_value等組成參量,xml_document表示文檔名稱、XPathstring表示查詢定位的字符串格式、new_value表示替換的符合條件值。如在SQL Server數(shù)據(jù)庫的數(shù)據(jù)訪問過程中,數(shù)據(jù)庫內(nèi)部的訪問函數(shù)參數(shù)產(chǎn)生錯誤,這時SQL常規(guī)注入會查詢帶有錯誤信息的函數(shù),展開某一部位SQL語句的修改、嵌入updatexml()惡意函數(shù)。
SQL二階注入攻擊是相對一階SQL注入攻擊的漏洞攻擊模式。一階SQL注入是將惡意字符寫入到SQL語句中,SQL語句惡意字符串插入與修改后的傳播路徑為從source源點輸入、傳播至sink匯聚結(jié)點結(jié)束,當(dāng)外部用戶提交請求方為該SQL語句,立即引發(fā)SQL注入攻擊。SQL二階注入攻擊則是對插入的SQL語句惡意字符串?dāng)?shù)據(jù)進行轉(zhuǎn)義,將SQL語句寫入數(shù)據(jù)庫,但不會立即執(zhí)行攻擊,而是等待下一個調(diào)用該數(shù)據(jù)的SQL語句執(zhí)行時發(fā)起攻擊,也即當(dāng)用戶再次調(diào)用SQL語句、使用存儲的惡意字符串?dāng)?shù)據(jù)時,才會間接觸發(fā)SQL注入攻擊。
SQL盲注是由客戶端向服務(wù)端發(fā)送SQL注入請求語句,根據(jù)服務(wù)器端返回的“true or fales”信息,獲取攻擊所需網(wǎng)絡(luò)頁面、SQL語句相關(guān)信息[2]。若Web應(yīng)用程序未對上述輸入數(shù)據(jù)請求變量實施過濾處理,那么可利用該變量偽造HTTP網(wǎng)絡(luò)消息的報頭值、修改SQL語句,包括對Web系統(tǒng)用戶輸入信息、Cookie內(nèi)容的修改。服務(wù)器端執(zhí)行被修改的SQL語句時,可能會誤刪后臺數(shù)據(jù)庫的存儲數(shù)據(jù)來完成SQL盲注攻擊。
SQL注入攻擊利用在系統(tǒng)表單或URL查詢字符串后,插入特殊字符構(gòu)造非法的SQL語句,并作為輸入?yún)?shù)經(jīng)由source源點傳播至sink匯聚結(jié)點、傳遞至Web應(yīng)用程序。當(dāng)服務(wù)器端執(zhí)行輸入的非法SQL語句時,攻擊方會對關(guān)系型數(shù)據(jù)庫存儲的xml文檔漏洞發(fā)起攻擊,便成功實現(xiàn)自己所要執(zhí)行的操作。[3]對不同關(guān)系型數(shù)據(jù)庫而言,SQL注入攻擊存在差異,具體的SQL注入攻擊執(zhí)行流程如下:
(1)判斷Web應(yīng)用程序是否可SQL注入。當(dāng)用戶只訪問Web應(yīng)用程序的URL列表、網(wǎng)頁內(nèi)容時不發(fā)生SQL注入攻擊,只有從數(shù)據(jù)庫中動態(tài)查詢存儲的網(wǎng)頁數(shù)據(jù)信息時,才有可能發(fā)生SQL注入攻擊問題。
(2)查找SQL語句注入點。確定Web網(wǎng)頁可SQL注入后利用帶特殊參數(shù)的查詢條件語句如"select*from books",在有SQL語句參數(shù)傳遞的位置輸入查詢語句、查找網(wǎng)頁中存在的SQL注入漏洞,根據(jù)服務(wù)器端返回的“true or fales”信息,判斷該頁面存在(不存在)SQL注入漏洞,僅當(dāng)對“and 1=1”“and 1=2”查詢條件語句返回錯誤信息時,則表明Web應(yīng)用程序存在漏洞、且容易遭受SQL注入攻擊。
(3)判斷數(shù)據(jù)庫類型。不同關(guān)系數(shù)據(jù)庫類型所使用的SQL注入攻擊方式不同,如對SQLServer數(shù)據(jù)庫、MySql數(shù)據(jù)庫、Access數(shù)據(jù)庫進行SQL注入攻擊的手段存在差異,在發(fā)動SQL注入攻擊前需判斷選擇的數(shù)據(jù)庫類型。
(4)權(quán)限擴張。在確定數(shù)據(jù)庫類型后擴張訪問與操作數(shù)據(jù)庫的用戶權(quán)限。例如以SQL Server數(shù)據(jù)庫作為SQL注入攻擊的數(shù)據(jù)庫類型,判斷SQL注入攻擊的輸入source源點是否支持多語句查詢,若用戶擁有最高權(quán)限(SuperAdmin,SA)、且數(shù)據(jù)庫存在xp_cmdshell擴展存儲,則可執(zhí)行SQL shell命令字符串來完成用戶權(quán)限擴張;若用戶不存在SA權(quán)限,那么需要針對獲取的SQL Server數(shù)據(jù)庫表名稱、URL列表名稱,使用邏輯值錯誤查詢與判斷法確定用戶權(quán)限字段值進行權(quán)限擴張。
按照SQL注入攻擊漏洞由弱到強的防御強度等級,將其分為0級、1級、2級和3級漏洞。0級漏洞指若Web應(yīng)用程序未對輸入SQL數(shù)據(jù)請求變量實施過濾處理,表明Web系統(tǒng)對SQL注入攻擊的防御強度最低,如假設(shè)用戶登錄Web系統(tǒng)的代碼為“string sql="select*from user where user__name='"+t1.Text.Trim()+"'and user_password='"+t2”,那么若輸入用戶名為“abc or 1=1--?”時即可通過系統(tǒng)身份驗證。
1級漏洞指Web系統(tǒng)在過濾SQL語句的“’”“#”insert”“mid”等特殊字符時,插入特殊字符構(gòu)造的非法SQL語句可繞過過濾機制,對Web應(yīng)用程序作出SQL注入攻擊,表明該SQL注入攻擊漏洞為1級漏洞[4]。較為常見的非法SQL語句字符串構(gòu)造法,包含替換編碼法(ASCII與UNICODE編碼替換)、大小寫混合編碼法與重組法,其中大小寫混合編碼法、ASCII與UNICODE替換編碼法可騙過單一的字符串過濾機制。重組繞過法是將用戶提交的信息進行修改,如將過濾關(guān)鍵字“and”修改為“aandnandd”,那么即使Web系統(tǒng)完成SQL語句的關(guān)鍵字過濾,仍然存在該關(guān)鍵字的字符,也就可能導(dǎo)致SQL注入攻擊的發(fā)生。
2級漏洞指若Web應(yīng)用程序、后臺數(shù)據(jù)庫的通信方式存在漏洞,如用戶輸入信息的存儲可能存在未被篩選的字符串,那么存儲過程中可能會發(fā)生SQL注入攻擊,攻擊方登錄Web應(yīng)用程序后,會在后臺數(shù)據(jù)庫執(zhí)行惡意命令。
3級漏洞指使用參數(shù)化查詢法構(gòu)建Web應(yīng)用程序的SQL語句時,若參數(shù)化查詢法所耗時間過長則二階SQL注入漏洞的查詢、檢測容易出現(xiàn)問題,當(dāng)外部數(shù)據(jù)項與二階SQL注入字符串形成連接將發(fā)生數(shù)據(jù)攻擊情況。
按照SQL注入攻擊0級、1級、2級和3級的漏洞分級策略將其分為如表1所示的測試等價類。其中0級、1級和2級(即二階SQL注入攻擊)的SQL注入攻擊漏洞都可劃分為相應(yīng)的有效等價類,3級漏洞由于并非自動化SQL注入攻擊,因此不能對其作出測試等價類劃分[5]。之后根據(jù)SQL注入攻擊漏洞等級所劃分的有效等價類,設(shè)置每種等價類所對應(yīng)的測試用例,保證在Web應(yīng)用程序的SQL注入攻擊漏洞檢測時,能夠針對不同的情況采用不同的測試用例,有助于消除在測試時的數(shù)據(jù)信息冗余,確保測試檢測完備性。
表1 基于模糊測試法的SQL注入攻擊測試模型用例
依照一階、二階SQL注入攻擊威脅的檢測要求,采用模塊化開發(fā)設(shè)計理念完成SQL注入漏洞檢測模型的結(jié)構(gòu)設(shè)計,包括信息收集模塊、漏洞模糊測試模塊、數(shù)據(jù)庫組件等組成部分設(shè)置[6],具體如圖1所示。
圖1 基于模糊測試技術(shù)的SQL注入攻擊檢測模型架構(gòu)
信息收集模塊負責(zé)對待測Web應(yīng)用程序的頁面信息收集包括URL列表獲取、HTML網(wǎng)頁、一階SQL注入疑似路徑獲取、二階SQL注入疑似路徑獲取等。首先利用Python Scrapy網(wǎng)絡(luò)爬蟲框架獲取網(wǎng)頁URL,對整個系統(tǒng)運行頁面的URL列表進行下載解析,提取重要的SQL語句信息。使用程序切片(chopping)規(guī)則通過查找一階、二階注入操作對,獲取到一階、二階SQL注入攻擊的疑似路徑,包括source源點至sink匯聚結(jié)點的惡意字符串傳播路徑,并作為漏洞檢測的輸入信息存儲至數(shù)據(jù)庫中。
漏洞檢測模塊在接收到信息收集模塊提取的待測數(shù)據(jù)后,基于以上不同漏洞等級構(gòu)建的測試用例向Web應(yīng)用程序發(fā)出SQL注入攻擊的連接請求,從測試用例庫中讀取檢測腳本文件開始SQL注入攻擊測試、修改SQL語句,根據(jù)獲取到的請求反饋信息判斷實施攻擊后,檢測腳本文件的測試用例是否與遭受該級別SQL注入攻擊的URL專有標(biāo)識相匹配,若匹配則表明存在該級別的SQL注入攻擊漏洞,否則表明不存在這一級別的SQL注入攻擊漏洞,將得到的檢測結(jié)果信息存儲至數(shù)據(jù)庫中,具體執(zhí)行流程如圖2所示。之后重復(fù)以上步驟,直到信息收集模塊獲取到的Web應(yīng)用程序所有URL列表網(wǎng)頁,都完成SQL注入攻擊的漏洞模糊測試為止。
圖2 漏洞模糊測試模塊的執(zhí)行流程
為驗證模糊測試技術(shù)的SQL注入漏洞檢測有效性,本文利用ASP.NET、Microsoft Visual Studio、IIS服務(wù)器、SQLServer數(shù)據(jù)庫等軟硬件搭建實驗環(huán)境,使用BSQL Hacker自動注入工具實施Web應(yīng)用程序的網(wǎng)頁注入攻擊,選取某高校校內(nèi)圖書館Web管理程序(JSPLibrary)對不同層級SQL注入攻擊的漏洞檢測效果進行實驗論證,對基于模糊測試技術(shù)的SQL注入漏洞檢測模型進行實驗論證。
圖書館Web管理程序(JSPLibrary)的被測文件數(shù)為55個、后臺代碼行數(shù)為3352行,在一階SQL注入疑似路徑查找過程中,以Web應(yīng)用管理程序的后臺代碼作為輸入進行預(yù)處理,然后使用不同等級漏洞的測試用例,對收集到的URL列表獲取、HTML網(wǎng)頁等信息進行查找與過濾,通過與測試用例的字符匹配檢測得到一階SQL注入疑似路徑數(shù)。然后在一階SQL注入疑似路徑數(shù)的基礎(chǔ)上,按照文件邏輯地址的依照順序存取操作規(guī)則(如表1(7)所示),得到二階SQL注入攻擊的操作對,檢測出的二階SQL注入攻擊威脅數(shù)如表2所示。
表2 一階、二階SQL注入攻擊威脅數(shù)檢測結(jié)果
從表2的一階、二階SQL注入攻擊威脅數(shù)檢測結(jié)果可以發(fā)現(xiàn):使用BSQL Hacker注入攻擊工具、基于模糊測試技術(shù)的測試用例設(shè)計方案,能夠獲取到被攻擊的數(shù)據(jù)庫名、二階注入操作對文件名、數(shù)據(jù)庫表名,且檢測到的一階、二階SQL注入攻擊疑似威脅數(shù)分別為10個和4個,一階、二階SQL注入攻擊確認威脅數(shù)為8個和4個,檢測準確率達到90%以上,遠遠優(yōu)于基于程序切片(chopping)法的SQL注入攻擊檢測結(jié)果,可被廣泛用于校園、醫(yī)院、社區(qū)等處的網(wǎng)絡(luò)Web應(yīng)用程序SQL攻擊威脅檢測工作。
Web應(yīng)用程序可通過SQL結(jié)構(gòu)化查詢語言與后臺數(shù)據(jù)庫建立網(wǎng)絡(luò)通信的交互連接,但在用戶訪問Web應(yīng)用網(wǎng)絡(luò)、SQL命令處理與執(zhí)行過程中,外部SQL注入攻擊會針對應(yīng)用程序的輸入數(shù)據(jù)過濾、驗證漏洞構(gòu)造特殊的輸入SQL語句,達到控制服務(wù)器Web應(yīng)用程序、獲取重要數(shù)據(jù)信息的目的。因此,針對一階、二階SQL注入攻擊執(zhí)行過程中,在系統(tǒng)表單或URL查詢字符串后插入特殊字符,將非法數(shù)據(jù)插入系統(tǒng)數(shù)據(jù)庫、服務(wù)器端的情況,采用模糊測試的SQL注入漏洞攻擊檢測模型進行分級漏洞檢測,可實現(xiàn)系統(tǒng)數(shù)據(jù)庫、服務(wù)器端的安全配置和漏洞防御。