陳志輝,吳敏敏
(莆田學院 電子信息工程系,福建 莆田 351100)
基于ASP.NET網(wǎng)站防范SQL注入的網(wǎng)絡安全技術(shù)分析
陳志輝,吳敏敏
(莆田學院 電子信息工程系,福建 莆田 351100)
W eb技術(shù)在各個領域得到日益廣泛的應用,給人們的生活帶來了便利,也帶來了前所未有的巨大安全風險.目前對Web業(yè)務系統(tǒng),威脅最嚴重的兩種攻擊方式是SQL注入攻擊(SQL Injection)和跨站腳本攻擊(XSS).文中通過具體案例分析了基于ASP.NET網(wǎng)站的SQL注入攻擊主要手段和實現(xiàn)過程,總結(jié)了一般的SQL注入攻擊的防范措施.
ASP.NET;SQL注入;防范措施
隨著Internet的發(fā)展,Web應用在電子政務、電子商務等領域得到廣泛的應用,這給人們的生活工作帶來極大的便利,但同時也帶來了極大的安全隱患.根據(jù)世界知名的Web安全與數(shù)據(jù)庫安全研究組織OWASP提供的報告,目前對Web業(yè)務系統(tǒng),威脅最嚴重的兩種攻擊方式是SQL注入攻擊(SQL Injection)和跨站腳本攻擊(XSS)[1].本文主要對基于ASP.NET網(wǎng)站的SQL注入漏洞和防御措施進行分析.
所謂SQL注入攻擊,就是攻擊者把非法的SQL命令插入到表單的輸入域或者頁面請求的查詢字符串,欺騙服務器執(zhí)行這些惡意的代碼.Web程序員如果在編程時候?qū)τ赪eb系統(tǒng)的安全性考慮不夠,沒有對用戶輸入的信息進行驗證和過濾,就會產(chǎn)生SQL注入漏洞[2].如果Web系統(tǒng)存在漏洞,SQL注入攻擊者在攻擊成功后可能獲得站點的最高管理權(quán),隨意修改站點的代碼、數(shù)據(jù)等,還可以查看數(shù)據(jù)庫中的一些重要數(shù)據(jù)信息,危害極大[3,4].
與ASP.NET搭配最密切的數(shù)據(jù)庫是SQL Server.SQL Server是公認運行在Windows平臺上最佳的數(shù)據(jù)庫,它具有對稱的多處理器結(jié)構(gòu)、搶占式多任務管理、完善的容錯與恢復能力[5,6],它也是SQL注入攻擊的主要源頭.
Web系統(tǒng)數(shù)據(jù)提交方式有兩種,分別是Get和Post.Get提交數(shù)據(jù)是通過網(wǎng)頁的URL地址,需要把提交數(shù)據(jù)在URL地址中顯示出來,用戶可以看到也可以隨意輸入修改.Post傳輸數(shù)據(jù)時,不需要在URL中顯示出來.Post傳輸?shù)臄?shù)據(jù)量大,可以達到2M,而Get方法由于受到URL長度的限制,只能傳遞大約1024字節(jié).不同提交方式SQL注入攻擊方式不同,以下我就對基于ASP.NET+SQL Server網(wǎng)站的多種SQL注入攻擊實例進行分析.
3.1 利用后臺登錄窗口的SQL注入后臺登錄窗口的代碼:
這里conn是數(shù)據(jù)庫連接對象,name和password是用戶在登錄窗口輸入的用戶名和密碼,假設實際管理員用戶名為administrator,密碼為123456,那么Web應用發(fā)送給數(shù)據(jù)庫服務器的SQL語句為:
select*from administrators where name='administrator'and password='123456'
在數(shù)據(jù)庫中找到一條對應的記錄,登錄成功.
但是如果用戶輸入的用戶名和密碼沒有經(jīng)過任何處理直接發(fā)送給數(shù)據(jù)庫服務器執(zhí)行,那么如果用戶輸入的用戶名為wmm'OR 1=1--,密碼為123,那么Web應用發(fā)送給數(shù)據(jù)庫服務器的SQL語句為:
我們知道,在SQL Server中注釋符—表示注釋掉注釋符后面本行內(nèi)容,1=1恒為真,OR運算中兩個操作數(shù)只要一個為真,結(jié)果就為真,因此上面的SQL語句where后面的條件恒為真,返回administrators表的所有記錄,dr.read()返回的結(jié)果就為真,我們就成功地登錄了.還有其它方法,原理都是一樣的,只要讓dr.read()返回的結(jié)果就為真就行了.
3.2 利用數(shù)據(jù)更新的SQL注入
設后臺數(shù)據(jù)庫中有一張表users,表的結(jié)構(gòu)如表1:
表1 用戶信息表
name和password是用戶名和密碼,level是用戶等級,1表示管理員,2表示普通用戶.普通用戶更新密碼代碼:
這里conn是數(shù)據(jù)庫連接對象,password是用戶輸入的新密碼,但是如果用戶輸入的新密碼沒有經(jīng)過任何處理直接發(fā)送給數(shù)據(jù)庫服務器執(zhí)行,那么假設普通用戶wmm輸入的新密碼為123',level='1,那么Web應用發(fā)送給數(shù)據(jù)庫服務器的SQL語句為:
那普通用戶wmm就變成了管理員.
3.3 利用插入數(shù)據(jù)的SQL注入
設后臺數(shù)據(jù)庫中有一張表users,表的結(jié)構(gòu)如表n.
普通用戶注冊代碼:
這里conn是數(shù)據(jù)庫連接對象,name和password是普通用戶在注冊窗口輸入的用戶名和密碼,默認插入的用戶級別為2(既普通用戶).那么假設普通用戶在注冊時候,輸入的用戶名為wmm,密碼為123456’,’1’)--,那么Web應用發(fā)送給數(shù)據(jù)庫服務器的SQL語句為:
我們知道,在SQL Server中注釋符—表示注釋掉注釋符后面本行內(nèi)容,這樣在普通用戶注冊頁面就注冊了一個用戶名為wmm,密碼為123456,級別為1(既管理員)的用戶.
3.4 利用Get漏洞的SQL注入
(1)在地址欄里面輸入http://localhost/site/users.aspx?name=wmm’,得到結(jié)果如圖1所示.
圖1 Get注入漏洞
(2)在地址欄里面輸入http://localhost/site/ users.aspx?name=wmm’%20and%20’1’=’1頁面運行正常,運行結(jié)果和在地址欄里面輸入http://localhost/site/users.aspx?name=wmm相同.
(3)在地址欄里面輸入http://localhost/site/ users.aspx?name=wmm’%20and%20’1’=’2頁面運行異常,其中%20是空格的URL編碼.
如果以上三步全面滿足,users.aspx中一定存在SQL注入漏洞,那么攻擊者就可以通過這個頁面實施SQL注入攻擊,比如猜測后臺數(shù)據(jù)庫的表名、字段名等重要信息的攻擊.
(1)猜測表名:在地址欄中輸入http://localhost/site/users.aspx?name=wmm’%20and%20(select%20count(*)%20from%20users)<>0%20and% 20name=’wmm,如果存在users表格,頁面返回正常.
(2)猜測字段名:在地址欄中輸入http://localhost/site/users.aspx?name=wmm%20and%20(select%20count(name)%20from%20users)<>0% 20and%20name=’wmm,如果users表格中存在name字段,頁面返回正常.
4.1 SQL注入攻擊客戶端安全措施
SQL注入大多都是從客戶端滲透進來的.客戶端提交的SQL注入如果沒有進過驗證和過濾,直接當作可靠數(shù)據(jù)提交給服務器,那就會發(fā)生SQL注入攻擊,所以客戶端提交的數(shù)據(jù)在提交給服務器處理前,要進行驗證和過濾:
(1)使用Server.HtmlEncode()函數(shù)對客戶端提交的數(shù)據(jù)進行編碼;(2)使用MD5對客戶端提交的數(shù)據(jù)進行加密;(3)定義正則表達式對客戶端提交的數(shù)據(jù)進行驗證,檢驗客戶端輸入的數(shù)據(jù)是否符合要求;
(4)使用參數(shù)化的SQL或者直接使用存儲過程對數(shù)據(jù)庫進行數(shù)據(jù)查詢存取.
4.2 基于ASP.NET網(wǎng)站SQL注入攻擊防范實例分析
SQL注入是通過向服務器提交特殊的代碼,以達到攻擊者目的,要防范SQL注入攻擊首先要對客戶端提交的數(shù)據(jù)進行驗證和過濾.
4.2.1 用戶注冊頁面的防范措施
用戶注冊頁面的信息是通過表單以Post方式提交,注冊頁面提交的數(shù)據(jù)一般包括用戶名、密碼、性別、出生日期、備注等.
限制用戶名由下劃線、數(shù)字、字母組成,長度在4到15之間.這樣攻擊者就不能輸入單引號、空格等特殊字符,輸入的字符的長度也有限,也就很難攻擊.
這里name是用戶輸入的用戶名,RegexOptions.IgnoreCase是忽略大小寫.
用戶輸入的密碼都要加密后提交給數(shù)據(jù)庫,可以使用MD5對密碼進行加密,但是該加密方法號稱不可逆,不過已經(jīng)被破解了,網(wǎng)上很容易搜到破解工具,我們最好做一些更改,網(wǎng)上的工具就無法破解了.
性別只允許是男或者女.
出生日期限制提交日期型數(shù)據(jù)給數(shù)據(jù)庫.
備注里面的內(nèi)容用Server.HtmlEncode()函數(shù)進行編碼后提交給數(shù)據(jù)庫.
4.2.2 登錄頁面的防范措施
在登錄窗口用戶輸入的用戶名和密碼必須能夠在數(shù)據(jù)庫中找到相應的記錄才能夠登錄成功.如上面提到"select*from administrators where name='"+name+"'and password='"+password +"'",但是這樣攻擊者很容易繞過登錄驗證.
為了安全起見應限制用戶在登錄窗口輸入的用戶名由下劃線、數(shù)字、字母組成,長度在4到15之間.也可以把用戶名和密碼分開驗證.先驗證用戶名"select*from administrators where name='"+ name+"'",如果返回的數(shù)據(jù)集非空,再驗證密碼password==rs[“password”],password為用戶輸入的密碼,rs[“password”]為數(shù)據(jù)庫內(nèi)的密碼
4.2.3 URL傳值的SQL注入防范措施
如上面提到http://localhost/site/users.aspx? name=wmm,name對應數(shù)據(jù)庫中name(用戶名)字段,限制由下劃線、數(shù)字、字母組成,長度在4到15之間,禁止用戶輸入SQL關(guān)鍵字,如Select、Insert、Update等.
SQL注入是從正常的WWW端口訪問,而且表面看起來跟一般的Web頁面訪問沒什么區(qū)別,所以目前市面的防火墻都不會對SQL注入發(fā)出警報.程序員在編寫代碼時,沒有對用戶輸入的信息進行驗證和過濾,使應用程序存在安全隱患.SQL注入攻擊成功后,對服務器乃至系統(tǒng)都是巨大的威脅.因此,研究SQL注入攻擊的防范方法、加強代碼編寫時對用戶輸入信息的過濾檢查,對于開發(fā)安全的Web應用程序有著重要意義.
〔1〕景煒.電子政務系統(tǒng)網(wǎng)絡安全的研究與應用[D].成都:電子科技大學,2006.5.
〔2〕胡昌振.網(wǎng)絡入侵檢測原理與技術(shù)[M].北京:北京理工大學出版社,2006.156-182.
〔3〕鄧吉,曹軼,羅詩堯.黑客攻防實戰(zhàn)入門(第2版) [M].北京:電子工業(yè)出版社,2007.76—91.
〔4〕M ike Shema.Web安全手冊[M].北京:清華大學出版社,2005.62—68.
〔5〕余杰,李莎莎.SOL Server項目開發(fā)實踐[M].北京:中國鐵道出版社,2006.112-116.
〔6〕余晨,李文炬.SOL Server 2000培訓教程[M].北京:清華大學出版社,2002.32-35.
〔7〕閆洪亮,李波,黎杰.ASP.NET程序設計[M].上海:上海交通大學出版社,2008.
TP309;TP393
A
1673-260X(2012)07-0017-03
莆田學院教改項目(JG200818)