李嘯,胡勇
(四川大學(xué)電子信息學(xué)院,成都610065)
基于sqlmap的被動SQL注入掃描技術(shù)研究與實現(xiàn)
李嘯,胡勇
(四川大學(xué)電子信息學(xué)院,成都610065)
在分析被動式SQL注入掃描的特點及優(yōu)勢的基礎(chǔ)上,設(shè)計一種基于sqlmap實現(xiàn)的代理服務(wù)器式被動掃描方案。該方案能夠捕獲用戶瀏覽器發(fā)出的正常請求數(shù)據(jù)包,并自動對用戶提交的參數(shù)進行注入檢測。方案除了能夠掃描用戶請求中GET、POST、COOKIE方式顯性傳輸?shù)膮?shù)之外,還能夠提取用戶數(shù)據(jù)包中的JSON、XML、偽靜態(tài)URL中的隱性參數(shù)進行提取并檢測,能夠完成更深度的注入掃描。
SQL注入;sqlmap;被動掃描
隨著Web程序的廣泛應(yīng)用,Web安全需求變得日趨增大。在Web十大安全威脅中,SQL注入威脅依然占有非常高的地位[1]。通常SQL注入的掃描有兩種方式,分為主動掃描[2]和被動掃描[3]。主動掃描通常利用爬蟲程序爬取網(wǎng)站的每個頁面,之后調(diào)用掃描程序?qū)γ總€頁面提交的參數(shù)進行SQL注入掃描,主流的掃描工具有AWVS、IBM的AppScan等。這種掃描方法優(yōu)點是快速,缺點是難以應(yīng)對目前復(fù)雜的客戶端與服務(wù)器交互的環(huán)境,即掃描覆蓋面窄,許多掃描工作仍然需要在掃描過后由人工手動掃描驗證,特別是在掃描目標數(shù)量多的情況下,人員的工作量非常巨大。被動掃描的方式通常利用代理服務(wù)器監(jiān)聽客戶端請求,解析客戶端發(fā)送的請求數(shù)據(jù)包的結(jié)構(gòu),對數(shù)據(jù)包中的參數(shù)自動進行SQL注入掃描,實現(xiàn)這種類型掃描的工具主要有Gourdscan、SQLi-Hunter、burpsuite的sqli插件等[4]。這種方法優(yōu)點是能夠使得客戶端瀏覽網(wǎng)頁和掃描能夠同時進行,及時捕獲客戶端請求,免去了測試人員重復(fù)提交數(shù)據(jù)包檢測的環(huán)節(jié),減少了人員工作量。本文利用代理服務(wù)器和sqlmap實現(xiàn)了SQL注入的被動掃描,不但能夠針對常規(guī)的GET,POST,COOKIE,和http-header這類參數(shù)的SQL注入掃描,還能夠識別并提取客戶端提交的數(shù)據(jù)包中的JSON,XML,偽靜態(tài)URL,對此類數(shù)據(jù)進行深度掃描。
SQL語言是 Access、MySQL、SQL Server、Oracle、IBM-DB2等數(shù)據(jù)庫的操作語言。通過構(gòu)造SQL語句能夠?qū)?shù)據(jù)庫進行查詢、插入、刪除、修改等操作,對于權(quán)限大的數(shù)據(jù)庫,SQL語句還能夠用來執(zhí)行系統(tǒng)命令。在例如asp、php、aspx、jsp等編寫的網(wǎng)頁程序中,通常會將用戶提交的參數(shù)與SQL語句結(jié)合實現(xiàn)對數(shù)據(jù)庫的操作,并將結(jié)果呈現(xiàn)給當前操作的用戶。這在方便用戶的同時,也造成了潛在的安全風(fēng)險。以php語言處理為例,假設(shè)有如下代碼完成一個后臺管理員的登錄驗證過程:
$username=$_POST[‘username'];
$password=$_POST[‘password'];
$sql=”select*from admin where username='”.$username.”'and password='”.$password.”'”;
$con->exec($sql);
上述代碼可以看到,程序接收了用戶以POST方式提交給服務(wù)器的參數(shù)“username”和“password”,程序未驗證字符串的合法性便直接把它們的值代入SQL語句中處理。假如傳入的“username”的值為“admin'or‘1' ='1'/*”,“password”任意提交,那么代入$sql字符串變量后,$sql變成了 “select*from admin where username='admin'or‘1'='1'/*and password=任意”。“/*”是SQL語句的注釋符號,相當于數(shù)據(jù)庫執(zhí)行了“select *from admin where username='admin'or‘1'='1'”操作,導(dǎo)致where后的語句為真,整條語句查詢到了結(jié)果,繞過了用戶名和口令正確性驗證。
由上述例子我們可以總結(jié)出,SQL注入是由于程序?qū)τ脩籼峤粎?shù)進行嚴格過濾,從而直接將惡意參數(shù)代入到SQL語句中,執(zhí)行惡意查詢的過程。
SQL注入按照參數(shù)提交方式可以分為GET注入、POST注入、COOKIE注入、http-header注入四種形式。當前主流的SQL注入測試工具為sqlmap[5],該工具不僅能夠?qū)崿F(xiàn)對上述四種注入方式的常規(guī)參數(shù)掃描檢測,而且能夠?qū)TTP數(shù)據(jù)包中用戶自定義標記的檢測點提交SQL注入掃描,工具漏報率和誤報率都非常低。下文將描述基于sqlmap的代理掃描工具設(shè)計。
基于sqlmap被動掃描首先應(yīng)了解sql注入被動掃描的流程。
相比于傳統(tǒng)的網(wǎng)頁爬取式的主動sql注入掃描過程,被動掃描的過程需要一個代理服務(wù)器被動監(jiān)聽用戶正常瀏覽網(wǎng)頁的數(shù)據(jù)包,通過修改數(shù)據(jù)包中的參數(shù)值并重放數(shù)據(jù)包的形式達到掃描sql注入漏洞的目的。總流程如圖1所示。
圖1基于sqlmap的被動掃描過程
圖1中客戶端請求的URI(統(tǒng)一資源標識符)為“/ a.php?id=1”,其中“id”為提交參數(shù)。代理服務(wù)器有兩個作用,一個是將客戶請求原封不動提交給網(wǎng)站服務(wù)器,將網(wǎng)站服務(wù)器返回的結(jié)果再反饋給客戶端,即完成正常的代理請求。另一個是將客戶請求的數(shù)據(jù)包提交給sqlmap服務(wù)器。sqlmap服務(wù)器收到代理服務(wù)器提交的數(shù)據(jù)包后,開始解析http數(shù)據(jù)包,并進行sql注入掃描。
在實際過程中,可以將瀏覽網(wǎng)頁客戶端、代理服務(wù)器、sqlmap服務(wù)器部署在同一臺主機上。
(1)sqlmap服務(wù)器
sqlmap服務(wù)器是指sqlmap自身可以通過監(jiān)聽端口,接受用戶HTTP訪問的形式建立服務(wù)器程序。sqlmap服務(wù)器專門供用戶調(diào)用自身提供的API[6],通過API來創(chuàng)建和執(zhí)行掃描任務(wù)。在sqlmap文件包中,存在sqlmapapi.py文件,只需執(zhí)行“sqlmap.py-s”即可創(chuàng)建sqlmap的API監(jiān)聽服務(wù),該服務(wù)監(jiān)聽端口是8775。這樣即搭建起了sqlmap服務(wù)器。通過HTTP的方式訪問sqlmap所在的服務(wù)器IP和端口,即可返回數(shù)據(jù)。sqlmap的API接收以下幾種指令,如表1所示。
表1 sqlmap API接收指令列表
如果在本機開啟了sqlmap服務(wù)器并需要開始一個新的任務(wù),則需要以HTTP方式請求“http://127.0.0.1:8775/task/new”,sqlmap服務(wù)器即創(chuàng)建了一個新的任務(wù),并返回一個任務(wù)ID給瀏覽器。其他操作也同上述操作類似。
(2)代理服務(wù)器
前文敘述了代理服務(wù)器主要有兩個作用,一是正常代理用戶請求,另一個是向sqlmap服務(wù)器提交用戶請求的HTTP數(shù)據(jù)包。然而,在完成這兩項功能的同時,代理服務(wù)器還需要實時向用戶提供可視化的操作界面,用來查看掃描進度,提前結(jié)束掃描過程等。因此,綜合三項功能的代理服務(wù)器功能結(jié)構(gòu)示意圖如圖2所示。
圖2代理服務(wù)器功能結(jié)構(gòu)圖
圖2中代理服務(wù)器有三個模塊。接收數(shù)據(jù)/轉(zhuǎn)發(fā)模塊、與sqlmap API交互模塊、可視化界面模塊。
①接收數(shù)據(jù)/轉(zhuǎn)發(fā)模塊
接收數(shù)據(jù)/轉(zhuǎn)發(fā)模塊首先要接收用戶向網(wǎng)頁服務(wù)器提交的數(shù)據(jù),然后提取HTTP請求部分的數(shù)據(jù)。之后分成兩個部分,一是作為中繼代理,繼續(xù)向服務(wù)器做出請求。二是將解析的HTTP請求數(shù)據(jù)提交給sqlmap API模塊。
②與sqlmap API交互模塊
該模塊負責(zé)接收轉(zhuǎn)發(fā)模塊提交的數(shù)據(jù)包,同時可以接收用戶指令,并向sqlmap的API發(fā)送任務(wù)指令和用戶瀏覽器請求數(shù)據(jù)包,實時操作sqlmap的掃描。在向API發(fā)送用戶瀏覽器請求數(shù)據(jù)包時,需要搞清用戶用戶數(shù)據(jù)包中的參數(shù)是以哪種方式提交的,從而判斷sqlmap是否能夠直接掃描。
●GET方式提交
GET型http請求數(shù)據(jù)包一般形式如下
GET/index.php?id=1 HTTP 1.1
user-agent:mozillia(Internet Explorer 8)
……
這種形式。這種方式傳入的參數(shù)為“?”之后的字符串,本例中為“id”。這種格式的數(shù)據(jù)包可整個發(fā)送給API,sqlmap能夠自動識別其中參數(shù)并掃描。
一個是肥料生產(chǎn)企業(yè),積極擁抱互聯(lián)網(wǎng)和終端市場;一個是互聯(lián)網(wǎng)服務(wù)平臺,積極與廠家、農(nóng)民實現(xiàn)上下游的銜接和對農(nóng)民的技術(shù)指導(dǎo)與服務(wù),使得產(chǎn)品、技術(shù)、服務(wù)進行有效結(jié)合,形成合力。這種合作模式,在我國當下的農(nóng)村市場中極具生命力和活力。正如高祥照所言:“服務(wù)是農(nóng)資行業(yè)永恒的主題。只不過隨著農(nóng)業(yè)新形勢的發(fā)展,服務(wù)的內(nèi)容和方式在發(fā)生變化。重新構(gòu)架服務(wù)模式需要整個行業(yè)付出實踐和努力?!?/p>
●COOKIE方式提交
用戶瀏覽器客戶端發(fā)出的請求通常會帶有COOKIE。在HTTP數(shù)據(jù)包中的格式通常如下。
GET/index.php HTTP1.1
……
cookie:a=1&b=2
上例中COOKIE包含了兩個參數(shù)——“a”和“b”。這種數(shù)據(jù)包整個傳遞給API,sqlmap也可以自動掃描COOKIE中的參數(shù)。
●POST方式提交
POST數(shù)據(jù)通常是用戶填寫表單等操作提交的數(shù)據(jù)。鑒于POST提交的復(fù)雜性,可分為三種,一般形式,JSON(一種輕量級的數(shù)據(jù)交換格式)形式,XML形式。一般的HTTP數(shù)據(jù)包的POST數(shù)據(jù)格式如下。
……
a=1&b=2
上例中POST數(shù)據(jù)有“a”和“b”兩個參數(shù)及其數(shù)值。這種數(shù)據(jù)包直接提交給API自動掃描。
下面的例子是一個POST方式傳遞JSON的案例。
POST/index.php
……
j=[{b:1,c:2}]
本例中,POST數(shù)據(jù)包提交了參數(shù)“j”,但是j的值卻是一個JSON格式的字符串。參數(shù)j傳入服務(wù)器之后,服務(wù)器對j的值(JSON)解析,就解析出兩個參數(shù),b=1,c=2,再對b,c兩個參數(shù)進行處理,跟原來的參數(shù)j并沒有太大關(guān)系。這種JSON格式的數(shù)據(jù)包直接傳入API之后,sqlmap并不會對JSON進行解析和掃描,而是只掃描參數(shù)j的值,不能達到檢測效果。因此,API交互模塊需要對JSON數(shù)據(jù)進行解析,并對解析后的參數(shù)值做sqlmap能夠識別的監(jiān)測點標記,標記后重新組成JSON數(shù)據(jù),將標記過的數(shù)據(jù)包提交給sqlmap的API。
同樣的,POST數(shù)據(jù)類型中含有XML格式的,也須將XMLl解析,將參數(shù)值做出標記后,然后將標記過的數(shù)據(jù)包傳遞給API。
在有些情況下,服務(wù)器會使用偽靜態(tài)URL。例如某URL為“http://xxx.com/1-1.html”,看似是請求了html文件,但是服務(wù)器后臺程序很可能將URL中的字符串“1-1”取出,作為參數(shù)傳入SQL查詢語句中。因此,需要利用正則表達式對URL中特定位置的字符串做出標記,提交API進行掃描檢測。
③可視化界面
可視化界面利用HTML和JavaScript實現(xiàn),后臺調(diào)用php和MySQL程序處理用戶操作。用戶能夠看到界面中直觀的掃描數(shù)據(jù),并向sqlmap API交互模塊提交用戶的操作指令。
(3)用戶瀏覽網(wǎng)頁
用戶瀏覽器通??梢栽O(shè)置代理服務(wù)器。用戶瀏覽器將代理服務(wù)器設(shè)置為圖1中的代理服務(wù)器的IP地址和端口,即可與代理服務(wù)器進行連接。連接之后只要用戶正常瀏覽網(wǎng)頁中的各類頁面,系統(tǒng)隨即利用sqlmap對用戶瀏覽提交的數(shù)據(jù)進行SQL注入掃描。
為了檢測本文實現(xiàn)的工具的掃描效果,本文的掃描工具與常用的被動SQL注入掃描工具進行了對比,分別檢測了20個存在不同類型注入漏洞網(wǎng)站頁面,其中有5個GET注入漏洞,3個COOKIE注入漏洞,6個POST注入漏洞,3個JSON/XML注入漏洞,5個偽靜態(tài)URL注入漏洞。表2展示了本文設(shè)計的工具掃描結(jié)果和其他工具掃描結(jié)果對比。
表2 工具掃描結(jié)果對比
通過對比實驗發(fā)現(xiàn),文中的工具不但可以完整檢測出常規(guī)的GET、POST、COOKIE注入漏洞,而且可以彌補現(xiàn)有工具的缺陷,完成更深層次的SQL注入掃描。
隨著SQL注入掃描的難度不斷增加,注入點和注入方式變得更加隱秘,傳統(tǒng)的主動掃描工具愈加難以發(fā)現(xiàn)SQL注入漏洞,因此,需要更精確的SQL注入掃描工具完成自動化測試。本文基于sqlmap的API調(diào)用與代理服務(wù)器結(jié)合的方式實現(xiàn)了SQL注入被動掃描工具,能夠較好地檢測出Web頁面中的SQL注入漏洞。但是,檢測過程中依然有一部分漏報,可見用戶提交的數(shù)據(jù)包形式是復(fù)雜多樣的,加上服務(wù)器安全防御程序的干擾,使得SQL注入檢測環(huán)境非常復(fù)雜。因此,下一步工作是要廣泛搜集數(shù)據(jù)包樣本和WAF繞過策略,從而更廣泛地獲取用戶提交參數(shù)特征,做更深入的掃描。
[1]OWASP T.Top 10-2013[J].The Ten Most Critical Web Application Security Risks,2013.
[2]尹虹.Web應(yīng)用程序漏洞主動掃描器的研究與實現(xiàn)[D].國防科技大學(xué),2005.
[3]邪惡十六進制.關(guān)于被動式掃描的碎碎念[EB/OL].http://www.evil0x.com/posts/12728.html?utm_source=tuicool&utm_medium=referral.
[4]陸由乙.sqli-proxy代理式SQLi注入檢測腳本[EB/OL].http://www.secye.com/news/ruanjiangengxinzixun/8415.html.
[5]Qi,W.A.N.G.,B.A.I.Miao.Research about User the Tool of SqlMap GET Injection and Principle Analysising on Linux Platform,2013:022.
[6]owasp.Automated Audit using SQLMap[EB/OL].https://www.owasp.org/index.php/Automated_Audit_using_SQLMap.
SQL Injection;sqlmap;Passive Scan
Research and Implement of Passive Scan of SQL Injection Based on sqlmap
LI Xiao,HU Yong
(College of Electronic Information,Sichuan University,Chengdu 610065)
By analyzing the features and advantages of passive scan on SQL injection,puts forward a passive scan program,which based on sqlmap while using a proxy server.The program is able to catch the normal request data packet sent by user agent,extract parameters from those packets and automatically test against each parameter for SQL injection.Besides extracting and testing SQL injection against those parameters which are apparent in GET/POST/COOKIE strings,the program can also extract parameters which are not apparent in the packet such as JSON/XMO and rewrite URL and test against them,which can scan SQL injection more deeply than others.
1007-1423(2016)28-0038-05
10.3969/j.issn.1007-1423.2016.28.011
李嘯(1990-),男,甘肅白銀人,碩士,研究方向為信息安全胡勇(1973-),男,四川成都人,副教授,研究方向為信息安全
2016-08-09
2016-09-26