摘 要:采用ASP.NET和SQL Server數(shù)據(jù)庫(kù)開(kāi)發(fā)了基于B/S架構(gòu)的Web應(yīng)用安全攻防實(shí)訓(xùn)平臺(tái),利用SQL注入構(gòu)造了密碼驗(yàn)證漏洞,并給出了SQL注入漏洞的相關(guān)防范措施。
關(guān)鍵詞:OWASP;SQL注入漏洞;密碼驗(yàn)證;防范設(shè)計(jì)
開(kāi)放式Web應(yīng)用程序安全項(xiàng)目(OWASP:Open Web Application Security Project)在其給出的OWASP Top10_2013中文版安全報(bào)告中指出最危險(xiǎn)的漏洞是A1-注入漏洞。例如SQL,OS以及LDAP注入。這些攻擊發(fā)生在當(dāng)不可信的數(shù)據(jù)作為命令或者查詢(xún)語(yǔ)句的一部分,被發(fā)送給解釋器的時(shí)候。攻擊者發(fā)送的惡意數(shù)據(jù)可以欺騙解釋器,以執(zhí)行計(jì)劃外的命令或者在未被恰當(dāng)授權(quán)時(shí)訪問(wèn)數(shù)據(jù)[1]。
1 SQL注入漏洞分析
SQL注入是一種典型的攻擊方式,在這種攻擊方式中,惡意代碼被插入到字符串中,然后將該字符串傳遞到數(shù)據(jù)庫(kù)中以進(jìn)行分析和執(zhí)行。SQL注入的主要形式包括直接將代碼插入到與SQL命令串聯(lián)在一起并使其得以執(zhí)行的用戶輸入變量。一種間接的攻擊會(huì)將惡意代碼注入要在表中存儲(chǔ)或作為元數(shù)據(jù)存儲(chǔ)的字符串,在存儲(chǔ)的字符串隨后串連到一個(gè)動(dòng)態(tài)SQL命令中時(shí),將執(zhí)行該惡意代碼[2]。為了構(gòu)造和利用SQL注入漏洞,攻擊者必須找到一個(gè)參數(shù)傳遞數(shù)據(jù),然后這個(gè)參數(shù)傳送到操作數(shù)據(jù)庫(kù)的SQL語(yǔ)句中,Web應(yīng)用程序使用該語(yǔ)句操作數(shù)據(jù)庫(kù),可能導(dǎo)致信息泄漏、數(shù)據(jù)丟失、記錄篡改等危害[3]。
為了實(shí)現(xiàn)Web應(yīng)用漏洞的構(gòu)造、攻擊和防范過(guò)程,采用ASP.NET+SQL Server(Access)數(shù)據(jù)庫(kù)開(kāi)發(fā)了基于B/S架構(gòu)的Web應(yīng)用安全攻防實(shí)訓(xùn)平臺(tái),系統(tǒng)部署默認(rèn)采用Windows Sever系列+IIS,后臺(tái)數(shù)據(jù)庫(kù)默認(rèn)采用SQL Server作為后臺(tái)數(shù)據(jù)庫(kù)系統(tǒng),根據(jù)實(shí)際選擇需要可以切斷換到Access數(shù)據(jù)庫(kù)。
2 SQL注入漏洞設(shè)計(jì)與利用
在Web應(yīng)用安全攻防實(shí)訓(xùn)平臺(tái)的登陸模塊中,設(shè)計(jì)了基于SQL注入的密碼驗(yàn)證繞過(guò)漏洞,其密碼驗(yàn)證的關(guān)鍵代碼如下:
SqlConnection Conn=new SqlConnection(WebData.strConn);
String str=\"select * from Admin where UserName='\" +Name.Text+\"'and UserPwd = '\"+Pwd.Text+\"' \";
SqlCommand Cmd=new SqlCommand(str,Conn);
Conn.Open ();
SqlDataReader Dr=Cmd.ExecuteReader ();
此段代碼通過(guò)串聯(lián)硬編碼字符串和用戶輸入的字符串而生成一個(gè)SQL查詢(xún):
String str=\"select * from Admin where UserName='\"+Name.Text+\"'and UserPwd='\"+Pwd.Text+\"' \";
當(dāng)用戶輸入用戶和密碼都是admin時(shí),此SQL語(yǔ)句變成了如下查詢(xún)語(yǔ)句:
String str=\"select*from Admin where UserName='admin' and UserPwd='admin' \";
然后此語(yǔ)句被提交給數(shù)據(jù)庫(kù)進(jìn)行查詢(xún)。但是,假定用戶在管理帳號(hào)處輸入以下內(nèi)容:admin' or '1'='1 在管理密碼輸入test后,此SQL語(yǔ)句變成了如下查詢(xún)語(yǔ)句:
String str=\"select*from Admin where UserName='admin' or '1'='1' and UserPwd='test' \";
然后此語(yǔ)句被提交給數(shù)據(jù)庫(kù)進(jìn)行查詢(xún),由于構(gòu)造的SQL語(yǔ)句中or'1'='1'語(yǔ)句的存在并且條件永遠(yuǎn)為真,導(dǎo)致UserPwd='test'語(yǔ)句部分被忽略,所以構(gòu)造出來(lái)的特殊輸入繞過(guò)了密碼驗(yàn)證環(huán)節(jié)直接進(jìn)入了平臺(tái)管理后臺(tái)。
3 SQL注入漏洞防范
在OWASP Top10_2013中文版安全報(bào)告中A1-注入漏洞,包括SQL,OS以及 LDAP注入。因此SQL注入漏洞的防范首先要對(duì)部署平臺(tái):包括操作系統(tǒng)(OS)、Web服務(wù)器和數(shù)據(jù)庫(kù)的安全進(jìn)行合理的配置,并在開(kāi)發(fā)過(guò)程中注意遵循的規(guī)則包括:
⑴使用參數(shù)化查詢(xún)(Parameterized Query)進(jìn)行SQL數(shù)據(jù)查詢(xún)存取,在需要提交數(shù)據(jù)或數(shù)值的地方,使用參數(shù) (Parameter)進(jìn)行值傳遞。數(shù)據(jù)庫(kù)服務(wù)器不會(huì)將參數(shù)內(nèi)容視為SQL指令的一部份來(lái)處理,而是在數(shù)據(jù)庫(kù)完成SQL指令的編譯后,才附加參數(shù)值運(yùn)行[4]。因此就算參數(shù)值中含有惡意的語(yǔ)句或指令,由于已經(jīng)編譯完成,因此不會(huì)被數(shù)據(jù)庫(kù)所運(yùn)行。
⑵盡量使用存儲(chǔ)過(guò)程SQL數(shù)據(jù)查詢(xún)存取,由于存儲(chǔ)過(guò)程是存儲(chǔ)在數(shù)據(jù)庫(kù)管理系統(tǒng)中,使用時(shí)由程序通過(guò)參數(shù)傳遞數(shù)值并可以驗(yàn)證,對(duì)于數(shù)據(jù)的訪問(wèn)是基于存儲(chǔ)過(guò)程而不是直接訪問(wèn)數(shù)據(jù)表,可以有效防止對(duì)數(shù)據(jù)表的猜測(cè)。
⑶使用正則表達(dá)式來(lái)驗(yàn)證提交信息中是否包含單引號(hào)(’)、分號(hào)(;)、結(jié)束符(--)等特殊字符,在上面提交的密碼信息admin'or'1'='1就可以被檢測(cè)出來(lái)異常。檢測(cè)提交信息中是否包含and、or、select、update、exec等特殊命令,這些命令有可能被帶入到數(shù)據(jù)庫(kù)并被操作執(zhí)行。
4 結(jié)束語(yǔ)
在OWASP提供安全報(bào)告中的A1-注入漏洞,對(duì)SQL漏洞原因進(jìn)行了分析、并在此基礎(chǔ)上構(gòu)造和設(shè)計(jì)密碼驗(yàn)證漏洞,從使用參數(shù)化查詢(xún)、存儲(chǔ)過(guò)程以及對(duì)對(duì)提交信息進(jìn)行驗(yàn)證的角度給出了SQL注入漏洞的防護(hù)措施。
[參考文獻(xiàn)]
[1]OWASP.OWASP 2013 Top 10中文版[R].http://www.owasp.org.cn/owasp-project/download/OWASPTop10 2013V1.2.pdf.2014-03-01.
[2]Microsoft.SQL注入.http://technet.microsoft.com/zh-cn/library/ms161953.aspx[EB/OL].2014-03-01.
[3]張紅瑞,郝建,呂延崗.Web應(yīng)用安全攻防實(shí)訓(xùn)平臺(tái)的設(shè)計(jì)與實(shí)現(xiàn)[J].學(xué)周刊,2014,2:28-29.
[4]李曉龍.基于SQL注入攻擊的三種防御技術(shù)[J].湖北文理學(xué)院學(xué)報(bào),2013,34(5):18-21.