摘 要:飛速發(fā)展的互聯(lián)網(wǎng)及其相關(guān)應(yīng)用,在為人們生活帶來(lái)大量便利的同時(shí),也帶來(lái)了巨大的安全風(fēng)險(xiǎn),攻擊者利用Web應(yīng)用程序的安全缺陷,攻擊竊取網(wǎng)站數(shù)據(jù)庫(kù)中的敏感數(shù)據(jù)。其中SQL注入攻擊相對(duì)于其他攻擊入侵手段入門容易,防火墻不能對(duì)其有效地進(jìn)行防范,成為了黑客主要的攻擊手段之一。教師要讓學(xué)生了解SQL注入攻擊的基本原理和防范方法,加強(qiáng)互聯(lián)網(wǎng)攻擊防范技能培養(yǎng),助職校生成才。
關(guān)鍵詞:技能培養(yǎng);SQL注入攻擊;職校生成才
隨著計(jì)算機(jī)和互聯(lián)網(wǎng)的普及,以協(xié)同工作環(huán)境、社會(huì)性網(wǎng)絡(luò)服務(wù)及托管應(yīng)用程序?yàn)榇淼幕贐/S模式(即Browser/Server結(jié)構(gòu))開(kāi)發(fā)的WEB技術(shù),在為人們生活帶來(lái)大量便利的同時(shí),也帶來(lái)了巨大的安全風(fēng)險(xiǎn),攻擊者利用Web應(yīng)用程序的安全缺陷,可以通過(guò)攻擊Web應(yīng)用程序,竊取網(wǎng)站數(shù)據(jù)庫(kù)中的敏感數(shù)據(jù),以及執(zhí)行某些未授權(quán)的危險(xiǎn)操作命令。
據(jù)OWASP組織統(tǒng)計(jì),包括SQL注入、惡意腳本注入、Shell注入和其他注入攻擊在內(nèi)的代碼注入是針對(duì)Web應(yīng)用程序的主流攻擊技術(shù)之一。其中SQL注入攻擊雖然早在1997年就已經(jīng)被披露,相關(guān)的機(jī)構(gòu)也極力完善與其相關(guān)的各種漏洞,但由于使用正常的WWW端口訪問(wèn),使用的SQL語(yǔ)法漏洞與服務(wù)器平臺(tái)及應(yīng)用程序無(wú)關(guān),技術(shù)難度不高,防火墻不能對(duì)其進(jìn)行有效防范等特點(diǎn),時(shí)至今日,依然是黑客的主要攻擊手段之一。根據(jù)數(shù)據(jù)應(yīng)用安全提供商Imperva公司2012年10月的網(wǎng)絡(luò)攻擊分析報(bào)告顯示,在黑客論壇上所有的被關(guān)注的Web應(yīng)用程序攻擊技術(shù)中,SQL注入攻擊的關(guān)注率高居榜首。
而伴隨國(guó)內(nèi)互聯(lián)網(wǎng)的飛速發(fā)展,導(dǎo)致該行業(yè)需要大量的程序員編寫B(tài)/S應(yīng)用程序滿足市場(chǎng)要求。由于需求量大,入門門檻不高,因而國(guó)內(nèi)許多職業(yè)技工學(xué)校開(kāi)設(shè)了網(wǎng)站設(shè)計(jì)和網(wǎng)絡(luò)管理類的專業(yè),培養(yǎng)這方面的人員,滿足市場(chǎng)要求。然而,相當(dāng)大一部分程序員的水平及經(jīng)驗(yàn)不足,在編寫代碼的時(shí)候,沒(méi)有對(duì)潛在的安全隱患進(jìn)行防范,可能導(dǎo)致網(wǎng)站輕易被攻破,造成嚴(yán)重的經(jīng)濟(jì)損失。因此,教師要讓學(xué)生了解SQL注入攻擊的基本原理和防范方法,加強(qiáng)互聯(lián)網(wǎng)攻擊防范技能培養(yǎng),讓職校生成為優(yōu)秀的專業(yè)人才。
一、SQL注入攻擊原理
SQL語(yǔ)言是一種一體化、高度非過(guò)程化的數(shù)據(jù)庫(kù)數(shù)據(jù)訪問(wèn)的標(biāo)準(zhǔn)語(yǔ)言,提供了包括數(shù)據(jù)定義、數(shù)據(jù)操縱、數(shù)據(jù)控制以及最常用的數(shù)據(jù)查詢?cè)趦?nèi)的與數(shù)據(jù)庫(kù)相關(guān)的全部功能,并且SQL除了以命令方式之外,還支持以嵌入其他程序設(shè)計(jì)語(yǔ)言中使用的方式。
用戶訪問(wèn)網(wǎng)絡(luò)上的網(wǎng)頁(yè)時(shí),是通過(guò)后臺(tái)服務(wù)器上使用類似于“Select 相關(guān)字段 from 表名 where 條件”的查詢語(yǔ)句從后臺(tái)數(shù)據(jù)庫(kù)訪問(wèn),從而獲得用戶所需的數(shù)據(jù)。在這過(guò)程中,由于查詢語(yǔ)句是由服務(wù)器的代碼和用戶的輸入組合生成的,如果利用SQL語(yǔ)言中的某些特殊轉(zhuǎn)義字符,如單引號(hào)、分號(hào),可能使得預(yù)先設(shè)定的限制無(wú)效,從而改變SQL查詢語(yǔ)句的執(zhí)行順序,并執(zhí)行某些非預(yù)期的SQL指令代碼,造成數(shù)據(jù)庫(kù)中的敏感信息被泄露或被篡改的嚴(yán)重后果。當(dāng)攻擊者能夠通過(guò)往查詢中插入一系列的SQL操作將數(shù)據(jù)寫入到應(yīng)用程序中去,并對(duì)數(shù)據(jù)庫(kù)實(shí)施了查詢,這時(shí)就構(gòu)成了SQL注入(SQL Injection)。
SQL注入攻擊主要是通過(guò)構(gòu)建特殊的輸入,將SQL語(yǔ)法中的某些組合作為參數(shù)傳入Web應(yīng)用程序,通過(guò)執(zhí)行SQL語(yǔ)句而執(zhí)行入侵者想要的操作。以登錄網(wǎng)站為例,假定網(wǎng)站將注冊(cè)用戶的編號(hào)、用戶名及其對(duì)應(yīng)的密碼分別存放于名為login的表中的id、uname和psw字段中,處理用戶登錄的動(dòng)態(tài)頁(yè)面代碼如下:
InputUName = request.form(“uname”)
InputPSW = request.form(“psw”)
Set conn = Server.CreateObject(“ADODB.Connection”)
Conn.open“Driver = {SQL Server};Server = WEBSVR;DataBase = WebDB;UID = sa;WD = 123”
Set rso = server. CreateObject(“ADODB.RecordSet”)
sql= “SELECT * FROM login WHERE uname=”’ & InputUName&’” AND psw =”’ & InputPSW &’””
Rso.Open sql,cn
if rso.eof then
response.write(“l(fā)ogin error: username or password incorrect”)
else
response.write(“l(fā)ogin success”)
end if
輸入用戶名“guest”和密碼“123456”后,提交到后臺(tái)數(shù)據(jù)庫(kù)的查詢語(yǔ)句為:SELECT * FROM login WHERE uname=’guest’AND psw=’123456’.當(dāng)表login存在guest 用戶且其密碼為123456,則輸出登錄成功的信息,反之輸出錯(cuò)誤提示。然而,如果攻擊者用字符串“guest’ OR ‘1’=’1”代替原有的用戶名和密碼輸入,則后臺(tái)數(shù)據(jù)庫(kù)組裝的SQL語(yǔ)句將會(huì)變?yōu)椋篠ELECT * FROM login WHERE uname=’guest’OR‘1’=’1’AND psw=’guest’OR‘1’=’1’. 顯然WHERE子句由于表達(dá)式‘1’=’1’是永真式而失去了作用,不能起到判別用戶是否合法的效果,所以攻擊者即使不知道用戶名和密碼,也可以成功登錄網(wǎng)站。
二、SQL注入攻擊過(guò)程
學(xué)生先要了解SQL注入攻擊過(guò)程,這樣,才能進(jìn)行有針對(duì)性地防范。SQL注入攻擊可以手工輸入,也可以通過(guò)如HDSI、Domain、NBSI等SQL注入攻擊輔助軟件,其實(shí)現(xiàn)過(guò)程可以歸納為以下幾個(gè)階段。
(1)第一步:判斷是否可以SQL注入。如果URL僅是對(duì)網(wǎng)頁(yè)的訪問(wèn),不存在SQL注入問(wèn)題,如:http:// websitename/index.html就是普通的網(wǎng)頁(yè)訪問(wèn)。只有對(duì)數(shù)據(jù)庫(kù)進(jìn)行動(dòng)態(tài)查詢的業(yè)務(wù)才可能存在SQL注入,如:http://websitename/filename.asp?id=xxx,其中?id=xxx表示數(shù)據(jù)庫(kù)查詢變量,這種語(yǔ)句會(huì)在數(shù)據(jù)庫(kù)中執(zhí)行,因此可能會(huì)給數(shù)據(jù)庫(kù)帶來(lái)威脅。
(2)第二步:尋找SQL注入點(diǎn)。對(duì)于使用了動(dòng)態(tài)查詢?cè)L問(wèn)數(shù)據(jù)庫(kù)的頁(yè)面,如果編寫代碼的程序員沒(méi)有安全意識(shí)和檢查變量類型及過(guò)濾轉(zhuǎn)義字符,則攻擊者可能利用這些漏洞,通過(guò)輸入一些特殊語(yǔ)句,并根據(jù)輸入特殊語(yǔ)句后瀏覽器返回信息,判斷數(shù)據(jù)庫(kù)類型,從而構(gòu)建數(shù)據(jù)庫(kù)查詢語(yǔ)句找到注入點(diǎn)。
尋找SQL注入點(diǎn)的經(jīng)典查找方法是在有參數(shù)傳入的地方添加諸如“and 1=1”“and 1=2”以及“’”等一些特殊字符,通過(guò)瀏覽器所返回的錯(cuò)誤信息來(lái)判斷是否存在SQL注入。如果返回錯(cuò)誤,則表明程序未對(duì)輸入的數(shù)據(jù)進(jìn)行處理,絕大部分情況下都能進(jìn)行注入。
對(duì)于形如http://websitename/filename.asp?id=xxx 的動(dòng)態(tài)網(wǎng)頁(yè), 通常數(shù)據(jù)庫(kù)的SQL操作語(yǔ)句是Select colummnnames from tablenames where id=xxx.為了確定網(wǎng)頁(yè)是否存在注入點(diǎn),通常將參數(shù)xxx設(shè)為三種不同的字符串。①xxx’.在輸入數(shù)據(jù)后加單引號(hào),將會(huì)導(dǎo)致引號(hào)不匹配引起的SQL錯(cuò)誤,網(wǎng)頁(yè)將返回錯(cuò)誤提示信息。②xxx’and‘1’=’1,后臺(tái)SQL語(yǔ)句變?yōu)?Select colummnnames from tablenames where id=xxx and ‘1’=’1’。由于‘1’=’1’永真,不對(duì)查詢產(chǎn)生影響,返回正常頁(yè)面。③xxx’and‘1’=’2’,后臺(tái)SQL語(yǔ)句變?yōu)?Select colummnnames from tablenames where id=xxx and‘1’=’2’。由于‘1’=’2’永假,查詢語(yǔ)句查詢不到任何信息,返回空白頁(yè)面或錯(cuò)誤信息。若三種輸入都能獲得攻擊者預(yù)期的結(jié)果,則可以證明該網(wǎng)站缺乏嚴(yán)格的檢查和過(guò)濾,存在注入點(diǎn)。
(3)第三步:猜解用戶名和密碼。數(shù)據(jù)庫(kù)中存放的表名、字段名都是有規(guī)律可言的。通過(guò)構(gòu)建特殊數(shù)據(jù)庫(kù)語(yǔ)句在數(shù)據(jù)庫(kù)中依次查找表名、字段名、用戶名和密碼的長(zhǎng)度,以及內(nèi)容。這個(gè)猜測(cè)過(guò)程可以通過(guò)網(wǎng)上大量注入工具快速實(shí)現(xiàn),并借助破解網(wǎng)站輕易破譯用戶密碼。
猜用戶名與密碼的內(nèi)容最常用也是最有效的方法有:①ASCII碼逐字解碼法:雖然這種方法速度較慢,但肯定是可行的?;镜乃悸肥窍炔鲁鲎侄蔚拈L(zhǎng)度,然后依次猜出每一位的值。猜用戶名與猜密碼的方法相同。②簡(jiǎn)單法:猜用戶名用HTTP://www. websitename.com/news.asp?id=xx and (select top 1 flag from TestDB.dbo.admin where username>1) ,flag是admin表中的一個(gè)字段,username是用戶名字段,此時(shí)news.asp工作異常,但能得到Username的值。③猜用戶密碼:HTTP://www.websitename.com/news.asp?id=xx and (select top 1 flag from TestDB.dbo.admin where pwd>1) , flag是admin表中的一個(gè)字段,pwd是密碼字段,此時(shí)news.asp工作異常,但能得到pwd的值。同樣的方法,可以得到第二用戶名的密碼,第三個(gè)用戶的密碼等等,直到得到表中的所有用戶的密碼。
(4)第四步:尋找WEB管理后臺(tái)入口。通常WEB后臺(tái)管理的界面不面向普通用戶開(kāi)放,要尋找到后臺(tái)的登陸路徑,可以利用掃描工具快速搜索到可能的登陸地址,依次進(jìn)行嘗試,就可以試出管理臺(tái)的入口地址。
(5)第五步:入侵和破壞。成功登陸后臺(tái)管理后,接下來(lái)就可以任意進(jìn)行破壞行為,如篡改網(wǎng)頁(yè)、上傳木馬、修改、泄漏用戶信息等,并進(jìn)一步通過(guò)網(wǎng)絡(luò)滲透等攻擊技術(shù),入侵?jǐn)?shù)據(jù)庫(kù)服務(wù)器獲取公司或者企業(yè)機(jī)密數(shù)據(jù)信息,造成重大經(jīng)濟(jì)損失。
三、SQL注入的檢測(cè)
SQL注入攻擊檢測(cè)分為入侵前的檢測(cè)和入侵后的檢測(cè),入侵前的檢測(cè),可以通過(guò)手工方式,也可以使用SQL注入工具軟件。檢測(cè)的目的是為預(yù)防SQL注入攻擊,而對(duì)于SQL注入攻擊后的檢測(cè),主要是針對(duì)日志的檢測(cè),SQL注入攻擊成功后,會(huì)在IIS日志和數(shù)據(jù)庫(kù)中留下“痕跡”。
數(shù)據(jù)庫(kù)檢查:使用HDSI、NBSI和Domain等SQL注入攻擊軟件工具進(jìn)行SQL注入攻擊后,都會(huì)在數(shù)據(jù)庫(kù)中生成一些臨時(shí)表。通過(guò)查看數(shù)據(jù)庫(kù)中最近新建的表的結(jié)構(gòu)和內(nèi)容,可以判斷是否曾經(jīng)發(fā)生過(guò)SQL注入攻擊。
IIS日志檢查:在Web服務(wù)器中如果啟用了日志記錄,則IIS日志會(huì)記錄訪問(wèn)者的IP地址,訪問(wèn)文件等信息,SQL注入攻擊往往會(huì)大量訪問(wèn)某一個(gè)頁(yè)面文件(存在SQL注入點(diǎn)的動(dòng)態(tài)網(wǎng)頁(yè)),日志文件會(huì)急劇增加,通過(guò)查看日志文件的大小以及日志文件中的內(nèi)容,也可以判斷是否發(fā)生過(guò)SQL注入攻擊。
其他相關(guān)信息判斷:SQL注入攻擊成功后,入侵者往往會(huì)添加用戶、開(kāi)放3389遠(yuǎn)程終端服務(wù)以及安裝木馬后門等??梢酝ㄟ^(guò)查看系統(tǒng)管理員賬號(hào)、遠(yuǎn)程終端服務(wù)器開(kāi)啟情況、系統(tǒng)最近日期產(chǎn)生的一些文件等信息來(lái)判斷是否發(fā)生過(guò)入侵。
四、SQL注入的防范
綜上所述,針對(duì)大多數(shù)的SQL注入攻擊利用了應(yīng)用程序沒(méi)有對(duì)客戶端輸入進(jìn)行嚴(yán)格的過(guò)濾和類型檢查的特點(diǎn),可以制定相應(yīng)的輸入驗(yàn)證機(jī)制,對(duì)客戶端輸入中的特殊字符、輸入類型以及輸入?yún)?shù)的長(zhǎng)度進(jìn)行嚴(yán)格檢查和限制。
具體而言,可以從以下幾方面進(jìn)行防范。
①使用參數(shù)編碼機(jī)制封裝客戶端提交信息。利用客戶端輸入?yún)?shù)生成動(dòng)態(tài)SQL語(yǔ)句時(shí),注意參數(shù)的類型安全,明確指定輸入?yún)?shù)的確切類型,使用安全的參數(shù)編碼機(jī)制,用以保證輸入能夠正確地被編碼。
②檢查所有外部的輸入,替換或刪除敏感字符、字符串。對(duì)來(lái)自外部的輸入,在服務(wù)器正式處理之前對(duì)提交數(shù)據(jù)的合法性進(jìn)行檢查,進(jìn)行完備的檢查過(guò)濾。對(duì)包含SQL語(yǔ)句的保留字符(如:引號(hào)、分號(hào)、百分號(hào)等)的語(yǔ)句進(jìn)行限制,拒絕語(yǔ)句的執(zhí)行或使用轉(zhuǎn)義操作將這些符號(hào)轉(zhuǎn)換為非保留字符。
③以存儲(chǔ)過(guò)程、預(yù)編譯SQL或ADO命令對(duì)象的形式代替應(yīng)用程序中的動(dòng)態(tài)SQL語(yǔ)句。在應(yīng)用程序調(diào)用存儲(chǔ)過(guò)程、預(yù)編譯SQL或ADO命令對(duì)象時(shí),客戶端輸入數(shù)據(jù)的形式必須遵守被調(diào)用的這些對(duì)象在程序中的上下文的限制,變量不是可以執(zhí)行的腳本,因而大大增加了攻擊者注入SQL代碼的難度。
④加強(qiáng)SQL數(shù)據(jù)庫(kù)服務(wù)器的配置和連接,屏蔽出錯(cuò)信息。1)加強(qiáng)SQL數(shù)據(jù)庫(kù)服務(wù)器的配置及WEB應(yīng)用程序的連接;2)避免將敏感的數(shù)據(jù)明文存放;3)以最小權(quán)限原則配置應(yīng)用程序連接數(shù)據(jù)庫(kù)的查詢操作權(quán)限;4)移除Web服務(wù)器上默認(rèn)的一些危險(xiǎn)命令,例531902ae51282561aaa70fd7073b7566如ftp、cmd、wscript等,需要使用這些功能臨時(shí)復(fù)制到相應(yīng)目錄;5)以不泄漏有價(jià)值信息的出錯(cuò)處理機(jī)制代替系統(tǒng)默認(rèn)的出錯(cuò)提示。
⑤目錄最小化權(quán)限設(shè)置,給靜態(tài)網(wǎng)頁(yè)目錄和動(dòng)態(tài)網(wǎng)頁(yè)目錄分別設(shè)置不同權(quán)限,盡量不給寫目錄權(quán)限。
小結(jié):SQL注入攻擊可以說(shuō)是一種漏洞,程序中的變量處理不當(dāng),對(duì)用戶提交的數(shù)據(jù)過(guò)濾不足等,都可能造成這一漏洞。而如前文所述,SQL注入由于使用正常的WWW端口訪問(wèn),防火墻不能對(duì)其有效地進(jìn)行防范,相比于其他攻擊入侵手段,攻擊者能夠更容易地通過(guò)用戶提交的數(shù)據(jù),將惡意的SQL命令注入到后臺(tái)數(shù)據(jù)庫(kù),獲得管理權(quán)限對(duì)目標(biāo)數(shù)據(jù)庫(kù)進(jìn)行非法操作,修改和竊取目標(biāo)數(shù)據(jù)庫(kù)中的數(shù)據(jù)。并且相對(duì)于其他攻擊手段,SQL注入攻擊無(wú)須復(fù)雜的編程,需要掌握的相關(guān)知識(shí)更少,入門更容易。因而在其攻擊方式被披露后,歷經(jīng)十余載,仍然是黑客入侵網(wǎng)站數(shù)據(jù)庫(kù)的熱門手段。
在實(shí)踐中,為防止SQL注入攻擊,需要完善網(wǎng)站的應(yīng)用代碼,同時(shí)結(jié)合強(qiáng)化數(shù)據(jù)庫(kù)服務(wù)器安全架構(gòu),監(jiān)視記錄數(shù)據(jù)庫(kù)整個(gè)運(yùn)行過(guò)程等多種方式,構(gòu)建一個(gè)強(qiáng)大的防御體系,防止可能的SQL注入漏洞被攻擊者利用。
總之,教師要讓學(xué)生了解SQL注入攻擊的基本原理和防范方法,加強(qiáng)互聯(lián)網(wǎng)攻擊防范技能培養(yǎng),讓職校生早日成為優(yōu)秀的計(jì)算機(jī)專業(yè)人才。
參考文獻(xiàn):
[1]諸葛建偉.網(wǎng)絡(luò)攻防技術(shù)與實(shí)踐[M].北京:電子工業(yè)出版社,
2011.
[2]何玉潔.數(shù)據(jù)庫(kù)原理與應(yīng)用[M].北京:機(jī)械工業(yè)出版社,2011.