黃小丹
(四川大學計算機學院,成都610065)
SQL注入常用于攻擊Web應用程序,攻擊者的輸入值被傳輸?shù)匠绦蛑械臄?shù)據(jù)庫中執(zhí)行查詢語句,從而形成SQL代碼[2]。利用程序中存在的SQL注入漏洞并插入惡意SQL代碼,可以繞開身份認證,竊取用戶信息或篡改數(shù)據(jù)內(nèi)容等,引發(fā)嚴重后果。OWASP(Open Web Application Security Project)在2017年發(fā)布的一份安全調(diào)查中,SQL注入類漏洞(SQLIV)仍被列為2017年十大Web應用程序漏洞之一,且位居榜首[3]。安全測試是Web應用程序生命周期的重要步驟,有效的測試技術(shù)可以盡早檢測出程序的SQLIV,降低軟件開發(fā)的相關(guān)成本。因此,人們提出了許多用于檢測SQLIV的測試技術(shù),包括靜態(tài)測試、動態(tài)測試、滲透測試、模糊測試等。目前有關(guān)SQL注入的研究工作主要聚焦于SQL注入攻擊的實時檢測和防御技術(shù)。本文就SQL注入形成原因以及攻擊的主要方式有哪些、SQL注入漏洞檢測方法及一般檢測流程是什么等問題進行調(diào)研,并按照測試技術(shù)和測試流程對近幾年檢測SQLIV的技術(shù)進行分析。本文采用系統(tǒng)文獻綜述方法,全面調(diào)研SQLIV檢測相關(guān)研究,目的是從測試角度清晰劃分用于檢測SQLIV的技術(shù),歸納現(xiàn)有的研究,并展望其未來發(fā)展趨勢,以便安全測試人員根據(jù)不同測試目的和需解決問題,選擇與研究相關(guān)檢測技術(shù)。
系統(tǒng)文獻綜述(Systematic Literature Review)是一種基于文獻的系統(tǒng)化總結(jié)和分析方法,需要收集并綜合某具體研究問題的成果。本文采用此方法分析和總結(jié)了近10年常用的SQL注入漏洞檢測相關(guān)技術(shù)。
(1)研究問題的提出
問題1:SQL注入漏洞的產(chǎn)生原因及注入方式是什么?SQL注入漏洞的產(chǎn)生一般是由于代碼編寫不規(guī)范造成,具體而言,哪些編程實踐容易造成SQL注入?另外,SQL注入方式多種多樣,常見的方式有哪些?
問題2:用于SQL注入漏洞檢測的技術(shù)有哪些?根據(jù)是否檢測被測程序的源代碼,可分為白盒方法和黑盒方法,分別分析白盒、黑盒中一些常用的SQL注入漏洞檢測技術(shù)。
問題3:SQL注入漏洞的一般檢測流程,以及流程各階段常用的檢測技術(shù)是什么?該問題主要分析SQL注入漏洞檢測的流程,各階段需要解決的問題,以及解決這些問題常用的檢測技術(shù)。
(2)文獻檢索策略
本文文獻調(diào)研的數(shù)據(jù)來源于Web of Science、IEEE、ACM、CNKI等數(shù)據(jù)庫,檢索工具采用百度和BING 等搜索器,檢索詞包括“SQL injection”、“Security testing”、“SQL 注入”、“安全測試”等關(guān)鍵字,檢索發(fā)表時間從2008年到2019年的文獻。對于檢索結(jié)果,采用人工方式,根據(jù)文獻題目和摘要等,確定其是否與SQL注入檢測主題相關(guān)。在此基礎(chǔ)上,進行人工檢索,采用“滾雪球”方法,基于文獻的參考文獻進行進一步檢索。
(3)文獻篩選與分析
選取每個數(shù)據(jù)庫檢索結(jié)果的前200條記錄,按照去重復、去短文、去海報等原則對文獻進行篩選,最終從檢索到的9911篇論文中篩選出內(nèi)容相關(guān)性較強的471篇論文,用于文獻計量分析。通過分析,圖1(a)展示了2008年到2019年有關(guān)SQL注入相關(guān)文獻的發(fā)表情況;圖1(b)展示了SQL注入相關(guān)文獻中SQL注入漏洞檢測、攻擊檢測或預防、綜述等類別文獻的占比情況,其中SQL注入漏洞檢測相關(guān)內(nèi)容的文獻共計181篇,占比38%,是SQL注入相關(guān)研究的關(guān)注熱點。然后從內(nèi)容、文章級別、引用量等方面考慮,入選了具有代表性的SQL注入漏洞檢測相關(guān)文獻共計40篇進行文獻綜述,其中包括SCI級別論文5篇、A類論文6篇、B類3篇、C類9篇、中文核心2篇等。按照SQL注入產(chǎn)生原因、方式,SQL注入漏洞檢測流程及方法分別提取文獻中的相關(guān)內(nèi)容,回答提出的研究問題。
(4)研究結(jié)果報告
對入選的相關(guān)文獻進行分類、分析和總結(jié),回答提出的研究問題,即SQL注入的漏洞產(chǎn)生原因和注入方式、檢測流程及常用的檢測方法,歸納本領(lǐng)域研究的主要問題,展望未來的研究方向,為領(lǐng)域研究學者提供參考。
SQL注入產(chǎn)生的實質(zhì)是因為惡意代碼被偽裝成正常的輸入數(shù)據(jù),與輸入命令拼接在一起,成為可執(zhí)行命令,提交到服務器的數(shù)據(jù)庫。其漏洞產(chǎn)生原因主要是由于編程人員Web安全知識不足或缺少安全編程經(jīng)驗,編寫的代碼不完善,
(1)不恰當?shù)厥褂肁PI操作數(shù)據(jù)庫[9]:數(shù)據(jù)庫API方法用于連接數(shù)據(jù)庫,指定的數(shù)據(jù)庫操作與URL或POST中的查詢字符串可進行拼接,這就允許程序員在連接中執(zhí)行合法或非法查詢,可能造成SQL注入。
(2)缺乏有效的輸入驗證和過濾機制[36]:應用程序在沒有適當?shù)仳炞C和過濾用戶提交的數(shù)據(jù)的情況下,直接使用用戶提交數(shù)據(jù)與數(shù)據(jù)庫中常規(guī)SQL語句進行拼接,構(gòu)造數(shù)據(jù)庫查詢或操作語句,從而引起SQL注入。
對程序進行SQL注入攻擊,以檢測程序本身漏洞時,根據(jù)構(gòu)造SQL語句的不同,可劃分不同的注入方式[12,28]。
(1)同義反復:主要目標是將惡意代碼插入到多個條件語句中,使SQL語句的條件子句部分總是為真,致使原條件失效,主要用于繞過身份驗證。例:
圖1
由于'1'='1'總是為真,將輸出accounts表中所有記錄。
(2)邏輯錯誤查詢:向被測系統(tǒng)提交錯誤的SQL語句,致其返回錯誤信息,通過分析報錯可獲得系統(tǒng)內(nèi)部信息。例:
從元數(shù)據(jù)表sysobjects中查詢用戶表xtype='u',并轉(zhuǎn)換為一個整數(shù),系統(tǒng)會因為非法的類型轉(zhuǎn)換而拋出錯誤,根據(jù)錯誤信息可確定數(shù)據(jù)庫類型為SQL Server。
(3)聯(lián)合查詢:通過在 SQL查詢語句中加入“UNION”的求并集子句,可以獲得額外信息。例:
由于不存在login等于''的記錄,第一部分返回空集,而UNION部分將查詢出卡號為003的人的重要信息。
(4)復合查詢:使用分號“;”將不同的SQL查詢、插入、刪除等操作連接到原始查詢,以執(zhí)行數(shù)據(jù)。例:
執(zhí)行分號后的語句會刪除表users,從而破壞重要信息。
(5)存儲過程:存儲過程包含參數(shù),在參數(shù)傳遞過程中可能存在SQL注入。例:
該存儲過程返回值為true或false,當插入?yún)?shù)為'';SHUTDOWN;'',將導致數(shù)據(jù)庫關(guān)閉。
(6)推理:構(gòu)造條件互相對立的SQL語句,通過觀察、收集系統(tǒng)在對立條件下的不同反應獲得系統(tǒng)內(nèi)部信息,可分為條件盲注和時間盲注。例如條件盲注:
提交第一個查詢語句,應用程序會返回錯誤消息,但無法確定是因為應用程序驗證輸入后阻止了攻擊,還是因為條件1=0導致了錯誤。然后提交第二個查詢(恒為真),如果沒有錯誤消息,即說明程序未阻止攻擊,存在注入。
(7)編碼替換:利用ASCII編碼、十六進制編碼、HTML編碼等方式轉(zhuǎn)化輸入形式以躲過防御和過濾機制。例:
如果程序未識別ASCII碼并過濾,數(shù)據(jù)庫將執(zhí)行SHUTDOWN命令。
在安全測試中,檢測SQL注入漏洞指對被測程序進行測試,以發(fā)現(xiàn)程序本身的漏洞。按照是否分析被測程序源代碼,可將檢測方法分為白盒和黑盒兩類。根據(jù)計量分析,圖2表示了SQL注入漏洞檢測相關(guān)文獻中用到檢測方法的占比情況。
圖2 SQL注入漏洞檢測方法分類占比
白盒技術(shù)通過分析被測程序源代碼,采用靜態(tài)或動態(tài)檢測方式發(fā)掘程序代碼中可能存在的SQL注入漏洞。靜態(tài)分析技術(shù)是用于SQLIV檢測的白盒方法之一,如,DEKANT工具[39]結(jié)合靜態(tài)分析與機器學習,使用序列模型(源代碼指令),學習一組帶注釋的源代碼片的漏洞特征,可識別源代碼中的漏洞。常用的白盒技術(shù)包括:數(shù)據(jù)流分析、污點分析、符號執(zhí)行、約束生成和求解等。
(1)數(shù)據(jù)流分析
獲取相關(guān)數(shù)據(jù)在應用程序中的執(zhí)行路徑,分析執(zhí)行路徑上的數(shù)據(jù)流動和可能取值。基于數(shù)據(jù)流分析,工具SQLInjectionGen使用AMNESIA和字符串參數(shù)檢測,跟蹤用戶輸入到應用程序代碼中的一個脆弱點,從而發(fā)現(xiàn)SQL注入漏洞[20]。
(2)污點分析
動態(tài)污點分析通過標記污點數(shù)據(jù)并跟蹤污染數(shù)據(jù)流傳播,以發(fā)掘源數(shù)據(jù)與結(jié)果數(shù)據(jù)的關(guān)系,來檢測漏洞。Kieyzun等人[31]使用污點分析來識別流入SQL語句的無效輸入,以達到檢測目的。文獻[35]提出一種在Java虛擬機中的動態(tài)污點分析方法,結(jié)合靜態(tài)分析技術(shù),收集可訪問的污染流,減少了運行時開銷。
(3)符號執(zhí)行
符號執(zhí)行把程序執(zhí)行時的具體變量替換成符號值,來模擬每個路徑的執(zhí)行情況,執(zhí)行結(jié)果被整合成多條數(shù)學表達式,通過對表達式求解,就能獲得到達該結(jié)果的路徑。在漏洞檢測中一般將漏洞產(chǎn)生條件設置為執(zhí)行結(jié)果。SAFELI[10]是2008年基于Java Web應用程序的SQL注入掃描器,為早期將符號執(zhí)行應用于Web安全提供了一個概念。文獻[14]首先將代碼轉(zhuǎn)換為抽象語法樹;然后使用符號執(zhí)行技術(shù)模擬程序的實際執(zhí)行,并進行程序間分析來檢測漏洞,能夠識別出PHP的Web應用程序中的SQL注入漏洞。
(4)約束生成和求解
許多程序的自動測試、分析和驗證技術(shù)可以有效地簡化為約束生成階段,然后是約束求解階段。這種關(guān)注點的分離通常會使測試更加有效。Hampi[41]通過使用正則表達式、上下文無關(guān)語法、字符串術(shù)語之間的等式以及典型的字符串操作(如連接和提取子字符串)來指定約束,查找Web應用程序中的SQL注入漏洞。
白盒技術(shù)的優(yōu)勢在于其基于源代碼,覆蓋率高;在程序的開發(fā)和編碼階段就能檢測程序安全性,可以及時發(fā)現(xiàn)漏洞并進行修復,減少成本。但實際情況中可能無法獲取到程序源代碼,因此可用性不高;同時,覆蓋源代碼的復雜度高,路徑不可達時白盒無法確認漏洞。
黑盒技術(shù)無需了解目標系統(tǒng)源代碼和數(shù)據(jù)庫的結(jié)構(gòu),在提交測試用例后,通過直接分析返回的結(jié)果,判斷是否存在漏洞,常用于SQL注入漏洞檢測工具的研究[5,6,11]。在調(diào)研文獻中,黑盒方法共92篇(53%),是最主要的SQL注入漏洞檢測方法。文獻[16]設計的黑盒檢測工具,實現(xiàn)了三種不同的SQL注入漏洞檢測技術(shù):改進的滲透測試、攻擊簽名和接口監(jiān)視、運行時異常檢測。
滲透測試常使用黑盒技術(shù),指在可控范圍內(nèi)采用非破壞性的方法,發(fā)現(xiàn)目標程序中存在的漏洞和威脅。通常采用爬蟲方法收集頁面信息,查找注入點,然后持續(xù)構(gòu)造測試用例測試目標系統(tǒng),逐步深入地挖掘出系統(tǒng)漏洞。通常滲透測試需要根據(jù)程序的安全級別(如有無防火墻)[40]、攻擊類型(如盲SQL注入和基于錯誤信息的SQL注入等)[19]采取不同的策略。
模糊測試也屬于黑盒方法,常用于安全測試,測試過程中向被測程序提交大量異常的、包含攻擊向量的測試數(shù)據(jù),并監(jiān)測被測程序行為,判斷是否存在安全漏洞。其本質(zhì)是是向輸入中加入噪音,以混淆目標程序判斷力。它不需要關(guān)注被測系統(tǒng)的內(nèi)部實現(xiàn)細節(jié),具有較好的可復用性,但可能存在生成的有效測試數(shù)據(jù)不足、輸入空間較大造成冗余、難以精確定位漏洞位置等問題。在SQL注入漏洞檢測的應用上,文獻[38]通過對Web服務漏洞采用優(yōu)化分組的模糊測試技術(shù),解決了異常數(shù)據(jù)生成效率低的問題,提高了漏洞檢測的效率以及準確率,可用于檢測SQL注入漏洞。文獻[25]將模糊測試與進化算法結(jié)合,以基于詞匯和語義結(jié)構(gòu)的適應度度量為指導,減少了測試用例的搜索空間。
黑盒技術(shù)無需獲取源代碼,相比白盒測試更為簡單;在程序運行環(huán)境下,通過模擬攻擊者行為實施漏洞利用,可提高準確性。但其有效性和準確性很大程度上又受限于測試用例生成與斷言[27],同時,黑盒測試無法明確測試有效性程度和何時結(jié)束測試。
結(jié)合白盒與黑盒,即靜態(tài)代碼分析與動態(tài)運行時監(jiān)測相結(jié)合的方法,能夠在一定程度上改善漏洞誤報率的問題,提高覆蓋率,在系統(tǒng)可靠性上也有很大的改觀。文獻[7]采用動靜結(jié)合,使用污點分析和模糊測試技術(shù),實現(xiàn)了對二階SQL注入高精度、低誤報的檢測效果。但動靜結(jié)合方法的有效性依賴于測試中的輸入值和對源代碼的觀察。為了提高分析的有效性,程序必須在有足夠測試輸入的情況下執(zhí)行。
SQL注入漏洞檢測的一般流程是:首先確定被測目標程序,在信息收集階段,確定被測程序有哪些可注入點;然后,在測試用例生成階段使用某些技術(shù)生成SQL注入測試用例;在執(zhí)行階段,執(zhí)行生成的測試用例并監(jiān)控目標程序;最后,結(jié)果分析階段需要根據(jù)監(jiān)測或被測程序響應來分析檢測結(jié)果,確認被測程序是否存在SQL注入漏洞。檢測流程如圖3所示。
圖3 SQL注入漏洞檢測一般流程
根據(jù)檢測流程劃分,SQL注入漏洞檢測的相關(guān)研究主要集中在信息收集、測試用例生成以及結(jié)果分析的方法提出和改進,主要目的是提高測試充分性、準確性以及測試效率。
信息收集,指收集被測程序的各項信息,如腳本語言類型、服務器類型、數(shù)據(jù)庫類型、鏈接頁面、輸入域等,以確定程序的可注入點。信息收集階段是發(fā)現(xiàn)漏洞的第一階段,其完備性對漏洞檢測的精度有很大影響。在這一階段,Web爬蟲技術(shù)非常流行,能夠快速提供關(guān)于Web應用程序的信息,但需要解決的主要問題是提高覆蓋率、鏈接去重、提升效率等。例如,使用廣度優(yōu)先搜索(BFS)的爬蟲算法提高覆蓋率[1],隱式爬蟲將身份驗證與爬蟲結(jié)合,以提高數(shù)據(jù)完整性[22]。除爬蟲外,William等人[33]通過實驗表明,基于源代碼的信息收集方法,可以更徹底地運行主體應用程序和發(fā)現(xiàn)漏洞。
良好的SQL注入測試用例生成技術(shù)能夠提高覆蓋率和檢測速率。本文介紹以下幾種常用于SQL注入的測試用例生成技術(shù)。
(1)機器學習
機器學習技術(shù)是研究和構(gòu)建能夠?qū)W習和預測數(shù)據(jù)的算法,通常需要提供大量數(shù)據(jù),并進行分析,構(gòu)建模型進行數(shù)據(jù)驅(qū)動的預測或決策,具有靈活性和可伸縮性。與SQL注入相關(guān)的機器學習技術(shù),目前大量研究集中在SQL注入攻擊的檢測以及預防[4,23,32]。在測試用例的生成上,文獻[37]根據(jù)自定義語法生成一套測試數(shù)據(jù),采用機器學習技術(shù)學習可繞過和不可繞過防火墻的測試用例特征,并根據(jù)特征有效的選擇測試用例或產(chǎn)生更多測試用例繞過防火墻,能夠檢測防火墻中的SQL注入漏洞?;趯W習的漏洞檢測技術(shù)在檢測之前需要經(jīng)過數(shù)據(jù)預處理和訓練階段,會導致計算開銷。同時,缺乏自適應能力,不確定性和模糊性也是是機器學習應用中存在的問題。
(2)基于模型
基于模型的測試指為被測程序(SUT)建立高級模型,并自動派生出測試用例和預期結(jié)果,執(zhí)行根據(jù)所建模型生成的測試用例并對比實際結(jié)果與模型指定結(jié)果,從而驗證是否存在漏洞[15]。文獻[30]提出的規(guī)劃模型,使用規(guī)劃域定義語言(PDDL)描述,將計劃的調(diào)整添加到模型中,有助于生成更廣泛的測試用例,提升XSS和SQL注入漏洞檢測效果。鏈式攻擊方法[18]是Alberto等人提出的一種基于模型測試的方法,其生成的抽象測試用例包含組成一系列鏈式攻擊(即利用被測程序漏洞的一系列攻擊)的操作,適用于不同的攻擊規(guī)則,但可能產(chǎn)生誤報?;谀P偷姆椒?,優(yōu)勢在于提高了測試自動化程度,但僅能覆蓋模型中已指定的測試點,而沒有建模的內(nèi)容可能無法被測試到。
(3)搜索技術(shù)
搜索技術(shù)應用于測試用例生成,即把生成問題轉(zhuǎn)化為進化、搜索問題,采用進化算法使測試用例逐漸成為符合指定目標的用例。常用的搜索技術(shù)包括遺傳算法、蟻群算法等?;谒阉鞯臏y試典型目的是最大化覆蓋率,而在SQL注入漏洞檢測中,其目的是找到漏洞[34]。文獻[8]基于搜索技術(shù),使用遺傳編程,能夠根據(jù)SQL語法生成多種類型的惡意SQL查詢語句,但需要降低測試用例中的語法錯誤率。基于搜索技術(shù)生成測試用例,具有普遍適用性,但如何確定其適應度函數(shù)使進化效果更優(yōu)是目前最主要的難點。
(4)變異技術(shù)
變異技術(shù)用于測試用例生成可分為兩類,一類是對測試輸入進行變異,使測試用例更充分,具有更好的檢測能力。Appelt等人[29]設計了一組變異算子(包括行為改變、語法修復和混淆三類),然后使用不同變異算子的組合,生成包含攻擊的輸入,從而增加了檢測出SQL注入漏洞的可能性。另一類是對源代碼進行變異,通過殺死更多的代碼突變體來使測試用例更有效。Shahriar等人[9]將變異應用于應用程序的源代碼,提出使用9個注入操作符,將錯誤注入SQL查詢條件和數(shù)據(jù)庫API方法調(diào)用中,并通過使用包含SQLIAs的測試數(shù)據(jù)殺死突變體來檢測SQL注入漏洞。文獻[21]結(jié)合這兩類變異技術(shù),把能夠有效殺死突變體的用例作為原始測試用例,再對用例進行變異,提高了其覆蓋率和效率。
測試用例執(zhí)行后,需要對結(jié)果進行分析以判斷是否存在SQL注入漏洞,結(jié)果分析的準確度直接決定了漏洞檢測的準確度,因此,此階段主要目的是提高結(jié)果分析精度。在結(jié)果分析階段,一般通過分析程序響應判斷是否存在漏洞。頁面比對算法常用于結(jié)果分析[17],但當程序不返回錯誤信息時該方法并不適用,例如SQL盲注。文獻[19]基于推理蛻變測試,提出一組邏輯表達式和邏輯運算符,可用于推導程序上下文,檢測出SQL盲注,并有效降低了測試結(jié)果的假陽性。另外,Nuno Autunes等人[24]通過比較SQL/XPath命令in和out攻擊的結(jié)構(gòu),提出了一種檢測SQL注入和XPath注入漏洞的測試精度改進方法。文獻[33]提供了一種新的SQL注入響應分析方法,在將查詢發(fā)送給數(shù)據(jù)庫之前對其進行解析,以檢查它是否是成功的攻擊,如果是,則意味著攻擊突破了防御,系統(tǒng)存在漏洞。
本文主要回顧了近10年的SQL注入漏洞檢測技術(shù)。研究的主要發(fā)現(xiàn)可以概括為:各類SQL注入攻擊方式、SQL注入漏洞形成原因、基于不同測試技術(shù)以及測試不同階段常用的SQL注入漏洞檢測方法的詳細調(diào)查報告,通過提供目前常用的檢測技術(shù)來感知SQL注入方面面臨的主要威脅和主要解決的問題。通過調(diào)查和總結(jié)發(fā)現(xiàn):
(1)目前SQL注入漏洞檢測是安全測試的一大熱門研究問題,主要想解決的問題集中在如何有效地檢測出Web應用中的SQL注入漏洞,減少檢測結(jié)果的假陽性和假陰性,降低誤報率以及提高檢測效率上;
(2)如何結(jié)合多種技術(shù),提高漏洞注入點的發(fā)現(xiàn)能力、測試用例的生成能力等,實現(xiàn)更具針對性、自動化程度更高的檢測技術(shù)也是目前的研究重點;
(3)面對層出不窮的新型SQL注入攻擊,如何發(fā)現(xiàn)和選擇新的可用于此類攻擊的漏洞檢測技術(shù),也在持續(xù)的研究過程之中。本文調(diào)查結(jié)果有助于相關(guān)人員針對檢測中想解決的具體問題選擇具體的方案并進行下一步的研究。