張學(xué)義, 鐘志宏
(黔南民族師范學(xué)院 計(jì)算機(jī)與信息學(xué)院, 貴州 都勻 558000)
?
ASP.NET的SQL注入攻擊及防御
張學(xué)義, 鐘志宏
(黔南民族師范學(xué)院 計(jì)算機(jī)與信息學(xué)院, 貴州 都勻 558000)
研究ASP.NET網(wǎng)站的SQL注入攻擊的成因、攻擊距離,通過(guò)實(shí)例說(shuō)明ASP.NET程序中的SQL注入攻擊方式.研究表明:要防范SQL注入,最重要的就是要做好危險(xiǎn)字符驗(yàn)證的程序、異常編碼的處理,屏敝錯(cuò)誤信息,并從代碼安全上進(jìn)行阻止,如設(shè)置可靠的SQL參數(shù)、給數(shù)據(jù)進(jìn)行加密處理、查驗(yàn)用戶信息、設(shè)置存儲(chǔ)路徑和設(shè)置安全措施等,從而加強(qiáng)ASP.NET網(wǎng)站的性能和安全,避免SQL注入攻擊的實(shí)現(xiàn).
ASP.NET; SQL注入攻擊; 防御技術(shù); 異常編碼; 代碼安全
互聯(lián)網(wǎng)技術(shù)的擴(kuò)拓總是伴隨著網(wǎng)絡(luò)安全問(wèn)題,以ASP.NET語(yǔ)言為基點(diǎn)Web應(yīng)用程序的數(shù)量在不斷攀升,隨之而來(lái)的網(wǎng)絡(luò)安全破壞(攻擊力)也更大了.很多網(wǎng)站程序員在編寫ASP.NET網(wǎng)站程序時(shí),并沒(méi)有對(duì)用戶輸入的數(shù)據(jù)進(jìn)行檢驗(yàn)性測(cè)試,或者網(wǎng)站數(shù)據(jù)庫(kù)自身存在一些比較大的安全漏洞,以及網(wǎng)站的防火墻并沒(méi)有能夠識(shí)別外部攻擊.SQL注入是目前ASP系統(tǒng)中存在最多的一種安全漏洞.SQL注入攻擊是指攻擊者通過(guò)修改原有數(shù)據(jù)庫(kù)的數(shù)據(jù)和參數(shù),使系統(tǒng)識(shí)別不出非法入侵,這種找漏洞進(jìn)入的入侵常被稱為漏洞攻擊,它會(huì)對(duì)程序數(shù)據(jù)庫(kù)語(yǔ)句執(zhí)行造成打擊[1].本文對(duì)ASP.NET網(wǎng)站的SQL注入攻擊進(jìn)行攻擊,并提出相應(yīng)的防范措施.
程序中,SQL 注入很大的原因在于編碼和代碼存在問(wèn)題,其主要原因是在編寫代碼的過(guò)程中,對(duì)代碼完善性的考慮欠周、簡(jiǎn)潔性及安全性的結(jié)果,從而導(dǎo)致腳本程序被入侵者破壞[2].從入侵者方面出發(fā),SQL 注入可以加強(qiáng)防御,所構(gòu)成的防火墻夠堅(jiān)固,才可以避開(kāi)防火墻的阻擋,這個(gè)操作十分容易,且能夠?qū)崿F(xiàn)訪問(wèn)修改數(shù)據(jù)庫(kù)的功能.
SQL注入攻擊產(chǎn)生的一個(gè)重要的環(huán)境,是輸入鍵值打造的動(dòng)態(tài)SQL語(yǔ)句經(jīng)過(guò)Web應(yīng)用程序進(jìn)行數(shù)據(jù)庫(kù)操作.如果編寫的代碼要使用存儲(chǔ)的這一過(guò)程,那么,這些存儲(chǔ)過(guò)程將作為用戶輸入的輸入內(nèi)容傳遞,SQL注入在這樣的情況下也容易出現(xiàn).舉一個(gè)常見(jiàn)的SQL注入攻擊例子進(jìn)行說(shuō)明,所描述內(nèi)容采用了用戶輸入字符串和拼接查詢字符串進(jìn)行SQL的查詢[3-4]:
var User Name;
User Name=Raquest. form(“User Name”)
var sql=“select*from Users where User Name=‘“+User Name+”’”;
使用者根據(jù)暗示內(nèi)容填寫一個(gè)用戶名稱,如填寫“xiaoming”這幾個(gè)字節(jié)時(shí),輸出的結(jié)果就是:SELECT* FROM Users WHERE UserName=‘xiaoming’.這時(shí),腳本會(huì)執(zhí)行下面查詢:
SELECT*FROM Users WHERE User Name=‘xiaoming’;droptable Users--
其中:分號(hào)(;)為前面完成與后面查詢的開(kāi)端;“--”為對(duì)前面的內(nèi)容進(jìn)行解釋,基本上理解前面的內(nèi)容,字符后面的內(nèi)容可以不計(jì).代碼改正后,如果沒(méi)有出現(xiàn)問(wèn)題,服務(wù)器就會(huì)直接操作,而SQL Server 操作本語(yǔ)句就會(huì)進(jìn)行查看,并對(duì)Users進(jìn)行清除的行為,這樣一來(lái),將會(huì)產(chǎn)生不可估量的問(wèn)題.
2.1基于ASP.NET+SQL Server的網(wǎng)站攻擊實(shí)例解析
采用后臺(tái)登陸窗口的SQL注入后臺(tái)窗口代碼[5]:
string sqlstr=“select*from administrators
where name=‘“+name+”’and password=‘“+psaa-word+”’”;
Sql Command comm=new SqlCommand(strsql,conn);
OleDbDataReader dr=comm. Execute Reader();
if (!dr.Read())
Response. Write (“〈script〉 alert (用戶名或其對(duì)應(yīng)的密碼不正確)
〈/script〉”);
else
Response.Write (“〈script〉 alert (成功登錄)〈/script〉”);
其中:conn為數(shù)據(jù)庫(kù)連接的對(duì)象;pass-word為密碼;name為使用者昵稱或名字.若以administrator作為操作管理的名字,pass-word設(shè)置為654321,則數(shù)據(jù)庫(kù)接收到來(lái)自ASP.NET 應(yīng)用的SQL 語(yǔ)句為:
select*from administrators where name=‘a(chǎn)d-ministrator’ and pasword=‘654321’
由此可以在數(shù)據(jù)庫(kù)中找到一條符合的數(shù)據(jù),能直接登上賬號(hào).如果用戶輸入的用戶名為‘haha’OR 3<4--,密碼為456 ,那么,ASP.NET應(yīng)用發(fā)送給數(shù)據(jù)庫(kù)服務(wù)器的SQL語(yǔ)句為
select * from administrators where name=‘haha’OR 3<4 --‘a(chǎn)nd password’=‘456’
前面說(shuō)到“--”是解釋內(nèi)容的,那么,3<4 恒為真,OR運(yùn)算中兩個(gè)數(shù)據(jù)只要一個(gè)是對(duì)的,另外一個(gè)也是對(duì)的.按照這樣的方式,前面的SQL 語(yǔ)句where以后的條件成立,那么dr.read()返回的結(jié)果和ad-ministrators表就是正確的,意味著可以登錄.這種方式是登錄賬戶及密碼都是直接操作的一種手段.另外,也有一些不同的操作方法,但是其原理都相同,只需要令dr.read()返回“真”的結(jié)果就可以.
表1 用戶信息表
2.2數(shù)據(jù)更新時(shí)的SQL注入
首先,假設(shè)與后臺(tái)數(shù)據(jù)庫(kù)內(nèi)部存在表users,其結(jié)構(gòu)如表1所示.表1中:用戶名用name表示;密碼用password表示;用戶等級(jí)用level表示,1表示管理員,2 表示正常用戶.當(dāng)普通用戶更新密碼時(shí),代碼[6]如下:
?
strin strsql=“update users set pass-word=‘“+password+”’where name=‘“+name+”’”;
OleDbCommand comm=new OleDbCommand(strsql,conn);
comm. Execute Non Query();
?
在conn處輸入數(shù)據(jù)庫(kù)的連接對(duì)象,其中“password”是數(shù)據(jù)庫(kù)的新密碼,這個(gè)密碼在未操作的情況下反饋到數(shù)據(jù)庫(kù)并進(jìn)行動(dòng)作后,若登錄賬戶xiaogang填寫的密碼是‘789’,level=‘9’,轉(zhuǎn)換成SQL語(yǔ)句并發(fā)送到數(shù)據(jù)庫(kù)為:update users set password=‘789’,level=‘9’ where name=‘xiaogang’.這樣的話,原來(lái)普通用戶xiaogang就變更成管理員.
3.1SQL注入的防范措施
針對(duì)SQL的實(shí)現(xiàn)經(jīng)過(guò)、實(shí)現(xiàn)理論和加入攻擊的特性制定相應(yīng)的抵御方法,從代碼安全上進(jìn)行阻止,如設(shè)置可靠的SQL參數(shù)、給數(shù)據(jù)進(jìn)行加密處理、查驗(yàn)用戶信息、設(shè)置存儲(chǔ)路徑和設(shè)置安全措施.ASP.NET網(wǎng)站通過(guò)上述抵御方法,可以有效地加強(qiáng)其性能和安全,避免SQL注入攻擊的實(shí)現(xiàn)[7-10].
1) 測(cè)試輸入內(nèi)容.程序員測(cè)試輸入內(nèi)容的數(shù)據(jù)大小及類型,強(qiáng)制執(zhí)行輸入內(nèi)容的限制.會(huì)產(chǎn)生異常通常是因?yàn)檩斎肓瞬环弦蟮膬?nèi)容.
2) 測(cè)試字符串變量的內(nèi)容.只輸入允許測(cè)試的數(shù)據(jù)后,才能對(duì)字符串變量進(jìn)行檢測(cè).通常不被允許檢測(cè)的數(shù)據(jù),有以0和1構(gòu)成的二進(jìn)制字符串,“:”(查詢分隔符),“/*…*/”和“-”等注釋符號(hào),“’”(字符串分隔符號(hào)),以及由“”開(kāi)始的轉(zhuǎn)義序列字符.
3) 采用存儲(chǔ)過(guò)程的方式.當(dāng)對(duì)數(shù)據(jù)庫(kù)進(jìn)行程序訪問(wèn)時(shí),設(shè)置存儲(chǔ)路徑必須通過(guò)參數(shù)進(jìn)行錄入,并且盡可能存儲(chǔ)路徑的形式訪問(wèn)數(shù)據(jù)庫(kù).在設(shè)置T-SQL程序代碼的儲(chǔ)存路徑時(shí),要盡可能使用靜態(tài)SQL,而非動(dòng)態(tài)SQL.當(dāng)使用動(dòng)態(tài)SQL時(shí),輸入的參數(shù)不能是具有關(guān)鍵字、列名和表名的SQL語(yǔ)句或者是其中的一部分,必須是能夠建立動(dòng)態(tài)SQL的數(shù)值.在訪問(wèn)過(guò)程中,嚴(yán)禁直接接入SQL后exec執(zhí)行,而應(yīng)該通過(guò)p_executesql和它的形參參數(shù)進(jìn)行訪問(wèn).當(dāng)使用靜態(tài)SQL時(shí),可以自動(dòng)偵測(cè)輸入代表安全代碼的安全字符后,并且自動(dòng)進(jìn)行防御攻擊.長(zhǎng)度檢查特性和類型驗(yàn)證特性存在于SQL Server的Parameters集合中.在使用Parameters集合的過(guò)程中,長(zhǎng)度檢查特性和類型驗(yàn)證特性會(huì)將可操作代碼視為文字,并對(duì)不屬于該范圍的數(shù)據(jù)進(jìn)行報(bào)警處理.
4) 加強(qiáng)安全性.安全種類的SQL參數(shù)在使用程序的拼接語(yǔ)句的過(guò)程中,能夠有效提高其安全穩(wěn)定性.因?yàn)橐徊糠忠蛩氐挠绊懀瑢?dǎo)致在訪問(wèn)數(shù)據(jù)庫(kù)時(shí),程序不可以按照設(shè)置的存儲(chǔ)路徑進(jìn)行.所以,通過(guò)安全種類的SQL參數(shù),才可以對(duì)具有拼接SQL語(yǔ)句的程序進(jìn)行訪問(wèn).
5) 對(duì)敏感數(shù)據(jù)進(jìn)行加密存儲(chǔ).用戶對(duì)敏感數(shù)據(jù)進(jìn)行保存時(shí),實(shí)施加密用戶輸入的數(shù)據(jù)并檢測(cè)輸入數(shù)據(jù)的內(nèi)容的安全性.以存儲(chǔ)在數(shù)據(jù)庫(kù)內(nèi)的數(shù)據(jù)為基礎(chǔ)對(duì)比加密后的敏感數(shù)據(jù),就會(huì)發(fā)現(xiàn)和之前已經(jīng)保存過(guò)的數(shù)據(jù)不同,經(jīng)過(guò)用戶加密后的敏感數(shù)據(jù)能夠更加有效地制止SQL的注入攻擊.System.WEB.Security.FormsAuthentication加密方式在ASP.NET集成環(huán)境中,更易于加密數(shù)據(jù).
6) 禁止將服務(wù)器端錯(cuò)誤消息返回給頁(yè)面瀏覽者.程序設(shè)計(jì)人員可以利用已經(jīng)在程序內(nèi)設(shè)置的數(shù)據(jù)為基礎(chǔ),在操作WEB程序產(chǎn)生問(wèn)題時(shí)發(fā)現(xiàn)起因,并表明嚴(yán)禁數(shù)據(jù)庫(kù)中的數(shù)據(jù)外泄,指向系統(tǒng)顯示錯(cuò)誤界面.比如,對(duì)ASP.Net中的配置文件(WEB.config)進(jìn)行設(shè)置:〈custom Errors mode=“Remote Only” default Redirect=“errors.htm”/〉.設(shè)置完成后,將一致顯示“errors.htm”的自定義的用戶界面,而不再顯示如源文件存儲(chǔ)位置、源錯(cuò)誤位置等具體的原因.
7) 安全部署網(wǎng)站系統(tǒng).a) 數(shù)據(jù)庫(kù)服務(wù)應(yīng)部署在專用的物理服務(wù)器上,而Web應(yīng)用程序則不同,其必須要在多重的物理服務(wù)器上進(jìn)行部署.因此,可以利用交換設(shè)備的訪問(wèn)控制機(jī)制或者防火墻,有效地抵制存儲(chǔ)于數(shù)據(jù)庫(kù)服務(wù)器內(nèi)的數(shù)據(jù)包傳輸至互聯(lián)網(wǎng)的行為.在現(xiàn)實(shí)數(shù)據(jù)訪問(wèn)中,既可以通過(guò)將Web程序與數(shù)據(jù)庫(kù)數(shù)據(jù)分區(qū)存放進(jìn)行實(shí)現(xiàn),也可以通過(guò)分別設(shè)置Web程序和數(shù)據(jù)庫(kù)存儲(chǔ)進(jìn)行實(shí)現(xiàn).b) NTFS格式應(yīng)作為服務(wù)器分區(qū)的唯一格式,以最小權(quán)限為基本原則,合理配置Web程序權(quán)限和數(shù)據(jù)庫(kù)數(shù)據(jù)權(quán)限.c) WEB應(yīng)用程序訪問(wèn)數(shù)據(jù)庫(kù)時(shí),應(yīng)使用具有指定權(quán)限的數(shù)據(jù)庫(kù)賬號(hào).d) 使網(wǎng)絡(luò)環(huán)境更加可靠、安全和Web 應(yīng)用程序更加安全健康.應(yīng)用層安全的基礎(chǔ)是物理層和網(wǎng)絡(luò)層的安全,所以在保障網(wǎng)站本身安全可靠的同時(shí),要注重設(shè)備檢測(cè)由程序輸入的不安全字符和防火墻的合理化,以及定期對(duì)服務(wù)器的執(zhí)行系統(tǒng)產(chǎn)生的補(bǔ)丁進(jìn)行修補(bǔ).
3.2SQL注入的防范策略
1) 嚴(yán)格篩選用戶錄入的數(shù)據(jù)和上交的參數(shù).在對(duì)Web 頁(yè)面進(jìn)行設(shè)計(jì)時(shí),對(duì)數(shù)值型參數(shù),要對(duì)其是否包含非法字符進(jìn)行判斷,要嚴(yán)格篩選含有分號(hào)、雙引號(hào)、單引號(hào)和逗號(hào)等標(biāo)點(diǎn)符號(hào)的字符型參數(shù);當(dāng)一同出現(xiàn)多個(gè)字符串,如select,delete,*,from,union等,也不能消除警惕,應(yīng)以用戶錄入?yún)?shù)的長(zhǎng)短為依據(jù),檢查是否為合法程序,如果不是合法代碼,就對(duì)其進(jìn)行錯(cuò)誤警示.
2) 設(shè)置數(shù)據(jù)庫(kù)服務(wù)器的權(quán)限.在Web界面連接數(shù)據(jù)庫(kù)的時(shí)候,盡可能不使用超級(jí)管理員身份.一般情況下,不允許Web頁(yè)面干涉系統(tǒng)的存儲(chǔ)方式和系統(tǒng)表的讀取方式,即使是戶表,對(duì)權(quán)限設(shè)置也要慎重考慮,對(duì)只需要讀操作權(quán)限的用戶,不給予插入、更新等權(quán)限.
3) 將不重要的交互式提交表格頁(yè)面進(jìn)行關(guān)閉或刪除.在編寫代碼的過(guò)程中,程序員屏蔽掉代碼層內(nèi)常見(jiàn)的危險(xiǎn)字符,這樣就可以阻止或者屏蔽一些簡(jiǎn)單的網(wǎng)站注入攻擊.
4) 作為網(wǎng)站管理員,要及時(shí)打補(bǔ)丁并強(qiáng)化數(shù)據(jù).應(yīng)定期、及時(shí)地通過(guò)相關(guān)設(shè)施和器具檢查Web頁(yè)面收到的攻擊,實(shí)施監(jiān)測(cè)數(shù)據(jù)庫(kù)運(yùn)行情況,禁止一切無(wú)用的功能和服務(wù).
對(duì)于SQL注入漏洞的檢測(cè)條件是有限制的,檢測(cè)效果重點(diǎn)在于代碼覆蓋率.通常情況下,會(huì)采用黑盒測(cè)試技術(shù)進(jìn)行客戶端SQL注入漏洞檢測(cè)技術(shù),當(dāng)然檢測(cè)效果也是取決于所建立檢測(cè)漏洞模型是否準(zhǔn)確,同時(shí),也需要原代碼給予一定的支持,如服務(wù)器端源代碼的靜態(tài)檢測(cè)技術(shù)和動(dòng)態(tài)檢測(cè)技術(shù),及兩種檢測(cè)技術(shù)相結(jié)合共同檢測(cè).但是污點(diǎn)跟蹤技術(shù)是在發(fā)現(xiàn)SQL注入漏洞之后,而且也只是會(huì)終止進(jìn)程或是發(fā)出報(bào)警,無(wú)法對(duì)抗利用漏洞發(fā)起的拒絕服務(wù)攻擊,而綜合檢測(cè)技術(shù)無(wú)法追蹤漏洞的位置和起因等,它只是提供安全部署的框架.
ASP.NET網(wǎng)站開(kāi)發(fā)的信息系統(tǒng)被入侵,是因?yàn)榇a存在的問(wèn)題被入侵者發(fā)現(xiàn).因此,當(dāng)程序員在編寫程序時(shí),首先,檢測(cè)對(duì)客戶端提交的變量參數(shù)和字符變量參數(shù);然后,根據(jù)以下6點(diǎn)防御SQL注入的攻擊.1) 通過(guò)類安全的參數(shù)代碼機(jī)制打造動(dòng)態(tài)SQL語(yǔ)句.2) 簡(jiǎn)短單表輸入和查閱字符會(huì)降低有害代碼強(qiáng)行SQL命令的頻率.3) 檢測(cè)填寫的權(quán)限問(wèn)題,保證填寫的數(shù)據(jù)是可用的,同時(shí),通過(guò)客戶端和服務(wù)器端的雙向驗(yàn)證實(shí)現(xiàn)更嚴(yán)格的訪問(wèn)控制.4) 代碼設(shè)置前先做評(píng)定,脆弱敏感的信息加上密碼后再放置到數(shù)據(jù)庫(kù)中,對(duì)比填寫的密碼是否和數(shù)據(jù)庫(kù)一致,沒(méi)有針對(duì)性意義的數(shù)據(jù)沒(méi)事,有針對(duì)性的則要進(jìn)行防范.5) 對(duì)返回?cái)?shù)據(jù)進(jìn)行檢測(cè),超過(guò)的記錄都按照出錯(cuò)來(lái)進(jìn)行處理.6) 操作者的權(quán)限放置到最基本要求.
[1]馬凱,蔡皖東,姚燁.Web 2.0環(huán)境下SQL注入漏洞注入點(diǎn)提取方法[J].計(jì)算機(jī)技術(shù)與發(fā)展,2013,23(3):121-124,128.
[2]丁允超,范小花.SQL注入攻擊原理及其防范措施[J].重慶科技學(xué)院學(xué)報(bào)(自然科學(xué)版),2012,14(5):136-139.
[3]石聰聰,張濤,余勇,等.一種新的SQL注入防護(hù)方法的研究與實(shí)現(xiàn)[J].計(jì)算機(jī)科學(xué),2012(增刊1):60-64.
[4]王偉平,李昌,段桂華.基于正則表示的SQL注入過(guò)濾模塊設(shè)計(jì)[J].計(jì)算機(jī)工程,2011,37(5):158-160.
[5]周益宏,陳建勛.淺析基于ASP.NET的網(wǎng)站SQL注入攻擊及防范措施[J].計(jì)算機(jī)安全,2010(6):93-95.
[6]王云,郭外萍,陳承歡.Web項(xiàng)目中的SQL注入問(wèn)題研究與防范方法[J].計(jì)算機(jī)工程與設(shè)計(jì),2010,31(5):976-978.
[7]周琰.SQL注入檢測(cè)方法的研究與實(shí)現(xiàn)[D].西安:西北大學(xué),2011:16-20.
[8]竺霞芳.雙層防御SQL注入攻擊的方法[D].武漢:華中科技大學(xué),2011:32-38.
[9]劉合葉.多功能SQL注入檢測(cè)系統(tǒng)的實(shí)現(xiàn)及攻擊防范方法研究[D].北京:北京交通大學(xué),2009:48-52.
[10]陳柏生,吳可沾,楊育輝.互聯(lián)網(wǎng)用戶安全登錄平臺(tái)設(shè)計(jì)[J].華僑大學(xué)學(xué)報(bào)(自然科學(xué)版),2011,32(6):638-640.
(責(zé)任編輯: 黃曉楠 英文審校: 吳逢鐵)
SQL Injection Attacks and Defense Based on ASP.NET
ZHANG Xueyi, ZHONG Zhihong
(School of Computer and Information, Qiannan Normal University for Nationalities, Duyun 558000, China)
This paper research the causes and attack distance of SQL injection attacks, and illustrates through examples the SQL injection attack methods in on the ASP.NET program. The research shows that hazard character verification and abnormalites codes handling are the most important to prevent SQL injection. By using keywords shield, SQL parameter optimization, data encryption, user information check, storage path setting, and implement safety measures can improve the security of ASP.NET website and effectively prevent SQL injection attacks.
ASP.NET; SQL injection attack; defense technology; extraordinary code; code security
10.11830/ISSN.1000-5013.201605021
2016-01-20
張學(xué)義(1970-),男,副教授,主要從事計(jì)算機(jī)網(wǎng)絡(luò)、信息系統(tǒng)開(kāi)發(fā)的研究.E-mail:zxydygz@163.com.
貴州省普通高等學(xué)校地方民族文化數(shù)字化應(yīng)用工程中心開(kāi)放基金項(xiàng)目資助(qnsy2014gc02)
TP 309.1
A
1000-5013(2016)05-0633-04