劉 佳
摘要:SQL注入攻擊是對(duì)數(shù)據(jù)庫(kù)進(jìn)行攻擊的常用手段之一。伴隨著網(wǎng)絡(luò)的普及應(yīng)用,基于B/S模式的Web應(yīng)用程序也得到了廣泛的應(yīng)用,但這些程序的水平卻參差不齊,相當(dāng)一部分開(kāi)發(fā)人員在編寫代碼的時(shí)候沒(méi)有對(duì)用戶數(shù)據(jù)的合法性進(jìn)行判斷,使程序存在安全隱患。SQL注入攻擊正是利用了這一漏洞對(duì)后臺(tái)數(shù)據(jù)庫(kù)進(jìn)行攻擊的。
關(guān)鍵詞:SQL注入攻擊;防范
1SQL注入攻擊的原理
SQL注入攻擊就是向服務(wù)器端提交一段事先準(zhǔn)備好的數(shù)據(jù),拼湊出攻擊者想要的SQL語(yǔ)句,以改變程序預(yù)期的執(zhí)行結(jié)果。
存在SQL注入漏洞的地方都是程序中需要根據(jù)客戶端提交的數(shù)據(jù)來(lái)構(gòu)造SQL語(yǔ)句的地方,也就是說(shuō)只要程序中存在“客戶端數(shù)據(jù)替換服務(wù)端預(yù)定義變量”的地方就有可能被注入。
由于服務(wù)器端程序通常采用拼湊SQL語(yǔ)句的方式,從而使得攻擊者有機(jī)會(huì)在提交的數(shù)據(jù)中包含SQL關(guān)鍵字或者運(yùn)算符,來(lái)構(gòu)造想要的語(yǔ)句。
假設(shè)服務(wù)器端有這樣一條SQL語(yǔ)句:
dim client_title as integer=Request.QueryString("title")
strsql="update book set title='" & client_title & "' where id=12"
客戶端則通過(guò)http://websitename/update.aspx?title=sqlinjectio
n的形式向服務(wù)器提交用戶數(shù)據(jù)。
開(kāi)發(fā)人員的本意是想通過(guò)用戶提交的數(shù)據(jù)“client_title”來(lái)更新表“book”中“id”為12的記錄中的“title”字段的內(nèi)容。在正常情況下,這樣做不會(huì)有任何問(wèn)題。但是如果攻擊者提交http://websitename/update.aspx?title=sqlinjection'--,那么sql語(yǔ)句將被拼湊為:
update book set title='sqlinjection'。
可以看到,“where”子句被“--”注釋掉了,“book”表中“title”列的所有內(nèi)容都將被更新為“sqlinjection”。
2SQL注入攻擊的危害
SQL注入攻擊的目的就是改變SQL語(yǔ)句預(yù)期的執(zhí)行結(jié)果。上面的例子就說(shuō)明了SQL注入攻擊的危害-對(duì)數(shù)據(jù)庫(kù)進(jìn)行了預(yù)期以外的操作,然而這還不是最糟糕的情形。請(qǐng)看下面的例子。
Dim id as string=Request.QueryString("ID")
Dim strsql as string="select * from tablename where id=" & id
這是在查詢數(shù)據(jù)庫(kù)中某個(gè)表的id字段中符合用戶條件的記錄的常用方法,而用戶條件通常是以查詢字符串的形式追加在URL的尾部。在本例中,客戶端瀏覽器會(huì)以http://websitename/targetpage.aspx?id=123的形式向服務(wù)器端傳遞id參數(shù),在正常情況下,這樣做不會(huì)產(chǎn)生任何問(wèn)題。但對(duì)于潛在的攻擊者來(lái)說(shuō),這就是一個(gè)可以利用的SQL注入漏洞。如果攻擊者在瀏覽器的地址欄中輸入下面的地址:http://websitename/targetpage.aspx?id=123';dropdatabasedatabasename-
-,然后提交,那么服務(wù)器端的sql語(yǔ)句就變成了:
select * from tablename where id=123; drop database databasename --
攻擊者在正常的查詢字符串后面添加了“'; drop database databasename -”,先通過(guò)“;”來(lái)終止當(dāng)前的sql語(yǔ)句,然后添加了惡意的sql語(yǔ)句-“drop database databasename”,最后通過(guò)“--”注釋掉語(yǔ)句的其它部分。這樣程序在執(zhí)行的時(shí)候會(huì)先執(zhí)行查詢,然后刪除數(shù)據(jù)庫(kù)。
上面的例子中攻擊者刪除了后臺(tái)數(shù)據(jù)庫(kù)。類似的,攻擊者可以利用程序編碼中的漏洞,執(zhí)行一個(gè)Join語(yǔ)句,獲取數(shù)據(jù)庫(kù)中所有的用戶名和密碼,也可以用Update、Insert語(yǔ)句修改商品的價(jià)格,添加新的管理員等等。
如果SQL注入只能通過(guò)手動(dòng)方式進(jìn)行的話,那么這個(gè)過(guò)程通常是漫長(zhǎng)而煩瑣的,使得利用這個(gè)漏洞入侵的成本過(guò)高,會(huì)讓一些水平有限的攻擊者放棄攻擊。但如果使用專門的SQL注入工具情況就大大的不同了,一般手動(dòng)入侵需要一天乃至更長(zhǎng)的時(shí)間,而使用工具只需幾分鐘時(shí)間。目前網(wǎng)上最流行的SQL注入工具是NBSI2.0,它使得SQL注入變成了十分小兒科的游戲,哪怕攻擊者既不懂ASP也不懂SQL,只需點(diǎn)點(diǎn)鼠標(biāo)就可以輕松入侵存在漏洞的網(wǎng)站。
3SQL注入攻擊的防范措施
從上面的分析可以看出,SQL注入攻擊對(duì)網(wǎng)站的危害是巨大的,那么如何防范它呢?我認(rèn)為可以從以下幾個(gè)方面入手。
3.1修改IIS返回的異常信息。
攻擊者在進(jìn)行SQL注入攻擊之前大多要通過(guò)IIS服務(wù)器返回的異常信息來(lái)收集和判斷服務(wù)器端的信息,如數(shù)據(jù)庫(kù)類型,連接方式,管理員賬戶甚至密碼等。只要將IIS默認(rèn)的異常提示頁(yè)面由500-100改為500即可,這樣無(wú)論程序運(yùn)行中出現(xiàn)什么錯(cuò)誤都將只提示“HTTP 500”錯(cuò)誤,攻擊者無(wú)法從中獲取有用的信息。
3.2配置網(wǎng)站的執(zhí)行權(quán)限。
通常情況下將網(wǎng)站的權(quán)限設(shè)為“純腳本”即可,而不要給以“腳本和可所執(zhí)行”權(quán)限。尤其是對(duì)存放通過(guò)網(wǎng)站后臺(tái)管理上傳的文件的目錄最好將權(quán)限設(shè)為“無(wú)”,這樣即使攻擊者將木馬上傳到服務(wù)器也無(wú)法運(yùn)行。
3.3配置數(shù)據(jù)庫(kù)權(quán)限。
只給訪問(wèn)數(shù)據(jù)庫(kù)的web應(yīng)用程序最低權(quán)限,如果public權(quán)限足夠用就絕對(duì)不要賦予sa權(quán)限,否則一旦被注入,不但當(dāng)前數(shù)據(jù)庫(kù)被攻擊,其它數(shù)據(jù)庫(kù)的安全也會(huì)受到威脅。
3.4驗(yàn)證用戶提交的數(shù)據(jù)。
SQL注入之所以能夠有機(jī)可乘,是因?yàn)榇蠖鄶?shù)服務(wù)器端代碼采用拼湊SQL語(yǔ)句的方式來(lái)操作數(shù)據(jù)庫(kù),使得惡意用戶可以向服務(wù)器提交惡意代碼。所以要防止SQL注入就必須要對(duì)用戶提交的數(shù)據(jù)進(jìn)行驗(yàn)證。在TCP/IP這個(gè)框架下,開(kāi)發(fā)人員必須假設(shè)用戶提交的數(shù)據(jù)都是不可信的,對(duì)來(lái)自用戶的數(shù)據(jù)進(jìn)行驗(yàn)證。
對(duì)用戶數(shù)據(jù)進(jìn)行驗(yàn)證的方法有很多,主要包括使用過(guò)濾用戶數(shù)據(jù)、存儲(chǔ)過(guò)程和參數(shù)化查詢。
SQL注入漏洞的本質(zhì)是攻擊者向服務(wù)器提交特殊數(shù)據(jù)拼湊SQL語(yǔ)句。因此,必須在程序中對(duì)來(lái)自用戶的數(shù)據(jù)進(jìn)行過(guò)濾??梢詮膬蓚€(gè)方面來(lái)考慮,一是只允許合法的數(shù)據(jù),假如系統(tǒng)用戶名只能由字母數(shù)字和下劃線組成,那么就可以用[0-9a-zA-Z_]+這個(gè)正則表達(dá)式來(lái)匹配它,如果不符合條件,就拒絕。二是禁止非法的數(shù)據(jù),例如禁止用戶提交包含有“select”、“update”、“delete”等SQL關(guān)鍵字的數(shù)據(jù)。
存儲(chǔ)過(guò)程不但可以防止SQL注入,而且可以使應(yīng)用程序的速度成倍的增長(zhǎng)。但需要注意的是如果存儲(chǔ)過(guò)程中也存在著由連接字符串組成的SQL語(yǔ)句的話同樣也有可能被注入,所以也要對(duì)用戶提交的數(shù)據(jù)進(jìn)行驗(yàn)證。
參數(shù)化查詢是將用戶數(shù)據(jù)作為一種指定類型的參數(shù)提交給數(shù)據(jù)庫(kù),開(kāi)發(fā)人員可以指定參數(shù)的數(shù)據(jù)類型、長(zhǎng)度等。程序代碼在執(zhí)行過(guò)程中將用戶提交的數(shù)據(jù)作為一個(gè)整體進(jìn)行處理,即使攻擊者提交了包含SQL語(yǔ)句的數(shù)據(jù),程序也不會(huì)視為SQL語(yǔ)句,也就從根本上防止了SQL注入攻擊。
3.5加密存儲(chǔ)用戶名和密碼。
SQL注入有可能向攻擊者暴露數(shù)據(jù)庫(kù)存儲(chǔ)的用戶名和密碼。如果將用戶名和密碼加密之后存儲(chǔ),攻擊者得到的將僅僅是密文,無(wú)法得到真正的用戶名和密碼。
目前,MD5是最常用的加密方法。簡(jiǎn)單來(lái)說(shuō)MD5是一種單向加密算法,即用戶無(wú)法通過(guò)密文得到明文。
雖然攻擊者也可以通過(guò)Update方法來(lái)替換密碼,但這也是一個(gè)相對(duì)復(fù)雜的工作,增加了攻擊者的成本。
3.6使用SQL注入檢測(cè)工具。
既然攻擊者可以使用工具來(lái)提高入侵效率,我們同樣可以使用工具來(lái)防止入侵。
隨著 SQL 注入攻擊的明顯增多,微軟發(fā)布了三個(gè)免費(fèi)工具,幫助開(kāi)發(fā)人員檢測(cè)存在的漏洞并對(duì)可能的攻擊進(jìn)行攔截。
Scrawlr
下載地址:https://download.spidynamics.com/Products/scrawlr/
這是微軟和 HP合作開(kāi)發(fā)的工具,會(huì)在網(wǎng)站中爬行,對(duì)所有網(wǎng)頁(yè)的查詢字符串進(jìn)行分析并發(fā)現(xiàn)其中的SQL 注入風(fēng)險(xiǎn)。Scrawlr使用了部分HP WebInspect的技術(shù),但只檢測(cè)SQL注入風(fēng)險(xiǎn)。Scrawlr 從一個(gè)起始 URL 入口,爬遍整個(gè)網(wǎng)站,并對(duì)站點(diǎn)中所有網(wǎng)頁(yè)進(jìn)行分析以找到可能存在的漏洞。
Microsoft Source Code Analyzer for SQL Injection
下載地址:http://www.microsoft.com/downloads/details.aspx?FamilyId=58A7C46E-A599-4FCB-9AB4-A4334146B6BA&displaylang=en
這款被稱作 MSCASI 的工具可以檢測(cè) 源 代碼并發(fā)現(xiàn)其中的SQL注入漏洞,開(kāi)發(fā)人員需要向 MSCASI 提供原始代碼,MSCASI 會(huì)發(fā)現(xiàn)存在風(fēng)險(xiǎn)的代碼位置。
URLScan 3.0
下載地址: http://www.iis.net/downloads/default.aspx?tabid=3
4&g=6&i=1697
URLScan 3.0會(huì)讓IIS服務(wù)器限制某些類型的HTTP請(qǐng)求,通過(guò)對(duì)特定HTTP請(qǐng)求進(jìn)行限制,可以防止某些有害的請(qǐng)求在服務(wù)器端執(zhí)行。UrlScan通過(guò)一系列關(guān)鍵詞發(fā)現(xiàn)惡意請(qǐng)求,并阻止惡意請(qǐng)求的執(zhí)行。