李建榮++何保榮++秦奕
摘 要:本文通過實(shí)例分析了SQL注入攻擊原理,根據(jù)本人平時(shí)的工作總結(jié),系統(tǒng)地闡述了如何防范SQL注入攻擊、SQL 注入攻擊檢測(cè)方法和SQL注入攻擊后的補(bǔ)救措施。希望對(duì)檔案管理網(wǎng)站開發(fā)人員和檔案管理網(wǎng)站管理人員有一定的啟發(fā),提高檔案管理網(wǎng)站的安全性。
關(guān)鍵詞:SQL;SQL注入;SQL注入攻擊;數(shù)據(jù)庫(kù);檔案管理網(wǎng)站
隨著計(jì)算機(jī)和網(wǎng)絡(luò)技術(shù)的日益發(fā)展,網(wǎng)絡(luò)化、數(shù)字化成為檔案管理發(fā)展的重要方向,檔案管理網(wǎng)站建設(shè)成為其中很重要的組成部分。在網(wǎng)站建設(shè)過程中,由于網(wǎng)站開發(fā)人員的能力和管理經(jīng)驗(yàn)參差不齊,部分網(wǎng)站開發(fā)人員在編寫代碼的時(shí)候,沒有對(duì)用戶輸入數(shù)據(jù)的合法性進(jìn)行嚴(yán)格判斷和過濾,使網(wǎng)站存在不同的安全隱患,容易遭受不同程度的SQL注入攻擊[1]。目前檔案管理網(wǎng)絡(luò)安全系統(tǒng)主要以防火墻為主,而防火墻只是對(duì)訪問對(duì)象進(jìn)行認(rèn)證,而對(duì)于網(wǎng)站本身存在的軟件問題,入侵者依然可以在遵守防火墻訪問規(guī)則的前提下實(shí)施攻擊,防火墻并不能有效解決SQL注入攻擊問題。所以研究檔案管理網(wǎng)站的SQL注入攻擊與防范措施是擺在檔案管理網(wǎng)站開發(fā)人員和網(wǎng)站管理人員面前的一個(gè)急需探討的重要課題。
1 SQL注入攻擊概述
1.1 SQL注入攻擊概念。SQL(Structured Query Language)是一種用來(lái)和數(shù)據(jù)庫(kù)交互的文本語(yǔ)言,我們也把它叫做結(jié)構(gòu)化查詢語(yǔ)言,使用它可以對(duì)數(shù)據(jù)庫(kù)進(jìn)行管理。
SQL注入,就是在客戶端通過把SQL命令插入到Web 表單遞交或頁(yè)面請(qǐng)求的查詢字符串,最終達(dá)到欺騙服務(wù)器執(zhí)行惡意的SQL命令,即通過遞交參數(shù)構(gòu)造巧妙的SQL語(yǔ)句,從而成功獲取想要的數(shù)據(jù)[2]。一旦SQL注入成功,就形成了SQL注入攻擊,輕則導(dǎo)致重要數(shù)據(jù)的泄露或篡改,重則導(dǎo)致整個(gè)服務(wù)器受他人控制,一旦服務(wù)器被掛木馬或者病毒,就會(huì)造成整個(gè)服務(wù)器癱瘓。
由于檔案管理網(wǎng)站要對(duì)大量數(shù)據(jù)進(jìn)行管理,因此離不開數(shù)據(jù)庫(kù),而目前常用的數(shù)據(jù)庫(kù)有Oracle、Sybase、DB2、MS SQL Server 等,這些數(shù)據(jù)庫(kù)均是基于SQL 語(yǔ)句的標(biāo)準(zhǔn)數(shù)據(jù)庫(kù),所以SQL注入攻擊具有廣泛性、技術(shù)難度不高、危害性大等特點(diǎn)。
1.2 SQL注入攻擊的原理。SQL注入攻擊原理就是利用某些數(shù)據(jù)庫(kù)的外部接口把用戶精心編寫的、具有特定含義的數(shù)據(jù)合理地插入到實(shí)際的數(shù)據(jù)庫(kù)操作語(yǔ)言當(dāng)中,從而達(dá)到入侵?jǐn)?shù)據(jù)庫(kù)的目的[3]。產(chǎn)生SQL注入攻擊的主要原因是程序?qū)τ脩糨斎氲臄?shù)據(jù)沒有進(jìn)行細(xì)致的過濾,導(dǎo)致非法數(shù)據(jù)的導(dǎo)入。
登錄在網(wǎng)站設(shè)計(jì)中是很重要的一個(gè)部分,下面以登錄驗(yàn)證中的模塊為例,來(lái)說(shuō)明SQL注入攻擊的具體實(shí)現(xiàn)方法。在Web應(yīng)用程序的登錄驗(yàn)證程序中,一般有用戶名(username)和密碼(password)兩個(gè)參數(shù),程序會(huì)通過用戶所提交輸入的用戶名和密碼來(lái)執(zhí)行相關(guān)的授權(quán)操作。其原理是通過查找user表中的用戶名(username)和密碼(password)的結(jié)果來(lái)進(jìn)行授權(quán)訪問,典型的SQL查詢語(yǔ)句為:
Select*from users where username=‘a(chǎn)dminand password=‘smith
如果分別給username和password賦值“‘a(chǎn)dmin or 1=1- - ”和“123”,那么,SQL腳本解釋器中的上述語(yǔ)句就會(huì)變?yōu)椋?/p>
select*from users where username=‘a(chǎn)dminor 1=1- - and password=‘123
該語(yǔ)句中“- -”表示注釋語(yǔ)句,即“- -”后面所有的內(nèi)容為注釋內(nèi)容,系統(tǒng)不再執(zhí)行。Where條件部分由邏輯或運(yùn)算連接的兩個(gè)判斷條件,只要一個(gè)條件成立,整個(gè)SQL語(yǔ)句就會(huì)成功執(zhí)行,而1=1在邏輯判斷上是恒成立的,所以在該SQL語(yǔ)句中,不管用戶名和密碼對(duì)不對(duì),該語(yǔ)句都可以正常執(zhí)行。至此,入侵者惡意構(gòu)造的SQL語(yǔ)句就得到了正確執(zhí)行,實(shí)現(xiàn)一次SQL注入攻擊。
同樣道理,如果程序沒有實(shí)施類型強(qiáng)制,通過在輸入數(shù)據(jù)時(shí)構(gòu)造SQL語(yǔ)句,還可以刪除數(shù)據(jù)庫(kù)中的數(shù)據(jù)表,造成大量數(shù)據(jù)丟失。例如:
Update subject Set score=? Where name=‘xiaoming
如果成績(jī)的值被惡意輸入為:99;Drop Table users#
這時(shí)該SQL語(yǔ)句就會(huì)變成下面的語(yǔ)句:
Update subject Set score=100;Drop Table users #where name=‘xiaoming
系統(tǒng)一旦執(zhí)行該語(yǔ)句,其中的SQL語(yǔ)句Drop Table users,就會(huì)將“users”表從數(shù)據(jù)庫(kù)中刪除。
2 如何防范SQL注入攻擊
SQL注入攻擊防范方法目前已經(jīng)有很多,總結(jié)起來(lái)有以下幾個(gè)方面:
2.1 加強(qiáng)對(duì)用戶輸入的驗(yàn)證。當(dāng)服務(wù)器接受用戶端提交的數(shù)據(jù)時(shí),要先對(duì)用戶端數(shù)據(jù)的合法性進(jìn)行嚴(yán)格檢查,使惡意數(shù)據(jù)不能直接被嵌入到SQL語(yǔ)句中。
使用恰當(dāng)?shù)尿?yàn)證對(duì)用戶端輸入的數(shù)據(jù)進(jìn)行檢查,最大限度地保證符合定義的標(biāo)準(zhǔn)過程,是否滿足預(yù)設(shè)定的類型、長(zhǎng)度或大小、數(shù)值范圍和格式等。在SQLServer數(shù)據(jù)庫(kù)中,有比較多的用戶輸入內(nèi)容驗(yàn)證工具,可以幫助管理員來(lái)對(duì)付SQL注入式攻擊。
利用存儲(chǔ)過程可以實(shí)現(xiàn)對(duì)用戶輸入變量的過濾,拒絕接受一些特殊的符號(hào),如上面例子惡意刪除數(shù)據(jù)表那段代碼中,只要存儲(chǔ)過程把那個(gè)分號(hào)過濾掉,這個(gè)惡意SQL代碼就沒法執(zhí)行了。所以可以直接把這些類似的特殊符號(hào)過濾掉,即使在SQL語(yǔ)句中嵌入了惡意代碼,也不容易形成SQL注入攻擊。
2.2 屏蔽系統(tǒng)出錯(cuò)信息。一般對(duì)數(shù)據(jù)庫(kù)操作出現(xiàn)錯(cuò)誤時(shí),系統(tǒng)會(huì)提示錯(cuò)誤提示信息。入侵者根據(jù)錯(cuò)誤提示很容易得到有關(guān)數(shù)據(jù)庫(kù)的相關(guān)信息,從而進(jìn)行惡意SQL注入攻擊。例如有以下錯(cuò)誤信息:
Microsoft OLEDBProviderforODBCDrivers(0x80040E07)[Microsoft][ODBC SQL Server Driver][SQL Server] 將nvarchar值“sonybb”轉(zhuǎn)換為數(shù)據(jù)類型為int時(shí)發(fā)生語(yǔ)法錯(cuò)誤。
根據(jù)這個(gè)出錯(cuò)信息,有點(diǎn)數(shù)據(jù)庫(kù)常識(shí)的人就可以獲得以下信息:該網(wǎng)站使用SQL server數(shù)據(jù)庫(kù),用ODBC 連接,連接賬號(hào)名為sonybb。獲得這些信息對(duì)入侵者下一步的SQL注入提供了重要數(shù)據(jù),方便他們惡意構(gòu)造SQL語(yǔ)句,順利實(shí)現(xiàn)SQL注入式攻擊。
2.3 SQL 語(yǔ)句參數(shù)化。SQL語(yǔ)句參數(shù)化是指用占位符或綁定變量來(lái)向SQL查詢提供參數(shù)的方法,是一種更加安全的動(dòng)態(tài)字符串構(gòu)造方法,而不是把用戶輸入的變量直接嵌入到SQL語(yǔ)句[4]。因?yàn)閰?shù)化查詢可以重用執(zhí)行計(jì)劃,SQL語(yǔ)句所要表達(dá)的語(yǔ)義不會(huì)改變,參數(shù)化方法可以杜絕大部分的SQL注入攻擊。然而,SQL語(yǔ)句參數(shù)化存在一定的缺點(diǎn),它只能參數(shù)化數(shù)值,不能參數(shù)化標(biāo)識(shí)符或關(guān)鍵字。
2.4 加強(qiáng)管理員登錄頁(yè)面所在路徑的強(qiáng)壯度。由于管理員具備對(duì)整個(gè)網(wǎng)站的管理權(quán)限,管理員一般通過后臺(tái)成功登錄后就可以對(duì)整個(gè)網(wǎng)站進(jìn)行管理。因此入侵者進(jìn)行SQL注入很重要的一步就是猜測(cè)管理員的后臺(tái)入口。一旦入侵者破解了管理員的后臺(tái)入口,就可以行使管理員的一切權(quán)力,對(duì)整個(gè)網(wǎng)站進(jìn)行掌控,很輕松地管理數(shù)據(jù)、修改數(shù)據(jù)、刪除數(shù)據(jù)。因此,要加強(qiáng)系統(tǒng)管理后臺(tái)登錄目錄的保密工作,不要把登錄頁(yè)面放在admin、login等常用目錄名下。
2.5 對(duì)重要數(shù)據(jù)信息采用非常規(guī)加密方法。目前在程序中對(duì)口令等重要信息加密都是采用md5 函數(shù)加密方法,即密文=md5(明文),此處推薦在原來(lái)md5 函數(shù)加密的基礎(chǔ)上再增加一些非常規(guī)的加密方法,即在md5加密的基礎(chǔ)上再附帶一些沒有規(guī)律的數(shù)據(jù),如密文md5(md5( 明文) +654321) ,最終增加重要數(shù)據(jù)的保密性。
2.6 限制管理員登錄方式。采取內(nèi)網(wǎng)認(rèn)證碼方式和設(shè)定專屬IP 登錄后臺(tái)系統(tǒng)措施,限制管理員登錄方式,即使入侵者進(jìn)行了 SQL注入攻擊,獲得了管理員的登錄方式,只要使用電腦的IP地址不對(duì),同樣也無(wú)法進(jìn)入后臺(tái)管理頁(yè)面。
3 SQL 注入攻擊檢測(cè)方法
一旦網(wǎng)站出現(xiàn)問題,需要網(wǎng)站管理人員經(jīng)常對(duì)網(wǎng)站的相關(guān)方面進(jìn)行查看,除了查毒殺毒以外,更重要的要觀察網(wǎng)站是否受到了SQL注入攻擊,然后才可以及時(shí)采取相應(yīng)的措施,使網(wǎng)站損失達(dá)到最小。網(wǎng)站遭受SQL注入攻擊,一般都會(huì)留下一定的“痕跡”。SQL注入攻擊檢測(cè)方法主要有數(shù)據(jù)庫(kù)檢查、IIS日志檢查和其他的一些相關(guān)信息判斷。
3.1 數(shù)據(jù)庫(kù)檢查。如果使用SQL注入攻擊軟件工具Domain、NBSI 和HDSI等進(jìn)行攻擊,一般都會(huì)在數(shù)據(jù)庫(kù)中生成一些臨時(shí)表。通過查看數(shù)據(jù)庫(kù)中新建表的結(jié)構(gòu)和內(nèi)容是否有異常,可以判斷是否曾經(jīng)發(fā)生過SQL注入攻擊。
3.2 IIS日志檢查。在Web服務(wù)器中如果啟用了日志記錄,則IIS日志會(huì)記錄訪問者的IP地址、訪問文件等信息,SQL注入攻擊往往會(huì)大量訪問某個(gè)存在SQL注入點(diǎn)的動(dòng)態(tài)網(wǎng)頁(yè),日志文件數(shù)量會(huì)急劇增加, 通過查看日志文件的大小以及日志文件中的內(nèi)容, 可以判斷是否發(fā)生過SQL注入攻擊。
3.3 其他相關(guān)信息判斷。SQL注入攻擊成功后,入侵者往往會(huì)添加用戶、開放相關(guān)的遠(yuǎn)程終端服務(wù)以及安裝木馬等,可以通過查看系統(tǒng)管理員賬號(hào)、遠(yuǎn)程終端服務(wù)器開啟情況、系統(tǒng)最近日期產(chǎn)生的一些文件等信息來(lái)判斷是否發(fā)生過入侵。
4 結(jié)束語(yǔ)
防范SQL注入攻擊是保證檔案管理網(wǎng)站安全的一個(gè)重點(diǎn)。本文通過實(shí)例分析SQL注入攻擊原理,根據(jù)本人平時(shí)的工作總結(jié),系統(tǒng)地闡述了如何防范SQL注入攻擊、SQL 注入攻擊檢測(cè)方法和SQL注入攻擊后的補(bǔ)救方法,希望對(duì)檔案管理網(wǎng)站開發(fā)人員和檔案管理網(wǎng)站管理人員有一定的啟發(fā)。由于SQL注入攻擊的種類繁多,靈活多變,很難用一種固定的方法全部解決SQL注入問題,如何更加有效地防范更高級(jí)別的SQL注入攻擊則是以后有待解決的問題。
參考文獻(xiàn):
[1]王云.Web 項(xiàng)目中的SQL 注入問題研究與防范方法[J].計(jì)算機(jī)工程與設(shè)計(jì),2010.
[2]彭賡.基于改進(jìn)網(wǎng)絡(luò)爬蟲技術(shù)的SQL 注入漏洞檢測(cè)[J].計(jì)算機(jī)應(yīng)用研究,2010.
[3]高洪濤. SQL注入攻擊途徑及策略分析[J]. 網(wǎng)絡(luò)安全技術(shù)與應(yīng)用,2011(3).
[4] Justin Clarke .SQL注入攻擊與防御[M] .北京:清華大學(xué)出版社,2010(6).
作者單位:李建榮,何保榮:河南牧業(yè)經(jīng)濟(jì)學(xué)院軟件學(xué)院;
秦奕:武漢音樂學(xué)院
來(lái)稿日期:2016-02-17