天津市信息中心應(yīng)用處 劉云志
SQL注入攻擊與防范研究
天津市信息中心應(yīng)用處 劉云志
SQL注入攻擊是指攻擊者利用提交專門設(shè)計(jì)的數(shù)據(jù)庫(kù)查詢代碼,欺騙服務(wù)器執(zhí)行惡意的SQL命令,從而獲取用戶密碼等保密信息,甚至獲取主機(jī)控制權(quán)限的行為。SQL注入攻擊利用的是SQL語(yǔ)法,由于其廣泛性、易學(xué)性和難以捕獲性已經(jīng)逐漸成為互聯(lián)網(wǎng)上的主流黑客攻擊方式。目前,互聯(lián)網(wǎng)上的多種Web應(yīng)用程序都面臨SQL注入的危險(xiǎn),多家網(wǎng)站都曾經(jīng)或正在被SQL注入攻擊,這種攻擊目前正在加速泛濫。統(tǒng)計(jì)表明,在互聯(lián)網(wǎng)上的Web服務(wù)器遭受的各類應(yīng)用層攻擊中,SQL注入占有極大的比例。
由于多數(shù)程序員不了解SQL注入漏洞的知識(shí),目前互聯(lián)網(wǎng)上網(wǎng)站經(jīng)常遭受SQL注入攻擊。本文,筆者針對(duì)PHP+MySQL型和ASP+SQLServer型Web程序的SQL注入攻擊防范措施進(jìn)行了詳細(xì)闡述,并給出了預(yù)防SQL注入漏洞的方法,有助于提高Web應(yīng)用程序員的安全意識(shí)和Web程序的安全性。
1. SQL注入原理。SQL注入攻擊是指黑客在用戶交互端精心編寫一些SQL語(yǔ)句,把特殊的SQL指令語(yǔ)句插入到系統(tǒng)實(shí)際SQL語(yǔ)句中并執(zhí)行它,從而獲取主機(jī)控制權(quán)限的攻擊方法。SQL注入是從正常的WWW端口訪問(wèn),而且表面看起來(lái)跟一般的Web頁(yè)面訪問(wèn)沒(méi)什么區(qū)別,所以目前市面上的防火墻不會(huì)對(duì)SQL注入發(fā)出警報(bào)。以PHP語(yǔ)言為例,如果用戶的輸入能夠影響腳本中SQL命令的生成,那么很可能在添加了單引號(hào)、#號(hào)等轉(zhuǎn)義命令字符后,能夠改變最終生成的SQL命令。
2. 舉例說(shuō)明。如果程序員在編程時(shí)沒(méi)有對(duì)用戶輸入的變量$U和$P進(jìn)行合理的限制,當(dāng)攻擊者把用戶名輸入為admin’#的時(shí)候,輸入字符串中的單引號(hào)和腳本中的單引號(hào)形成配對(duì),而輸入字符串中的“#”號(hào)對(duì)于mysql語(yǔ)言來(lái)說(shuō)是行注釋符,后邊的語(yǔ)句將被當(dāng)做注釋處理掉。這使攻擊者可以輕易繞過(guò)身份驗(yàn)證機(jī)制,因此,沒(méi)有正確密碼也能看到管理員的信息。對(duì)于SQL注入攻擊,很多程序員對(duì)它仍然沒(méi)有足夠的重視,編寫的網(wǎng)站中遺留了大量SQL注入攻擊漏洞。加上許多專門的SQL注入軟件(如NBSI)的“蓬勃發(fā)展”,使得一個(gè)既不懂編程又不懂SQL的人,只要知道如何操作這個(gè)軟件就可以輕而易舉地入侵一家網(wǎng)站。
1.廣泛性。SQL注入攻擊利用的是簡(jiǎn)單的SQL語(yǔ)法,因此所有基于SQL語(yǔ)言標(biāo)準(zhǔn)的Web應(yīng)用程序都可能成為SQL注入攻擊的目標(biāo)。如果沒(méi)有對(duì)輸入的SQL語(yǔ)句做嚴(yán)格的技術(shù)處理,理論上都會(huì)存在SQL注入漏洞安全隱患。市場(chǎng)上主流的Web應(yīng)用程序均發(fā)現(xiàn)存在SQL注入漏洞的問(wèn)題。
2.危害大。通過(guò)SQL注入攻擊可以控制整個(gè)Web應(yīng)用系統(tǒng),在不經(jīng)授權(quán)的情況下對(duì)數(shù)據(jù)做任意地修改,甚至惡意篡改網(wǎng)頁(yè)的內(nèi)容,破壞性極大。
3.技術(shù)要求低。目前互聯(lián)網(wǎng)上出現(xiàn)了許多SQL注入攻擊工具,如明小子、桂林老兵等都是非常出名的攻擊工具。攻擊者無(wú)需專業(yè)知識(shí),直接利用此類工具軟件便可隨意地對(duì)存在SQL注入攻擊漏洞的網(wǎng)站實(shí)施攻擊。
目前針對(duì)Web服務(wù)器的SQL注入攻擊技術(shù)層出不窮,但其內(nèi)部機(jī)理都是利用畸形的SQL語(yǔ)句通過(guò)客戶端瀏覽器與服務(wù)器之間的共享連接來(lái)實(shí)現(xiàn)繞過(guò)認(rèn)證獲取敏感信息。如何讓系統(tǒng)管理者采取有效的防范措施阻止內(nèi)部信息的泄露,將整個(gè)系統(tǒng)的威脅降至最低,是目前服務(wù)器防守的關(guān)鍵。
1. SQL注入攻擊檢測(cè)方法。SQL注入攻擊檢測(cè)分為入侵前的檢測(cè)和入侵后的檢測(cè),入侵前檢測(cè)可以手工測(cè)試也可以通過(guò)軟件檢測(cè),入侵后檢測(cè)主要是針對(duì)日志的檢測(cè)。
(1)數(shù)據(jù)庫(kù)檢查。使用HDSI、NBSI和Domain等SQL注入攻擊軟件工具進(jìn)行SQL注入攻擊后,都會(huì)在數(shù)據(jù)庫(kù)中生成一些臨時(shí)表。通過(guò)查看數(shù)據(jù)庫(kù)中最近新建表的結(jié)構(gòu)和內(nèi)容,就可以判斷是否曾經(jīng)發(fā)生過(guò)SQL注入攻擊。
(2)IIS日志檢查。在Web服務(wù)器中如果啟用了日志記錄,則IIS日志會(huì)記錄訪問(wèn)者的IP地址、訪問(wèn)文件等信息,SQL注入攻擊往往會(huì)大量訪問(wèn)某一個(gè)頁(yè)面文件(存在SQL注入點(diǎn)的動(dòng)態(tài)網(wǎng)頁(yè)),且日志文件也會(huì)急劇增加。
2. 一般SQL注入攻擊的防范方法。
(1)IIS服務(wù)器安全設(shè)置。攻擊者常用錯(cuò)誤信息判斷SQL漏洞是否存在,可以修改IIS的返回信息,使得所有錯(cuò)誤返回一樣的信息,攻擊者無(wú)從獲取網(wǎng)站信息??梢孕薷腃:WINDOWSHelp iisHelpcommon目錄下的500-100.asp文件為統(tǒng)一格式的500.htm。對(duì)于靜態(tài)網(wǎng)站,一般不設(shè)置腳本可執(zhí)行權(quán)限,動(dòng)態(tài)網(wǎng)站也只設(shè)置純腳本權(quán)限。對(duì)于用戶上傳的文件設(shè)置為無(wú)可執(zhí)行權(quán)限,上傳文件夾不放置系統(tǒng)配置文件。IIS如無(wú)匿名登錄需求,則可取消該項(xiàng)服務(wù)。
(2)功能代碼端設(shè)置。程序員要習(xí)慣將應(yīng)用系統(tǒng)中的密碼字段進(jìn)行加密(如最常見(jiàn)的MD5加密),這不僅僅是為了隱藏用戶信息,尊重用戶隱私,更重要的是提高系統(tǒng)的安全性。也就是在程序中要對(duì)用戶輸入的信息進(jìn)行檢驗(yàn),以達(dá)到SQL攻擊的防御效果。目前這種檢驗(yàn)方法一般有2種:替換或刪除敏感字符串,在服務(wù)器正式處理前對(duì)提交數(shù)據(jù)進(jìn)行檢驗(yàn)。
(3)SQL Server安全配置。用于程序連接數(shù)據(jù)庫(kù)的用戶不應(yīng)使用服務(wù)器角色組,而應(yīng)使用數(shù)據(jù)庫(kù)用戶角色組成員。SA級(jí)別的權(quán)限是不能隨便配置的,黑客SQL注入得手后調(diào)用xp_cmdshell命令就可以得到系統(tǒng)的最高權(quán)限。最好的方法是只給予db_Reader和db_ Writer權(quán)限,遇到有需要備份的用戶最好另行新建用戶。SQL Server可以精確地設(shè)置某一數(shù)據(jù)庫(kù)中各個(gè)表的select、update、delete等操作的權(quán)限,開發(fā)人員應(yīng)根據(jù)應(yīng)用系統(tǒng)的不同功能要求,合理地配置好這些權(quán)限。
(4)對(duì)系統(tǒng)一級(jí)的設(shè)置。例如,使用防火墻關(guān)閉TCP1433和UDP1434端口對(duì)外的連接,給系統(tǒng)和SQL Sevrer甚至IIS打上最新的補(bǔ)丁,及時(shí)檢查系統(tǒng)是否出現(xiàn)弱口令用戶,一旦發(fā)現(xiàn)要及時(shí)修改密碼等。