◆吳 斌 劉 循
(四川大學(xué)計算機學(xué)院 四川 610065)
SQL注入攻擊及漏洞檢測防范技術(shù)
◆吳 斌 劉 循
(四川大學(xué)計算機學(xué)院 四川 610065)
隨著Internet的快速普及和發(fā)展,Web技術(shù)得到了廣泛的應(yīng)用,基于Web技術(shù)的應(yīng)用系統(tǒng)覆蓋金融、保險、電子商務(wù)、出版?zhèn)髅降缺姸嘈袠I(yè)和領(lǐng)域,在促進社會生產(chǎn)力發(fā)展的同時提高了民眾的生活水平,但隨之而來的針對Web應(yīng)用程序的攻擊也越來越多。由于Web開發(fā)人員的安全意識欠缺、相關(guān)的技術(shù)管理人員安全防護技能較弱等原因,導(dǎo)致很多Web應(yīng)用程序存在漏洞且易被攻破,擾亂了社會經(jīng)濟秩序,威脅民眾財產(chǎn)安全和隱私安全。Web應(yīng)用程序的漏洞有很多種,SQL注入漏洞是其中較為常見的一種。SQL注入漏洞具有易發(fā)生、難防范、危害大的特點。本文以SQL注入漏洞為研究重點,在介紹SQL注入漏洞基本概念、攻擊原理和主要攻擊手段的基礎(chǔ)上,使用DVWA實驗系統(tǒng)搭建漏洞測試環(huán)境,然后用SQLMAP軟件進行漏洞測試、分析和研究,最后歸納防范SQL注入攻擊的主要技術(shù)手段和措施。
SQL注入; 漏洞; 檢測技術(shù); 防范
1.1 綜述
Web應(yīng)用程序具有易開發(fā)部署、易升級維護等特點,越來越受廣大開發(fā)者的青睞,越來越多的應(yīng)用系統(tǒng)使用B/S模式(即瀏覽器服務(wù)器模式)架構(gòu)。由于架構(gòu)、編碼、管理等方面存在安全問題,Web應(yīng)用程序存在多種漏洞,而目前幾乎所有的Web應(yīng)用程序都要用到數(shù)據(jù)庫系統(tǒng),且以關(guān)系數(shù)據(jù)庫為主,導(dǎo)致SQL漏洞成為Web應(yīng)用程序主要的漏洞種類?;ヂ?lián)網(wǎng)的開放性和無邊界性,經(jīng)濟利益的驅(qū)動以及人的好奇心、好勝心等因素,導(dǎo)致針對Web應(yīng)用程序的攻擊成高發(fā)態(tài)勢。由于SQL漏洞存在易發(fā)生、難防范、危害大的特點,SQL注入(SQL Injection)成為一種典型的攻擊方式。相當(dāng)數(shù)量的程序員在編寫代碼的時候,沒有充分考慮對用戶提交數(shù)據(jù)進行安全檢查,使應(yīng)用程序存在安全隱患。用戶可以精心構(gòu)造一串包含數(shù)據(jù)庫SQL語句的字符串作為參數(shù)提交,如果存在SQL漏洞,SQL語句就會被執(zhí)行,如果該SQL語句帶有攻擊性,則很容易導(dǎo)致Web應(yīng)用程序重要數(shù)據(jù)被非法獲取、篡改,甚至數(shù)據(jù)庫服務(wù)器被操控。SQL注入技術(shù)在國外最早出現(xiàn)在1999年,2002年后開始大量在我國出現(xiàn),微軟中國技術(shù)中心從兩個方面進行了描述2:
(1)腳本注入式的攻擊;
(2)惡意用戶輸入用來影響被執(zhí)行的SQL腳本。
1.2 研究意義
根據(jù)美國國家漏洞數(shù)據(jù)庫(NVD,National Vulnerability Da tabase)的統(tǒng)計2,2008年,SQL注入漏洞占全年所有漏洞總數(shù)的19.41%,2009年這個比例為16.85%。開放式Web應(yīng)用程序安全項目(OWASP,Open Web Application Security Project)的統(tǒng)計結(jié)果表明2,Web應(yīng)用十大安全漏洞中,SQL注入漏洞的比例約為18%,名列第二。
Web應(yīng)用程序應(yīng)用領(lǐng)域廣泛性、SQL注入漏洞的易發(fā)性、S QL注入攻擊的高發(fā)性、以及攻擊成功后導(dǎo)致后果的嚴(yán)重性,因此,在充分掌握SQL注入漏洞原理和檢測技術(shù)的基礎(chǔ)上,研究改進Web應(yīng)用程序安全策略,修補SQL注入漏洞,提升Web系統(tǒng)安全防護等級,有效防范SQL注入攻擊,保護網(wǎng)絡(luò)信息安全具有重要的現(xiàn)實意義。
SQL(Structured Query Language)即結(jié)構(gòu)化查詢語言,SQ L注入,就是把SQL命令插入到Web表單的輸入域名或頁面請求參數(shù)的查詢字符串中,向Web服務(wù)器提交GET或POST請求,如果服務(wù)器端未嚴(yán)格驗證參數(shù)的有效性和合法性,將導(dǎo)致數(shù)據(jù)庫服務(wù)器執(zhí)行惡意的SQL命令。我們訪問互聯(lián)網(wǎng)上的網(wǎng)站時,需要輸入URL,如果URL僅是對靜態(tài)網(wǎng)頁訪問,不存在SQL注入問題,如果是存在數(shù)據(jù)庫動態(tài)查詢請求的URL,就可能存在SQ L注入,如:http://www.***.cn/article.asp?id=32,其中id就是一個變量,最后提交給數(shù)據(jù)庫服務(wù)器的SQL查詢很可能如“selec t * from table_name where id = 32”形式。與網(wǎng)絡(luò)層面的攻擊不同,SQL注入攻擊利用的是Web應(yīng)用向外提供的服務(wù),跟正常訪問Web網(wǎng)站沒有區(qū)別,不會被絕大多數(shù)防火墻檢測到,具有很高的隱蔽性。如果管理員不檢查分析數(shù)據(jù)庫日志,很難發(fā)現(xiàn)S QL注入攻擊。
圖1所示的網(wǎng)頁提供一個功能,在User ID后面的文字輸入框中可以輸入數(shù)字,例如:“1”、“2”,點擊提交,輸入的數(shù)字就會提交到網(wǎng)頁后臺的響應(yīng)代碼處理。
圖1 SQL注入示例網(wǎng)頁頁面
圖2展示的是后臺用于處理提交的數(shù)字參數(shù)PHP代碼片段。
圖2 存在SQL注入漏洞的PHP代碼段
可以看出,提交的參數(shù)直接被賦值給變量$id,之后,變量$ id的內(nèi)容被直接連接到$query這個用于存儲SQL語句變量后面,之后$query變量作為參數(shù)直接傳給了PHP語言中標(biāo)準(zhǔn)的MySQL數(shù)據(jù)庫查詢函數(shù)。
假設(shè)此時傳入?yún)?shù)1,sql語句內(nèi)容為“SELECT first_name,last_name FROM users WHERE user_id = '1'”,不論數(shù)據(jù)庫中有沒有“user_id='1'”的記錄,這條語句的執(zhí)行顯然不會有任何問題。攻擊者如果提交的參數(shù)為“' and exists(select * from admin)--+”就可以測試數(shù)據(jù)庫中有沒有名為“admin”的表。
SQL注入攻擊的過程:
(1)判斷Web應(yīng)用是否可以進行SQL注入。
(2)尋找SQL注入點。
(3)猜解用戶名和密碼。
(4)尋找Web系統(tǒng)管理后臺入口。
(5)實施入侵和破壞。
3.1 DVWA平臺介紹
DVWA(Damn Vulnerable Web Application)是一個用來進行安全脆弱性鑒定的PHP/MySQL Web應(yīng)用,旨在為安全專業(yè)人員測試自己的專業(yè)技能和工具提供合法的環(huán)境,幫助web開發(fā)者更好的理解web應(yīng)用安全防范的過程。DVWA是RandomStorm的一個開源項目,項目開始于2008年12月。平臺提供帶有SQ L注入漏洞的網(wǎng)頁參數(shù)提交接口,供用戶進行SQL注入研究測試,可以設(shè)置高、中、低三個層次的危險等級。
3.2 安裝步驟
3.2.1 安裝WampServer2.2
WampServer2.2集成了Apache2.2.21,MySQL 5.5.20,PHP 5.3.10,PHPMyAdmin 3.4.10.1等系統(tǒng),安裝過程非常簡單,只需按照提示點擊“進一步”即可,安裝完畢后已經(jīng)幫用戶配置好了Apache服務(wù)器和PHP服務(wù)器。
3.2.2 安裝DVWA平臺
將DVWA平臺的PHP源碼全部復(fù)制到PHP服務(wù)器的www目錄下,在網(wǎng)頁瀏覽器中輸入網(wǎng)址打開平臺的首頁,安裝平臺提供的安裝向?qū)?,填寫MySQL數(shù)據(jù)庫系統(tǒng)管理員用戶名和密碼,安裝DVWA平臺運行所需的數(shù)據(jù)庫直至配置完成。DVWA首頁如圖3所示。
圖3 DVWA平臺首頁
4.1 sqlmap介紹
Sqlmap是一個自動化的SQL注入工具,其主要功能是掃描,發(fā)現(xiàn)并利用給定的URL的SQL注入漏洞,日前支持的數(shù)據(jù)庫是MS SQL Server,MySQL,oracle和postgresql。SQLMAP采用四種獨特的SQL注入技術(shù),分別是盲推理SQL注入,UNION查詢SQL注入,堆查詢和基于時間的SQL盲注入。其廣泛的功能和選項包括數(shù)據(jù)庫指紋,枚舉,數(shù)據(jù)庫提取,訪問目標(biāo)文件系統(tǒng),并在獲取完全操作權(quán)限時實行任意命令。
4.2 sqlmap的安裝和運行
sqlmap是用python語言開發(fā)的,使用sqlmap必須先安裝p ython語言環(huán)境。本文使用的是python2.7,安裝完python后,把sqlmap的目錄復(fù)制到python27這個文件夾下。在開始-〉運行處輸入“cmd”,打開命令控制臺,進入到python27文件夾下,輸入命令sqlmap.py就可以運行sqlmap。
4.3 sqlmap常用命令介紹
Target(目標(biāo)):至少需要設(shè)置其中一個選項,設(shè)置目標(biāo)URL。
-d DIRECT 直接連接到數(shù)據(jù)庫。
-u URL,--url=URL 目標(biāo)URL。
Request(請求):這些選項可以用來指定如何連接到目標(biāo)URL。
――data=DATA 通過POST發(fā)送的數(shù)據(jù)字符串。
――cookie=COOKIE HTTP Cookie頭。
Optimization(優(yōu)化):這些選項可用于優(yōu)化sqlmap的性能。
-o 開戶所有優(yōu)化開關(guān)。
--threads=THREADS 最大的HTTP(S)請求并發(fā)量(默認(rèn)為1)。
Injection(注入):這些選項可以用來指定測試哪些參數(shù)。
-p TESTPARAMETER 可測試的參數(shù)。
--prefix=PREFIX 注入payload字符串前綴。
4.4 用sqlmap對DVWA平臺進行攻擊測試
在DVWA平臺上選擇“DVWA Security”項,把安全等級設(shè)置為low,之后選擇SQL Injection選項,在這個網(wǎng)頁上的文本輸入框里輸入“1”點擊“submit”按鈕,在瀏覽器的地址欄可以看到,地址變?yōu)椤癶ttp://localhost/dvwa/vulnerabilities/sqli/?id=1&Submit=S ubmit#”,把這個地址記錄下來,作為sqlmap的一個參數(shù)。經(jīng)測試直接用“sqlmap.py -u “http://localhost/dvwa/vulnerabilities/sqli/?i d=1&Submit=Submit#” --current-db”命令是不可能注入成功的,因為DVWA平臺有訪問權(quán)限控制,在沒有登錄平臺的情況下,會跳轉(zhuǎn)到平臺登錄頁面。這里我們用Burpsuite軟件截獲正常登錄時的cookie內(nèi)容,把cookie的內(nèi)容作為sqlmap的參數(shù)之一。最終輸入的sqlmap命令如圖4所示,“--current-db”表示獲取攻擊目標(biāo)的數(shù)據(jù)庫名稱“--cookie”參數(shù)表示攻擊時以后續(xù)字符串作為cookie向攻擊目標(biāo)提交攻擊請求。
圖4 sqlmap測試DVWA平臺
這里,僅演示獲得DVWA數(shù)據(jù)庫名稱的攻擊,sqlmap攻擊效率很高,大約30秒左右(時間長短跟計算機軟硬件系統(tǒng)性能以及sqlmap優(yōu)化參數(shù)的情況有關(guān)),爆出數(shù)據(jù)庫名稱為“dvwa”,攻擊結(jié)果如圖5所示。
圖5 sqlmap攻擊DVWA獲得數(shù)據(jù)庫
5.1 SQL注入攻擊檢測方法
SQL注入攻擊檢測分為入侵前的檢測和入侵后的檢測。入侵前的檢測,可以通過人工方式,也可以使用SQL注入工具軟件。人工檢查Web漏洞耗時費力,卻成效甚微,專用的Web漏洞掃描工具很少,大多需要配置數(shù)據(jù)庫以存儲已知的Web漏洞信息且局限性較大。
5.1.1 數(shù)據(jù)庫檢查
某些注入攻擊軟件工具例如HDSI、NBSI等進行SQL注入攻擊后,會在數(shù)據(jù)庫中生成一些臨時表。通過查看數(shù)據(jù)庫中最近新建的表的結(jié)構(gòu)和內(nèi)容,可以判斷是否曾經(jīng)發(fā)生過SQL注入攻擊。
5.1.2 Web服務(wù)器日志檢查
如果Web服務(wù)器啟用了日志記錄,則日志會記錄訪問者的I P地址,訪問了哪些文件等信息,SQL注入攻擊往往會大量訪問某一個頁面文件(即存在SQL注入點的動態(tài)網(wǎng)頁)。
5.2 防范SQL注入攻擊的方法
5.2.1 對提交參數(shù)的合法性進行檢查
對提交參數(shù)進行檢查,可以簡單到將參數(shù)限制成某種類型,也可以復(fù)雜到使用正則表達式或業(yè)務(wù)邏輯來驗證輸入7。有兩種不同類型的輸入驗證方法,即白名單驗證和黑名單驗證,很多程序語言都提供相關(guān)用于驗證的函數(shù),可以方便地給程序員編碼時調(diào)用。例如對用戶提交的參數(shù)進行關(guān)鍵字過濾,常見的關(guān)鍵字有“select”、“update”、“or”、“and”、“--”等。
5.2.2 使用參數(shù)化方法進行數(shù)據(jù)庫查詢
參數(shù)化查詢(Parameterized Query 或 Parameterized Stateme nt)是訪問數(shù)據(jù)庫時,在需要填入數(shù)值或數(shù)據(jù)的地方,使用參數(shù)(Parameter)來給值。在使用參數(shù)化查詢的情況下,數(shù)據(jù)庫服務(wù)器不會將參數(shù)的內(nèi)容視為SQL指令的一部份來處理,而是在數(shù)據(jù)庫完成SQL指令的編譯后,才能套用參數(shù)運行,因此就算參數(shù)中含有指令,也不會被數(shù)據(jù)庫運行。
例如,下面的.NET代碼,使用SqlParameter()方法對用戶輸入的“userName”、“password”兩項數(shù)據(jù)進行參數(shù)過濾。
5.2.3 屏蔽出錯信息
Web應(yīng)用程序在提供給用戶使用的過程中,會有一些錯誤提示信息反饋給用戶。程序員在代碼編寫時,需要不斷地調(diào)試、測試,報錯信息是幫助程序員修改完善程序必不可少的內(nèi)容,如果這些調(diào)試信息在應(yīng)用程序?qū)ν獍l(fā)布后仍然保留,攻擊者就可以利用這些信息對Web應(yīng)用程序進行猜解爆破。例如,用戶登錄功能,用戶密碼輸入錯誤,應(yīng)用程序應(yīng)該反饋“用戶名或密碼錯誤”,而不應(yīng)該反饋“密碼錯誤”,否則,攻擊者就知道該用戶名存在,繼而采用固定用戶名,破解密碼的辦法來暴力破解網(wǎng)站。正確的做法是在調(diào)試Web應(yīng)用程序時,把環(huán)境置為DEBUG狀態(tài),正式上線以后,把環(huán)境恢復(fù)為正常狀態(tài)。
5.2.4 對重要敏感信息進行加密
盡管有各種防范SQL注入的技術(shù)手段,但隨著網(wǎng)絡(luò)攻擊技術(shù)的發(fā)展,Web應(yīng)用程序難免百密一疏。可以采取對數(shù)據(jù)庫重要字段進行加密保護或加混淆的方式對重要敏感數(shù)據(jù)進行保護,常見的加密算法有DES、AES、MD5等。的例如對用戶登錄密碼的md5加密,在編碼時,還可以構(gòu)造形如func(md5(pass)+3 21)的函數(shù),確保密碼的密文被攻擊者獲取后無法猜解出明文。
5.2.5 使用Web應(yīng)用防火墻
目前國內(nèi)知名的Web應(yīng)用防火墻(WAF)廠商有綠盟科技、啟明等公司。WAF是一種網(wǎng)絡(luò)設(shè)備或者是一種將安全特性添加到Web應(yīng)用的基于軟件的解決方案。它能夠?qū)TTP請求進行異常檢測,拒絕不符合HTTP標(biāo)準(zhǔn)的請求,可以增強輸入驗證能力,有效防止網(wǎng)頁篡改、信息泄露、木馬植入等惡意網(wǎng)絡(luò)入侵行為。
[1]陳小兵,張漢煜,駱力明,黃河.SQL注入攻擊及其防范檢測技術(shù)研究.計算機工程與應(yīng)用,2007.
[2]National Vulnerability Database.National vulnerability d atabase(NVD)CVE statistics[EB/OL].(2009-12).http://web.nvd.n ist.gov/view/vuln/statistics-results?cid=4.
[3]OWASP.Top 10 2007[EB/OL].(2009-11).http://www. owasp.org/index.php/Top_10_2007.
[4]Clarke J.SQL injection attacks and defense[M].Access Online via Elsevier,2012.
[5]張鑫,張婷,段新東.Web應(yīng)用SQL注入漏洞檢測工具的設(shè)計與實現(xiàn)[J].信息安全與技術(shù).Vol.57,8,2014.
[6]DVWA官方網(wǎng)站.www.randomstorm.com.
[7]百度百科SQL注入攻擊詞條.
[8]趙亭,陸余良.基于表單爬蟲的Web漏洞探測[J].計算機工程,2008.
[9]Justin Clarke等著,黃曉磊,李化譯.SQL注入攻擊與防御.北京:清華大學(xué)出版社,2010.
[10]隋亮,宋暉.基于滲透測試的SQL注入漏洞檢測與防范[D].東華大學(xué),2014.