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