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