袁廣智
摘要:目前許多基于B/S模式網(wǎng)絡(luò)服務(wù)構(gòu)架技術(shù)的應(yīng)用程序在設(shè)計(jì)與開發(fā)時(shí)沒有充分考慮到數(shù)據(jù)合法性校驗(yàn)問題,所以在其使用中存在著不少安全隱患。該文分析了SQL注入攻擊的特點(diǎn)、原理,并對常用注入方法進(jìn)行了總結(jié)。然后在主動(dòng)式防范模型的基礎(chǔ)上,提出了使用參數(shù)化查詢、實(shí)施過濾和監(jiān)視工具、精心編制錯(cuò)誤消息、及時(shí)打補(bǔ)丁并強(qiáng)化數(shù)據(jù)和限制數(shù)據(jù)庫的特權(quán)等幾種思路和方法。
關(guān)鍵詞:SQL注入;數(shù)據(jù)庫安全;網(wǎng)絡(luò)安全
中圖分類號:TP391 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2014)35-8400-02
SQL Injection Problem Research and Prevention Method
YUAN Guang-zhi
(The People's Bank of China, Zhoukou Central Sub Branch, Zhoukou 466000,China)
Abstract: At present, many applications of B/S mode network service architecture based on Technology in the design and development were not fully considered data verify the legitimacy of the problem, so a lot of hidden security problems in the use of. This paper analyzes the principle and characteristics of SQL injection attacks, and the commonly used injection methods were summarized. Then based on the active prevention model, proposed to use parameterized queries, implementation of filtering and monitoring tools, elaborate the error message, timely patching and strengthening data and limited database privileges and so on several ideas and methods.
Key words: SQL injection; database security; network security
網(wǎng)絡(luò)安全[1]是現(xiàn)階段互聯(lián)網(wǎng)時(shí)代的一個(gè)非常重要的內(nèi)容。它涵蓋的內(nèi)容包括網(wǎng)絡(luò)系統(tǒng)的硬件、軟件及其系統(tǒng)中的數(shù)據(jù),保證這些內(nèi)容不因偶然的或者惡意的原因而遭受到破壞、更改、泄露,系統(tǒng)連續(xù)可靠正常地運(yùn)行,網(wǎng)絡(luò)服務(wù)不中斷。隨著互聯(lián)網(wǎng)技術(shù)的快速發(fā)展,網(wǎng)絡(luò)信息安全[2]環(huán)境日趨復(fù)雜。“棱鏡門”事件的持續(xù)發(fā)酵與影響,令更多不為人知的監(jiān)控項(xiàng)目不斷曝光,如何抵御網(wǎng)絡(luò)威脅成為各國關(guān)注的首要議題之一。“沒有網(wǎng)絡(luò)安全就沒有國家安全,沒有信息化就沒有現(xiàn)代化”已上升為國家戰(zhàn)略。然而,非法網(wǎng)絡(luò)攻擊的手段和方式層出不窮,在時(shí)刻不停地尋找各種系統(tǒng)的安全漏洞,伺機(jī)非法入侵。目前,網(wǎng)絡(luò)安全的核心是對Web應(yīng)用程序和數(shù)據(jù)庫的保護(hù)。
據(jù)太平洋電腦網(wǎng)報(bào)道,前段時(shí)間一黑客組織成員使用SQL注入的方法攻擊了美國海軍的Web應(yīng)用“Smart Web Move”,此次攻擊直接導(dǎo)致美國海軍超過22萬服役人員的信息被泄露。該次事故美國海軍花費(fèi)了超過50萬美元來處理這次的攻擊事故。然而在日本電話電報(bào)公司(簡稱NTT)發(fā)布的2014全球威脅情報(bào)中指出:企業(yè)對小規(guī)模SQL注入攻擊的平均善后開支超過19萬美元。由此可見,SQL注入對Web應(yīng)用產(chǎn)生的損失是很大的。以上發(fā)生的事件可以看出, SQL注入絕不是一個(gè)過時(shí)的安全問題。
SQL注入攻擊(SQL Injection Attack),縮寫為SIA。許多黑客經(jīng)常使用SQL注入的方法來對數(shù)據(jù)庫進(jìn)行攻擊。當(dāng)前大部分的網(wǎng)絡(luò)應(yīng)用程序都是B/S和C/S模式的。但是目前大多程序員的水平參差不齊,許多程序員在編寫代碼的時(shí)候很少考慮網(wǎng)絡(luò)安全的問題,因此有好大一部分網(wǎng)絡(luò)程序都存在安全隱患。SQL注入一般是指用戶非法提交一段代碼,這段代碼可以在服務(wù)器程序中做一些不符合服務(wù)器安全性的行為,查詢別人的信息或者修改數(shù)據(jù)庫信息從而對應(yīng)用程序造成很大的損失。SQL注入發(fā)出的請求一般都是很普通的HTTP請求,因此目前市面的防火墻都不會(huì)對SQL注入發(fā)出警報(bào)。并且,SIA的方式非常多樣化,有很多種方法可以巧妙地構(gòu)造SQL語句,從而成功執(zhí)行惡意攻擊行為??偟膩碚f,SQL注入存在以下特性:
1) 廣泛性。SIA完全可以對任何一個(gè)基于SQL語言的數(shù)據(jù)庫進(jìn)行攻擊,比如目前最常用的MySQL和Oracle。因此,如果Web應(yīng)用程序需要對輸入的SQL語句做出比較嚴(yán)格的規(guī)范,不允許有任何非法的SQL。
2) 隱蔽性。SQL注入發(fā)出的請求一般都是很普通的HTTP請求,攻擊者發(fā)出的請求一般都是合法請求,所以當(dāng)前許多的防火墻[3]都不會(huì)對SIA發(fā)出警告信息,從而使得SQL注入攻擊很難被發(fā)現(xiàn)。
3) 門檻低。目前互聯(lián)網(wǎng)上有很多進(jìn)行SIA攻擊的工具,這些工具簡單易用,不需要懂得很多專業(yè)知識也可以應(yīng)用自如。
4) 危害大。由于Web編程語言本身的漏洞以及目前開發(fā)人員的安全意識較弱,大多數(shù)基于B/S和C/S模式的應(yīng)用程序均具有被SQL注入攻擊的可能。而攻擊者一旦成功,就可以控制整個(gè)Web應(yīng)用系統(tǒng),給服務(wù)器和用戶帶來極大的損失。
1 SIA原理與實(shí)現(xiàn)
SIA是通過合法的方式構(gòu)造畸形SQL語法,以普通的方式將該畸形語法作為參數(shù)傳入應(yīng)用程序后臺(tái),結(jié)合應(yīng)用程序后臺(tái)自動(dòng)執(zhí)行該非法語句來做一些惡意操作。下面簡單介紹一下SIA的基本原理。endprint
假如應(yīng)用系統(tǒng)數(shù)據(jù)庫中存在player表,其中有playerId和pwd兩個(gè)字段。則有:
1) 身份驗(yàn)證模塊中常用的兩個(gè)典型SQL語句:實(shí)現(xiàn)查詢player表。
① Select * from player
② Select count(*) from player
2) 在Web應(yīng)用的登錄界面中,用戶可以輸入其用戶名(playerId)和密碼(pwd)兩個(gè)參數(shù)進(jìn)行身份驗(yàn)證。假如用戶名為michael,密碼為55555。則上述SQL語句將變?yōu)椋?/p>
① Select * from player where playerId='michael' and pwd='55555'
② Select count(*) from player where playerId='michael' and pwd='55555'
正常情況下,如果語句1返回?cái)?shù)據(jù)不為空,則說明登錄驗(yàn)證成功;反之,說明登錄驗(yàn)證失敗。假如語句2返回?cái)?shù)量等于1,則說明驗(yàn)證成功;不為1,則驗(yàn)證失敗。
3) 如果分別為playerId和pwd賦畸形值,則上述語句1變成:
① Select * from players where playerId='michael' or 1=1 and pwd='abc'
語句1中的兩個(gè)判斷條件只要其中一個(gè)為真就會(huì)導(dǎo)致身份驗(yàn)證成功,而1=1總是為真,這就導(dǎo)致該語句總能使身份驗(yàn)證成功。
② Select count(*) from players where playerId='michael' and 1=1 and pwd='abc'
同上,該語句只要能保證數(shù)據(jù)庫中有該用戶名,則會(huì)導(dǎo)致驗(yàn)證成功。
綜上所述,用這種方式還能實(shí)現(xiàn)對數(shù)據(jù)庫中的數(shù)據(jù)做更危險(xiǎn)的操作,比如說刪除、插入和更新。
2 SQL注入常用途徑
攻擊者通常有很多種方法來進(jìn)行SQL注入,以下是幾種常用途徑。
1) 強(qiáng)制產(chǎn)生錯(cuò)誤
該方法的主要目的是識別數(shù)據(jù)庫類型和版本等信息。它可以收集這些信息從而為其他攻擊做事前準(zhǔn)備,可謂是攻擊的一個(gè)預(yù)備步驟。
2) 采用非主流通道技術(shù)
除HTTP請求的方法外,還可以通過通道獲取數(shù)據(jù)。然而,并非所有數(shù)據(jù)庫都支持通道,所以該方法僅僅適用于支持通道技術(shù)的數(shù)據(jù)庫。SQL注入的非主流通道主要有E-mail、DNS以及數(shù)據(jù)庫連接,基本思想為:先對SQL查詢打包,然后借助非主流通道將信息反饋至攻擊者。
目前對于SQL注入的方法也有很多種。本節(jié)給出一些應(yīng)對SQL注入的行之有效的建議和方法:
1) 使用參數(shù)化查詢:參數(shù)化查詢就是在SQL語句中有一個(gè)或多個(gè)嵌入?yún)?shù)的查詢。與動(dòng)態(tài)構(gòu)建SQL語句的方法相比,該方法更不易產(chǎn)生錯(cuò)誤,而且將代碼與數(shù)據(jù)分離開,便于管理。下面舉一個(gè)使用JDBC的實(shí)例:
PreparedStatement ps = conn.prepareStatement("SELECT * FROM PLAYERS WHERE PLAYERNAME=? AND PWD=?");
ps.setString(1, playername);
ps.setString(2, pwd);
ps.executeQuery();
應(yīng)當(dāng)確保在查詢數(shù)據(jù)庫之前對輸入進(jìn)行凈化??梢酝ㄟ^正則表達(dá)式來對用戶提交的參數(shù)進(jìn)行審核或者對這些參數(shù)的類型進(jìn)行限制,保證傳上來的參數(shù)跟我們需要的參數(shù)相符合。
2) 實(shí)施過濾和監(jiān)視工具:使用在Web應(yīng)用程序和數(shù)據(jù)庫這個(gè)水平上的過濾[4]和監(jiān)視工具可以阻止攻擊并檢測攻擊行為,從而減小暴露在大規(guī)模的SIA中的風(fēng)險(xiǎn)。
3) 精心編制錯(cuò)誤消息:黑客往往會(huì)利用你的錯(cuò)誤消息來對付你。因此開發(fā)人員在開發(fā)的時(shí)候可以考慮當(dāng)黑客故意發(fā)送非法請求來得到應(yīng)用系統(tǒng)的反饋信息時(shí)應(yīng)當(dāng)返回什么樣的錯(cuò)誤信息。
我們可以配置Web服務(wù)器和數(shù)據(jù)庫服務(wù)器,使攻擊者無法看到錯(cuò)誤信息或者警告信息。因?yàn)楣粽呖梢岳眠@些信息來了解數(shù)據(jù)庫的細(xì)節(jié)。
因此,我們需要及時(shí)給應(yīng)用程序或者數(shù)據(jù)庫打補(bǔ)丁,從而使用更新的數(shù)據(jù)來防御攻擊。
4) 限制數(shù)據(jù)庫的特權(quán):系統(tǒng)管理員應(yīng)當(dāng)正確地管理應(yīng)用程序后臺(tái)的賬戶以及數(shù)據(jù)庫的賬戶[5],并且要嚴(yán)格限制每個(gè)賬戶的權(quán)限,不能超過其應(yīng)有的權(quán)限。有時(shí)候數(shù)據(jù)庫管理員全面開放了一些賬戶,其目的是為了讓開發(fā)人員更輕松地工作,從而導(dǎo)致這些超級用戶賬戶遭受攻擊。
因此,一定要正確地管理所有的賬戶,使其僅能以最低的特權(quán)訪問后臺(tái)的數(shù)據(jù)庫。
3 結(jié)束語
本文對SQL注入攻擊的方法、原理以及常用注入途徑進(jìn)行了描述和總結(jié),并對常用注入方法進(jìn)行了總結(jié)。然后在主動(dòng)式防范模型的基礎(chǔ)上,提出了使用參數(shù)化查詢、實(shí)施過濾和監(jiān)視工具、精心編制錯(cuò)誤消息、及時(shí)打補(bǔ)丁并強(qiáng)化數(shù)據(jù)和限制數(shù)據(jù)庫的特權(quán)等幾種思路和方法。該文提出的解決方案可以很好的應(yīng)對當(dāng)前的SQL注入攻擊,具有很強(qiáng)的應(yīng)用價(jià)值。
參考文獻(xiàn):
[1] 徳丸浩.Web應(yīng)用安全權(quán)威指南[M].北京:人民郵電出版社,2014.
[2] Scott D, Sh arp R. Abstracting Application Level Web Security.In: Proc 11thL Intl World Wide Web Conf, May 2002:396-407.
[3] 包延芳.淺析網(wǎng)絡(luò)防火墻技術(shù)[J].今日科苑,2008(2):11-13.
[4] 陳棟.SQL注入的過濾方法探究[J].吉林廣播電視大學(xué)學(xué)報(bào),2014(10).
[5] 陳越,寇紅召,費(fèi)曉飛.數(shù)據(jù)庫安全[M].北京:國防工業(yè)出版社,2011.endprint