張瑩瑩 凌 捷
(廣東工業(yè)大學計算機學院 廣東 廣州 510006)
?
一種SQL注入漏洞定位檢測方法
張瑩瑩凌捷
(廣東工業(yè)大學計算機學院廣東 廣州 510006)
摘要SQL注入是攻擊Web程序的常見手段。傳統(tǒng)的SQL注入漏洞檢測工具在定位效率、檢測廣度很難滿足目前日益增長的程序代碼量。針對這種情況,分析SQL注入漏洞的特征,提出一種滲透測試與程序分析技術(shù)相結(jié)合的方法來定位程序中存在的SQL注入漏洞。其中滲透測試部分通過模擬攻擊找出可能的SQL注入點,程序分析部分對源程序代碼進行分析,通過對污染變量的標記跟蹤來實現(xiàn)SQL注入點的定位。實驗結(jié)果表明,所提出的方法在定位時間、漏洞檢測效果有較好表現(xiàn)。
關(guān)鍵詞SQL注入滲透測試程序分析漏洞定位
A POSITIONING AND DETECTION TECHNOLOGY FOR SQL INJECTION VULNERABILITY
Zhang YingyingLing Jie
(Faculty of Computer,Guangdong University of Technology,Guangzhou 510006,Guangdong,China)
AbstractSQL injection is a common means of attacking Web programs. Traditional detection tools for SQL injection vulnerability are difficult to meet the growing amount of program code in terms of positioning efficiency and detection range. In response to this situation, we proposed a method to locate the SQL injection vulnerabilities existed in programs, which combines the techniques of penetration testing and program analysis, after analysing the characteristics of SQL injection vulnerabilities. In the method, the penetration testing identifies the possible SQL injection points by simulating the attacks, and the program analysis parses the source codes. This method achieves the localisation of SQL injection points by marking and tracking the polluted variables. Experimental results showed that the proposed method had better performance in positioning time and vulnerability detection effect.
KeywordsSQL injectionPenetration testingProgram analysisVulnerability positioning
0引言
隨著互聯(lián)網(wǎng)迅猛發(fā)展,越來越多的Web應(yīng)用都采取了三級架構(gòu):數(shù)據(jù)庫服務(wù)器、應(yīng)用服務(wù)器和客戶端。用戶在客戶端輸入數(shù)據(jù),應(yīng)用服務(wù)器根據(jù)其輸入構(gòu)建SQL語句,并將SQL語句送至數(shù)據(jù)庫中執(zhí)行操作,最終將結(jié)果返回給用戶。由于數(shù)據(jù)庫中存儲著大量敏感信息,導致其頻繁遭到攻擊,其中最嚴重的就是SQL注入攻擊[1]。SQL注入攻擊是指攻擊者在合法SQL語句中插入SQL關(guān)鍵字或操作符從而改變SQL語句的語義、語法結(jié)構(gòu),將這些惡意的SQL語句提交給數(shù)據(jù)庫,獲取用戶名密碼等敏感信息,進而獲取主機控制權(quán)限等[2]。OWASP于2013年發(fā)布的十大Web應(yīng)用安全漏洞中,SQL注入攻擊排名第一。
針對SQL注入漏洞的檢測定位,很多學者進行了研究。文獻[3]提出了一種基于證明樹反演的漏洞定位方法。從數(shù)據(jù)庫查詢語句開始,反向跟蹤組成查詢語句的變量,檢查其是否接受外界輸入,來進行漏洞定位。該方法要分析所有的SQL語句并回溯其變量來源,時間復雜度較高。文獻[4]提出的方法是從語句的結(jié)構(gòu)分析SQL注入攻擊行為,通過比較模式字符串和目標字符串的結(jié)構(gòu)和類型來判斷是否發(fā)生SQL注入攻擊。該方法需要對每一個SQL語句調(diào)用驗證函數(shù),對源程序修改較大。文獻[5]提出一種在運行時檢測SQL注入漏洞的方法,運用基本路徑法和數(shù)據(jù)流測試技術(shù)來找到用戶輸入變量的所有合法執(zhí)行路徑,運行時檢測用戶輸入變量的執(zhí)行路徑,比較它們是否與之前獲得的合法路徑相符。若不相符,說明用戶輸入變量包含有惡意輸入,但該方法只能檢測基于關(guān)聯(lián)查詢的SQL注入漏洞。
本文提出一種利用滲透測試與程序分析技術(shù)相結(jié)合的方法來實現(xiàn)對SQL注入漏洞的定位。滲透測試階段輸入網(wǎng)站地址,通過模擬攻擊確定引起SQL注入的用戶輸入點,程序分析階段根據(jù)滲透測試階段的結(jié)果,在Web應(yīng)用系統(tǒng)源代碼中通過數(shù)據(jù)流跟蹤技術(shù)對漏洞產(chǎn)生過程進行跟蹤和分析。經(jīng)過實驗驗證,該方法效率較高,誤報率較低。
1SQL注入漏洞特征及檢測工具分析
1.1SQL注入漏洞特征分析
SQL注入漏洞[6]之所以產(chǎn)生是因為程序接收到用戶輸入時沒有對其進行驗證處理,某些用戶輸入會引發(fā)安全問題,被定義為“污染值”。若污染值由注入點經(jīng)污染傳播到達陷入點,則會引發(fā)SQL注入攻擊。以Java應(yīng)用程序為例,注入點、傳播過程和陷入點描述如下:
(1) 注入點:Java程序中處理數(shù)據(jù)輸入的操作,常見的有g(shù)et Parameter()、get Parameter Values()、get Query String()等。
(2) 傳播過程:Java程序中的變量賦值、引用賦值等操作,例如String.to String()、String.concat(String)、String Buffer.to String()等。
(3) 陷入點:在Java程序中,陷入點主要是向數(shù)據(jù)庫提交SQL查詢語句的函數(shù)。常見的陷入點有Statement.execute Query(String)、Statement.add Batch(String)、Statement.execute(String,…)等。
1.2SQL注入漏洞的檢測方法及工具
滲透測試[7]是指為了發(fā)現(xiàn)應(yīng)用程序中潛在的漏洞,從一個攻擊者的角度對應(yīng)用程序進行安全審核。滲透測試可以簡單快速地檢測出應(yīng)用程序中存在的SQL注入漏洞。但無法得到漏洞產(chǎn)生的具體原因。目前大多數(shù)漏洞掃描工具都基于此策略,如WebInspect、AppScan、Paros Proxy等。程序分析[8,9]即對源代碼進行分析,尋找可能出現(xiàn)漏洞的檢測點并進行驗證。源代碼分析工具有YASCA、LAPSE+、Pixy、AppCodeScan、Fortify等,可在源代碼中找出漏洞產(chǎn)生的過程,但耗時較長。針對滲透測試和程序分析技術(shù)的優(yōu)缺點的互補性,提出了一種聚合滲透測試和程序分析技術(shù)的SQL注入漏洞定位方法。
2SQL注入漏洞定位檢測方法
本文提出的SQL注入漏洞定位檢測方法主要包括模擬攻擊、標識模塊、代碼插樁、數(shù)據(jù)流跟蹤等部分,如圖1所示。
圖1 SQL注入漏洞定位檢測方法示意圖
2.1滲透測試過程
滲透測試過程主要由信息獲取模塊、攻擊字符串庫和模擬攻擊模塊組成。信息獲取模塊檢測URL可訪性并獲取網(wǎng)頁源代碼。在網(wǎng)頁中尋找如用戶登陸等方面的可能注入點,依次從攻擊字符串庫調(diào)用攻擊字符串對網(wǎng)站實施模擬攻擊,根據(jù)服務(wù)器端返回頁面檢測結(jié)果判斷是否攻擊成功,若成功則表示存在SQL注入漏洞,將網(wǎng)站位置及可能注入點保存,以便程序分析階段時使用。
2.2程序分析過程
程序分析過程主要由源代碼載入器、標識模塊、代碼插樁器等組成。源代碼載入器根據(jù)滲透測試的結(jié)果載入存在SQL注入漏洞的頁面源代碼,為后來的漏洞定位做準備;標識模塊標識污染變量,運用數(shù)據(jù)流跟蹤技術(shù)跟蹤污染變量在程序中的傳播,若最終組成SQL查詢語句的變量中有來自用戶輸入的數(shù)據(jù),則斷定該變量為SQL注入點,給出該變量輸入點的位置及其傳播路徑。代碼插樁器在程序中插入信息以監(jiān)測程序的動態(tài)運行,本文中的插樁用于得到污染變量的傳播路徑。
3本文方法的實現(xiàn)
3.1攻擊字符串庫設(shè)計
攻擊字符串庫是滲透測試的關(guān)鍵部分,用庫中的測試字符串來構(gòu)造畸形URL或表單,向目標Web應(yīng)用程序發(fā)送HTTP請求,查看服務(wù)器的響應(yīng)是否與漏洞的響應(yīng)特點一致,來判斷SQL注入漏洞是否存在。結(jié)合SQL語句原型和語法結(jié)構(gòu),針對數(shù)字和字符串類型的注入漏洞,本文設(shè)計了表1所示的測試字符串,其中前5個是基本的測試字符串,這些字符串可以經(jīng)過大小寫混寫法、Unicode法、ASCII碼、重言式等得出變種。在此僅列出測試字符串4對應(yīng)的變種,即測試字符串6到9??梢愿采w典型的SQL注入攻擊。
表1 測試字符串
3.2標識模塊
Web應(yīng)用程序中有許多數(shù)據(jù)庫查詢語句,只有包含了用戶輸入數(shù)據(jù)的查詢語句才會引發(fā)SQL注入漏洞,所以僅需要標記用戶輸入變量。本文提出的方法中,只需標記滲透測試階段檢測出的引發(fā)SQL注入漏洞的用戶輸入變量,縮減了標識的工作量,然后通過數(shù)據(jù)流跟蹤查看該輸入是否是SQL語句的組成部分。
3.3數(shù)據(jù)流跟蹤
變量污染格[10]描述變量是否可能攜帶具有惡意或攻擊性的值,它有兩個值:污染和非污染。運用數(shù)據(jù)流跟蹤技術(shù)[11]跟蹤這種屬性在程序中的傳播過程。
在本文提出的方法中,將污染數(shù)據(jù)存儲在鏈表中。定義兩個鏈表, TaintedLink和CurrentTaint定義如下:
TaintedLink:=(Node | Node:=
CurrentTaint:= (Object | Object:=
這兩個鏈表在程序運行中動態(tài)生成。其中TaintedLink記錄污染數(shù)據(jù)成為污染變量的位置(TaintedAddress),變量值(Value),污染字段(Tainted),傳播污染屬性給它的污染變量(ParentTaint),成為污染變量的操作語句(Operation);而CurrentTaint是程序中當前的污染數(shù)據(jù)的集合,該集合隨程序的運行而變化。如果其中的污染數(shù)據(jù)被正常數(shù)據(jù)取代,立即將它們從該鏈表結(jié)構(gòu)中移除。通過遍歷TaintedLink鏈表,可以得到污染變量從注入點到達陷入點的傳播路徑。
數(shù)據(jù)流跟蹤的過程如下:首先將滲透測試階段得到的結(jié)果,即可能引起SQL注入的污染變量放入TaintedLink的頭結(jié)點,然后對整個程序源代碼進行掃描,根據(jù)污染傳播算法,識別每個語句是否會造成污染屬性的傳播,并提取操作數(shù),污染傳播算法偽代碼描述如下:
Input:JavaCode{
if (JavaCode==0)
exit;
foreach (Ci in JavaCode){
//遍歷每條源碼
switch typeof(Ci);
case: =
//等號賦值語句
E1=LeftOperand(Ci);
E2=RightOperand(Ci);
Taint(E2→E1);
//污染傳播
case: String/Array/Object
//強制類型轉(zhuǎn)換
E1=LeftOperand(Ci);
E2=RightOperand(Ci);
Taint(E2→E1);
case: +/|/&/^
//字符串連接、邏輯運算
E1=LeftOperand(Ci);
E2=RightOperand1(Ci);
E3=RightOperand2(Ci);
Taint(E2‖E3)→Taint(E1);
//E2,E3有一個為污染,則E1為污染
}
}
3.4程序插樁
程序插樁[12]是為了收集程序的運行時特征數(shù)據(jù),在被測程序的特定部位插入一段檢測程序(探針),但不破壞被測程序的原有邏輯完整性。本文中插入的探針是為了記錄變量傳播的路徑,在檢測到變量為引發(fā)SQL注入漏洞的注入點時,拋出其最先接受輸入的位置以及其在程序中的傳播路徑,方便日后對漏洞的修復。如果對于一個語句,既是污染傳播語句,操作數(shù)中又有污染變量,則在該語句之后插入語句,調(diào)用函數(shù)AddTaintedLink()。該函數(shù)實現(xiàn)了添加TaintedLink的功能,其污染鏈表生成算法偽代碼描述如下:
Input:E2→E1
{
if ((E1==0)‖(E2==0))
exit;
if (E2 in TaintedObject){
//E2是污染對象
E1.ParentTaint = E2;
//E1與E2相連
TaintedLink.add(E1);
//添加E1到污染鏈表
TaintedObject = TaintedObject∪E1;
}
//添加E1到當前污染對象集合
else if (E1 in TaintedObject) {
//E2是非污染對象
E1.TaintedType = 0;
//E1被清洗,變?yōu)榉俏廴?/p>
TaintedObject = TaintedObject-E1;
}
//將E1從當前污染對象集合中清除
}
污染傳播分析:根據(jù)生成的TaintedLink 和CurrentTaint鏈表來進行分析。若一個SQL語句中的參數(shù)有屬于CurrentTaint鏈表中的,則確定該SQL語句為SQL注入漏洞陷入點。算法的偽代碼描述如下:
Check SQL_Query_Statement(arg1…argn);
if (arg1 in CurrentTaint ∪…∪ argn in CurrentTaint)
SQL_Query_Statement is sink;
通過遍歷TaintedLink鏈表,可得到該污染參數(shù)的來源及在程序中的傳播路徑,便于后續(xù)的修復。
4實驗結(jié)果及分析
為驗證本文提出方法的可行性,采用Eclipse集成開發(fā)環(huán)境對該方法進行Java編程實現(xiàn)SQLPOS工具,硬件平臺采用主流的IBM-PC兼容機,使用Apache Tomcat 6搭建Web服務(wù)器,數(shù)據(jù)庫為MySQL 5.1。下面從時間復雜度和定位效果兩方面評估SQLPOS,通過10個不同規(guī)模的應(yīng)用程序測試SQLPOS,表2列出各個應(yīng)用程序的名稱、代碼行數(shù)及注入點個數(shù)信息。
表2 測試應(yīng)用程序參數(shù)表
4.1時間復雜度
漏洞定位工具,以基于規(guī)則匹配的Fortify和FindBugs為代表,分別用Fortify、FindBugs和SQLPOS三種工具掃描表2的應(yīng)用程序,用每種工具對每個應(yīng)用程序獨立掃描20次,算出平均掃描時間,得到三者的漏洞定位時間對比,如圖2所示。觀察圖2可得對于規(guī)模較小的應(yīng)用程序,SQLPOS的時間優(yōu)勢并不明顯,隨著程序代碼行數(shù)的增多,SQLPOS所用的定位時間明顯少于其他兩個。原因是SQLPOS需要對程序進行模擬攻擊,需耗費時間,但其在程序分析部分只需標記跟蹤滲透測試階段得出的可能存在漏洞的注入點,而另外兩個工具要分析所有的注入點,所以源程序代碼行數(shù)越多,存在的注入點越多,SQLPOS時間優(yōu)勢越明顯。
圖2 應(yīng)用程序漏洞定位時間對比
4.2定位效果
定位效果主要從誤報率和漏報率兩個指標評價SQLPOS。分析用Fortify、FindBugs及SQLPOS對表2中應(yīng)用程序進行掃描的結(jié)果報告,通過人工驗證確定各個工具的誤報率及漏報率,結(jié)果如表3、表4所示。
表3 各個工具誤報率分析表
表4 各個工具漏報率分析表
由表3可以看出,對于同一個應(yīng)用程序,SQLPOS的誤報率要遠低于Fortify和FindBugs,這是因為SQLPOS在滲透測試階段對程序進行模擬攻擊得出可能存在漏洞的注入點,程序分析階段對該注入點進行跟蹤分析,查看其是否到達陷入點,這既是定位的過程,又是驗證的過程。
由表4可以看出,對于同一個應(yīng)用程序,SQLPOS的漏報率和Fortify、FindBugs基本持平。
運用滲透測試和程序分析技術(shù)相結(jié)合的方式,可以較好地對SQL注入漏洞進行定位。但是由于在程序分析階段對程序語義的理解、對別名信息的判斷,會無法對污染數(shù)據(jù)在動態(tài)執(zhí)行時所指向的對象做精準的判斷,從而會產(chǎn)生一定的誤報。同時,攻擊字符串庫也要隨著攻擊技術(shù)的發(fā)展而不斷完善,才能減少漏報。
5結(jié)語
本文提出一種SQL注入漏洞定位方法,先通過滲透測試運用模擬攻擊的方式來檢測Web程序中是否有SQL注入漏洞,再運用程序分析技術(shù)對源代碼進行分析,運用數(shù)據(jù)流跟蹤技術(shù)、插樁技術(shù)對污染變量的傳播進行跟蹤,最終給出污染變量在程序中的傳播路徑,便于開發(fā)維護人員進行漏洞的修補。對該方法進行了實驗驗證。本文的創(chuàng)新點在于提出了滲透測試與程序分析技術(shù)相結(jié)合的方法,解決了滲透測試無法分析源程序及純粹程序分析浪費時間的缺點,為SQL注入漏洞的定位檢測提供了一種新的思路。
參考文獻
[1] Kumar P,Pateriya R K.A survey on SQL injection attacks,detection and prevention techniques[C]//Computing Communication & Networking Technologies (ICCCNT),2012 Third International Conference on.IEEE,2012:1-5.
[2] 吳翰清.白帽子講Web安全[M].北京:電子工業(yè)出版社,2013:152-178.
[3] 王清,鄭慶華,管曉宏,等.一種基于證明樹反演的安全漏洞定位方法[J].西安交通大學學報,2007,41(4):439-443.
[4] 孫義,胡雨霽,黃皓.基于序列比對的SQL注入攻擊檢測方法[J].計算機應(yīng)用研究,2010,27(9):3525-3528.
[5] Dharam R,Shiva S G.Runtime Monitors to Detect and Prevent Union Query Based SQL Injection Attacks[C]//Information Technology:New Generations (ITNG),2013 Tenth International Conference on.IEEE,2013:357-362.
[6] Justin Clarke.SQL注入攻擊與防御[M].2版.清華大學出版社,2013:21-69.
[7] Antunes N,Vieira M.Penetration Testing in Web Services[J].IEEE Computer Society,2014,47(2):30-36.
[8] Shar L K,Tan H B K,Briand L C.Mining SQL injection and cross site scripting vulnerabilities using hybrid program analysis[C]//Proceedings of the 2013 International Conference on Software Engineering.IEEE Press,2013:642-651.
[9] 李小花,孫建華,陳浩.程序分析技術(shù)在SQL注入防御中的應(yīng)用研究[J].小型微型計算機系統(tǒng),2011,32(6):1089-1093.
[10] 林姍,鄭朝霞.基于格的數(shù)據(jù)流分析研究與應(yīng)用[J].武漢理工大學學報:信息與管理工程版,2012,33(6):932-935.
[11] 魏浩.基于Web數(shù)據(jù)流分析的用戶訪問行為核查技術(shù)研究[D].鄭州:解放軍信息工程大學密碼工程學院,2013.
[12] Halfond W G J,Orso A,Manolios P.WASP:Protecting Web applications using positive tainting and syntax-aware evaluation[J].Software Engineering,IEEE Transactions on,2008,34(1):65-81.
中圖分類號TP393.08
文獻標識碼A
DOI:10.3969/j.issn.1000-386x.2016.02.073
收稿日期:2014-05-15。廣東省自然科學基金重點項目(S201202 0011071);廣東省教育部產(chǎn)學研合作項目(2012B091000037)。張瑩瑩,碩士生,主研領(lǐng)域:網(wǎng)絡(luò)與信息安全技術(shù)。凌捷,教授。