焦玉華
(山東工商學院,山東 煙臺 264005)
WEB系統中SQL注入防御方法的研究
焦玉華
(山東工商學院,山東 煙臺 264005)
SQL注入風險已成為WEB應用最大的安全隱患之一,通過介紹SQL注入的本質及特點,詳細分析了SQL注入的一般思路和實現方法,最后從服務器IIS設置、數據庫設置和程序編寫三個方面提出了針對SQL注入的防御措施。
網絡安全;SQL注入攻擊;SQL注入點
隨著WEB技術的迅速發展,基于B/S結構的WEB應用得到了廣泛的普及,涉及到教育、金融、社交等多個領域,這使得其安全問題備受關注。在OWASP(開放式web應用程序安全項目)研究公布的WEB應用程序最可能、最常見、最危險的十大安全隱患中,SQL注入風險位居前列,并因其普遍程度高,危害程度大,成為目前主要的WEB應用攻擊方法之一。本文以ASP+SqlServer為例,介紹SQL注入的過程和防御方法。
2.1SQL注入的本質
SQL注入攻擊就其本質而言,就是攻擊者利用SQL語法的特點,針對應用程序開發者編程過程中沒有對用戶的輸入數據進行合法性驗證的漏洞,向應用程序中插入一些SQL語句來實現對數據庫未經授權的訪問和檢索,根據WEB頁面返回的結果,獲得自己想要的數據。
2.2SQL注入的特點
(1)攻擊的廣泛性。由于SQL注入是利用的SQL語法,因此在理論上講,只要支持SQL語言標準的數據庫軟件都有可能受到SQL注入的攻擊,例如MS Sql Server、Mysql、Oracle、DB2等。
(2)技術門檻低。SQL注入的原理相對簡單,易于掌握和實施。只要有SQL語法基礎的人都可以進行SQL注入攻擊,同時還有很多專門的SQL注入工具,例如SQLMAP、HDSI,這樣即使完全不懂編程、不懂 SQL語法的人的都可以進行SQL注入攻擊。
(3)隱蔽性強。SQL注入攻擊是通過正常的WWW端口訪問數據庫,語法結構也是正確的SQL語句,與正常的頁面訪問完全一樣,因此這種攻擊可以順利地越過防火墻而不被發現。
SQL注入的一般思路是首先判斷 WEB應用是否存在SQL注入漏洞,即尋找注入點,判斷后臺數據庫類型,再確定XP_CMDSHELL可執行情況,進一步發現WEB虛擬目錄,最后上傳ASP木馬,得到管理員權限。
3.1查找SQL注入點
HTTP協議的請求方法中,常用到GET和POST兩種。GET方法是把參數數據隊列加到提交表單的ACTION屬性所指的URL中,從服務器上獲取數據。POST方法將表單內各個字段與其內容放置在 HTML HEADER內一起傳送到ACTION屬性所指的URL地址,是向服務器傳送數據。SQL注入點最可能出現的地方就是使用GET和POST方法與服務器交換數據的地方。常用的手工查找SQL注入點的方法有以下兩種:“加單引號”法 和“1=1、1=2”法。
3.2利用SQL注入點進行注入攻擊
下面以用戶登錄驗證模塊為例,說明SQL注入攻擊的實施過程。在登錄驗證的程序中,通常用的SQL語句為:select * from usertable where username=‘admin’and password=’123’。如果攻擊者以“admin’or 1=1 --”作為用戶名輸入時,SQL語句變為:select * from usertable where username=‘admin’or 1=1 -- and password=’123’,“--”在SQL語法中是注釋符,其后面的語句都會被注釋掉,不會被執行,而“or 1=1”恒為真,這使得 where條件判斷也恒為真,攻擊者就可以跳過用戶驗證順利進入系統。
針對SQL注入攻擊的本質和實現方法,從服務器IIS設置、數據庫設置和程序編寫三個方面分析如何防御SQL注入。
4.1服務器IIS設置
程序員在編寫或調試程序時,IIS會把詳細的代碼錯誤信息反映在WEB頁面中,讓程序員能夠迅速的發現程序的問題所在,而攻擊者恰恰也可以利用這個錯誤信息發現系統的漏洞。因此在WEB系統發布后,在IIS的配置調試選項卡中,選擇“向客戶端發送下列文本錯誤信息(T)”選項,定義一個統一固定的錯誤提示,替代詳細的錯誤提示,這樣可以在一定程度上減少注入試探。
4.2數據庫設置
猜測表名、字段名也是SQL注入的一種方法,因此在數據庫的命名上要做到標準規范,避免用 admin、username、password等常見詞作為表名或字段名。WEB應用連接數據庫時,要遵循“最小權限準則”,堅決不能用sa權限的用戶連接數據庫,對表的select、update、delete操作權限要做精確的設置。
4.3程序編寫
程序員編寫程序時不規范、不嚴謹,是 WEB應用存在SQL注入點的主要原因,應該從以下四個方面去規范程序編寫,減少系統漏洞。
4.3.1對用戶的輸入進行合法性驗證
(1)限定用戶輸入的字符串長度。這個方法簡單易操作,可以有效地防止攻擊者構造較長SQL語句插入到WEB應用中。可以通用設置文本字段的 maxlength屬性來實現,也可以通過函數len()進行判斷。
(2)屏蔽或替換特殊的符號。在SQL注入中,單引號、括號、注釋符號、空格、雙引號等都是常用的特殊符號,可以根據實際情況將這些特殊符號屏蔽掉,也可以用replace()替換成全角或中文符號,使惡意的SQL語句無法插入到系統中。
(3)對系統的輸入要求做專門驗證。
在WEB應用的輸入設計中,對有些輸入的內容要求比較具體,例如只允許輸入數字、字母、漢字或者它們的組合等,可以利用或者構造相應的函數去驗證,我們以只允許輸入數字為例:通過IsNumeric()或者ASC()判斷ASCII碼值來確定輸入是否為數字,也可以利用正則表達式“^[0-9]+$”來判斷。
4.3.2使用參數化查詢
部分程序員在編寫程序時,為了省時省力,以字符串拼接的方式構建SQL語句,導致系統中存在SQL注入隱患,而參數化查詢是目前最有效的預防SQL注入攻擊的方法。參數化查詢是指程序鏈接并訪問數據庫時,在需要填入數據的地方,使用參數來賦值。在使用參數化查詢的情況下,數據庫不會將參數的內容當做SQL指令的一部份來執行,而是先進行SQL 指令的編譯,再套用參數執行,這樣即使參數中含有惡意的指令,也不會被數據庫執行。同樣以登錄驗證為例,使用參數化查詢來實現:
dim rs,cmd,cn
set cmd=server.CreateObject("adodb.command")
set cn=server.CreateObject("adodb.connection")
set rs=server.CreateObject("adodb.recordset")
cn.Open"DRIVER={SQL Server};SERVER=服務器;UID=用戶名;PWD=密碼;
DATABASE=數據庫"
cmd.activeconnection=cn
cmd.commandtext="select*fromusertablewhere username=? and password=?"
cmd.commandtype=1
cmd.prepared=true
cmd.parameters.append
cmd.createparameter("username",adVarChar,
adparaminput,10)
cmd.parameters.append
cmd.createparameter("password",adVarChar,
adparaminput,10)
cmd.parameters("username")=request.form("username")
cmd.parameters("password")=request.form("password")
rs=cmd.execute
在程序編寫中,除了上述方法,還可以對數據庫的重要數據進行MD5加密,記錄跟蹤攻擊者的IP和攻擊行為,利用專門的掃描工具查找系統的注入漏洞。
SQL注入攻擊是攻擊者廣泛使用的一種攻擊手段,嚴重威脅著應用程序的安全。因此,WEB應用的開發人員和維護人員必須要掌握SQL注入攻擊的常用方法和防御措施,在程序開發時要合理設計,規范編程,盡量完善代碼避免漏洞,這樣才能保護系統的安全,遠離SQL注入攻擊的危害。
[1] 王云,郭外萍,陳承歡.Web項目中的SQL注入問題研究與防范方法[J].計算機工程與設計,2010,(5):976-978.
[2] 陳遜.SQL注入攻擊原理與防范[J].電腦知識與技術,2008,(3):12.
[3] 黃明輝.基于SQL Server的SQL注入攻擊防范方法[J].計算機安全,2008,(8):122-124.
The study of WEB SQL injection defense system method
SQL injection risk has become one of the biggest security risks WEB application, the nature and characteristics through the introduction of SQL injection, a detailed analysis of the general ideas and methods SQL injection, and finally write IIS settings from the server, database settings and procedures for the three areas the defense against SQL injection.
Network security; SQL injection attacks; SQL injection point
TP393.08
A
1008-1151(2015)04-0003-02
2015-03-13
山東工商學院青年科研基金項目(2012QN203)。
焦玉華(1979-),男,河南衛輝人,山東工商學院工程師,研究方向為教學管理。