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