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