【摘 要】目前,大多數(shù)Web應(yīng)用都使用SQL數(shù)據(jù)庫來存放應(yīng)用程序的數(shù)據(jù)。本文主要對SQL注入式攻擊原理和攻擊過程進(jìn)行了介紹,并給出了對應(yīng)的防范措施。
【關(guān)鍵詞】SQL注入式攻擊 WEB應(yīng)用 安全防護(hù)
據(jù)統(tǒng)計(jì),現(xiàn)有網(wǎng)站中至少有50%以上的站點(diǎn)面臨著SQL注入攻擊的風(fēng)險(xiǎn),惡意的用戶可以利用服務(wù)器、數(shù)據(jù)庫配置的疏漏和精心構(gòu)造的非法語句通過程序或腳本入侵服務(wù)器并獲得網(wǎng)站管理員的權(quán)限及相關(guān)數(shù)據(jù)庫的內(nèi)容,威脅到系統(tǒng)和用戶本身。
一、什么是SQL 注入式攻擊
SQL注入就是利用Web服務(wù)器及ASP腳本漏洞對服務(wù)器進(jìn)行入侵,其利用的是正常的服務(wù)端口,表面上看來和正常的Web訪問沒有區(qū)別,隱蔽性極強(qiáng),注入者從客戶端合法接口提交特殊的非法代碼,讓其注入到服務(wù)器端執(zhí)行業(yè)務(wù)的SQL中去,進(jìn)而改變SQL語句的原有邏輯和影響服務(wù)器端正常業(yè)務(wù)的處理。
二、SQL 注入式攻擊的手段
注入式攻擊的根源在于程序命令和用戶數(shù)據(jù)之間沒有做到?jīng)芪挤置鳌_@使得攻擊者有機(jī)會(huì)將程序命令當(dāng)作用戶輸入的數(shù)據(jù)提交給Web程序,以發(fā)號(hào)施令,為所欲為。下面介紹兩種SQL 注入式攻擊的手段。
(一)通過編譯SQL語句借助登陸頁面進(jìn)行注入。假設(shè)一個(gè)登陸頁面用來控制網(wǎng)站的入口,系統(tǒng)后臺(tái)存放人員信息的表格名稱為“usertable”,表格中存放用戶名和密碼的字段分別為“name”,“pswd”,正常進(jìn)行驗(yàn)證的SQL語句如下:
select * from usertable where name=’用戶名' and pswd='密碼'
執(zhí)行完這條SQL語句后,如果記錄數(shù)等于零說明在usertable表找不到用戶名和密碼對應(yīng)的記錄,應(yīng)該拒絕;如果記錄數(shù)大于零則說明能在usertable表中找到對應(yīng)的記錄,應(yīng)予放行。
如果用戶通過某種途徑知道或是猜測出了驗(yàn)證SQL語句的邏輯,他就有可能在表單中輸入特殊字符改變SQL原有的邏輯,比如在名稱文本框中輸入“'or'1'='1'or'1'='1”或是在密碼文本框中輸入“1'or'1'='1”,SQL語句將會(huì)變成:
select * from usertable where name=’’ or ‘1’=’1’ or ‘1’=’1’ and pswd=’’
select * from usertable where name=’’ and pswd=’1’ or ‘1’=’1’
很明顯,or和單引號(hào)的加入使得where后的條件始終是true,原有的驗(yàn)證完全無效了。如果在輸入?yún)?shù)中構(gòu)建的SQL語句包含新增、查詢、修改和刪除數(shù)據(jù)項(xiàng),將對網(wǎng)站系統(tǒng)造成難以彌補(bǔ)的損失。
(二)借助工具進(jìn)行注入式攻擊
借助工具軟件進(jìn)行SQL注入式攻擊一般包括如下幾步:
第一步:判斷Web環(huán)境是否可以SQL注入。如果URL僅是對網(wǎng)頁的訪問,不存在SQL注入問題,如果對數(shù)據(jù)庫進(jìn)行動(dòng)態(tài)查詢,就有可能存在SQL注入,如:http://192.168.1.9/user?id=39,其中?id=39表示數(shù)據(jù)庫查詢變量,這種語句會(huì)在數(shù)據(jù)庫中執(zhí)行,因此可能會(huì)給數(shù)據(jù)庫帶來威脅。
第二步:尋找SQL注入點(diǎn)。尋找可利用的注入漏洞,通過輸入一些特殊語句,可以根據(jù)瀏覽器返回信息,判斷數(shù)據(jù)庫類型,從而構(gòu)建數(shù)據(jù)庫查詢語句找到注入點(diǎn)。
第三步:猜解用戶名和密碼。通過構(gòu)建特殊數(shù)據(jù)庫語句在數(shù)據(jù)庫中依次查找表名、字段名、用戶名和密碼的長度,以及內(nèi)容。這個(gè)猜測過程可以通過大量注入工具快速實(shí)現(xiàn),并借助破解軟件破譯用戶密碼。
第四步:尋找WEB管理后臺(tái)入口。通常WEB后臺(tái)管理的界面不面向普通用戶開放,要尋找到后臺(tái)的登陸路徑,可以利用掃描工具快速搜索到可能的登陸地址,依次進(jìn)行嘗試,就可以試出管理臺(tái)的入口地址。
第五步:入侵和破壞。成功登陸后臺(tái)管理后,接下來就可以任意進(jìn)行破壞行為,如篡改網(wǎng)頁、上傳木馬、修改、泄漏用戶信息等,并進(jìn)一步入侵?jǐn)?shù)據(jù)庫服務(wù)器。
三、SQL 注入防范措施
由于SQL注入攻擊的原理相對簡單,要防止被SQL注入式攻擊闖入也并不是一件特別困難的事情,以下是常用的安全措施:
(一)參數(shù)化查詢。參數(shù)化查詢能夠確保攻擊者無法改變查詢的內(nèi)容,對于不同編程語言,有一些不同的建議:Java EE——使用帶綁定變量的PreparedStatement();.Net——使用帶綁定變量的諸如SqlCommand()或OleDbCommand()的參數(shù)化查詢;PHP——使用帶強(qiáng)類型的參數(shù)化查詢PDO(使用bindParam());Hibernate——使用帶綁定變量的createQuery()。
(二)存儲(chǔ)過程。存儲(chǔ)過程和參數(shù)化查詢的作用是一樣的,唯一的不同在于存儲(chǔ)過程是預(yù)先定義并存放在數(shù)據(jù)庫中,從而被應(yīng)用程序調(diào)用的。
(三)最小權(quán)限法。為了避免注入攻擊對數(shù)據(jù)庫造成的損害,我們可以把每個(gè)數(shù)據(jù)庫用戶的權(quán)限盡可能縮小,不要把DBA或管理員的權(quán)限賦予你應(yīng)用程序賬戶,在給用戶權(quán)限時(shí)是基于用戶需要什么樣的權(quán)限,而不是用戶不需要什么樣的權(quán)限。當(dāng)一個(gè)用戶只需要讀的權(quán)限時(shí),我們就只給他讀的權(quán)限,當(dāng)用戶只需要一張表的部分?jǐn)?shù)據(jù)時(shí),我們寧愿另建一個(gè)視圖讓他訪問。諸如此類的最小權(quán)限法能夠在很大程度上保證我們數(shù)據(jù)庫的安全。
(四)漏洞掃描法。采用專業(yè)的防火墻,并使用漏洞掃描工具,用于查找數(shù)據(jù)庫中的SQL注入式漏洞。憑借專業(yè)的工具,可以幫助管理員發(fā)現(xiàn)SQL注入式漏洞,并提醒管理員采取積極的措施來預(yù)防SQL注入式攻擊。如果能夠發(fā)現(xiàn)漏洞,并且管理員采取了積極的補(bǔ)漏措施,那么攻擊也就無從下手了。
四、結(jié)束語
由于SQL注入式攻擊是攻擊WEB應(yīng)用的常用手段,同時(shí)其防范措施也比較多,相信通過安全防護(hù)措施的不斷改進(jìn),可以最大限度的將SQL注入式攻擊限制在控制范圍之內(nèi),為基于WEB應(yīng)用的網(wǎng)站系統(tǒng)提供安全保障。
參考文獻(xiàn):
[1](美)克拉克著,黃曉磊、李化譯 《SQL注入攻擊與防御(第二版)》 2013
[2]王希忠,黃俊強(qiáng) 《Web應(yīng)用程序中SQL注入攻防策略的研究》 2011
[3]孫俊德,《SQL注入攻擊與防范技術(shù)》 2011