新疆 孫俊德
SQL注入攻擊與防范技術(shù)
新疆 孫俊德
通過對(duì)目前常見的SQL注入攻擊的行為分析,網(wǎng)站管理人員從中了解并采用相關(guān)的防范技術(shù),保障網(wǎng)站數(shù)據(jù)庫的安全。本文通過對(duì)SQL注入攻擊過程的分析,有針對(duì)性提出如何增強(qiáng)網(wǎng)站抗SQL注入攻擊的措施。
SQL注入;黑客;網(wǎng)站安全
SQL注入攻擊可以算是互聯(lián)網(wǎng)上最為流傳最為廣泛的攻擊方式,許多企業(yè)網(wǎng)站先后遭此攻擊。所謂SQL注入(SQL Injection),就是利用程序員對(duì)用戶輸入數(shù)據(jù)的合法性檢測(cè)不嚴(yán)或不檢測(cè)的特點(diǎn),故意從客戶端提交特殊的代碼,從而收集程序及服務(wù)器的信息,查詢數(shù)據(jù)庫。
(1)一些網(wǎng)站的管理登陸頁面對(duì)輸入的用戶名和密碼沒有做SQL過濾,導(dǎo)致網(wǎng)站被攻擊。
這里假設(shè)一個(gè)沒有嚴(yán)格過濾SQL字符的管理登陸界面。事實(shí)上黑客并不需要知道用戶名和密碼,那么黑客只需在用戶名里面輸入"'or 1=1--",密碼任意輸入,提交后,系統(tǒng)認(rèn)為用戶名為空('')或者(1=1恒成立),后面不執(zhí)行(--),就無需驗(yàn)證密碼直接進(jìn)入后臺(tái)。
(2)下面的查詢語句在有注入漏洞的服務(wù)器上被惡意利用也會(huì)導(dǎo)致嚴(yán)重后果。
String SqlStr=”Select*from customers where CompanyName like'%"+textBox1.Text+"%"';
這樣的字符串連接可能會(huì)帶來災(zāi)難性的結(jié)果,比如用戶在文本框中輸入:
a'or1=1
那么SqlStr的內(nèi)容就是:
select*from customers where CompanyName like'%a'or1=1--%'
這樣,整個(gè)customers數(shù)據(jù)表的所有數(shù)據(jù)就會(huì)被全部檢索出來,因?yàn)?=1永遠(yuǎn)true,而且最后的百分號(hào)和單引號(hào)被短橫杠注釋掉了。
如果用戶在文本框中輸入:
a'EXEC sP_addlogin'John','123'EXEC sP_addsrvrolemember'John','sysadmin'--
那么SqlStr的內(nèi)容就是:
select*from customers where CompanyName like'%a'EXEC sp_addlogin'John','123'
EXECsp_addsrvrolemember'John','sysadmin'--
該語句是在后臺(tái)數(shù)據(jù)庫中增加一個(gè)用戶John,密碼123,而且是一個(gè)sysadmin賬號(hào),相當(dāng)于sa的權(quán)限。
如果用戶這時(shí)在文本框中輸入:a'EXECxp_cmdShell('formatc:/y')--運(yùn)行之后就開始格式化C盤!
(3)通過注入獲得管理員賬戶密碼。
一個(gè)正常的網(wǎng)址http://localhost/lawjia/show.asp?ID=101,將這個(gè)網(wǎng)址提交到服務(wù)器后,服務(wù)器將進(jìn)行類似Select*from表名 where字段="&ID的查詢(ID即客戶端提交的參數(shù),本例是即101),再將查詢結(jié)果返回給客戶端。
當(dāng)某人知道網(wǎng)站管理員帳號(hào)存儲(chǔ)在表login中,其用戶名為admin,如果想知道管理員密碼,此時(shí)他可從客戶端接著提交這樣一個(gè)網(wǎng)址:
http://localhost/lol/show.asp?ID=101 and(Select password from login where user_name='admin')>0
返回的出錯(cuò)信息如下:
MicrosoftOLEDBProvider forODBCDrivers(0x80040E07)
[Microsoft][ODBC SQL Server Driver][SQL Server] 將 varchar 值 '!@huway**a'轉(zhuǎn)換為數(shù)據(jù)類型為int的列時(shí)發(fā)生語法錯(cuò)誤。
/lol/show.asp,第 27 行
黑體字部分即為返回密碼
(4)通過工具進(jìn)行注入攻擊測(cè)試。
如何判斷一個(gè)網(wǎng)站能否被注入,首先找到注入點(diǎn),像上面提到的“/show.asp?ID=101”就是一個(gè)注人點(diǎn),很多新聞系統(tǒng)的新聞顯示頁面、產(chǎn)品發(fā)布顯示頁面都有類似ID=101的標(biāo)志,在ID=101后面直接輸入and 1=1,如果沒有出錯(cuò),仍然返回原先顯示頁面,這就是一個(gè)注人漏洞,如果返回您的網(wǎng)址不合法,顯然己經(jīng)做了SQL過濾。
顯然人工猜測(cè)表名是一件麻煩事情,但大多存放管理員的賬戶的表通常為addmin,guan,login這樣簡(jiǎn)單單詞,通過黑客工具附帶字典,先確定表的名稱,接著猜測(cè)字段,然后窮學(xué)查詢字段第一位、第二、第三位…,直到全部出來,借助工具,對(duì)有注人漏洞網(wǎng)站攻擊成功率可達(dá)60%以上。注入工具有NBSI、啊 D、Domain 等。
以上僅是對(duì)SQL攻擊的粗略分類。但從技術(shù)上講,如今的SQL注入攻擊者們?cè)谌绾握页鲇新┒吹木W(wǎng)站方面更加聰明,也更加全面了。出現(xiàn)了一些新型的SQL攻擊手段。黑客們可以使用各種工具來加速漏洞的利用過程。
2.1 使用參數(shù)化的過濾性語句
要防御SQL注入,用戶的輸入就絕對(duì)不能直接被嵌入到SQL語句中。恰恰相反,用戶的輸入必須進(jìn)行過濾,或者使用參數(shù)化的語句。參數(shù)化的語句使用參數(shù)而不是將用戶輸入嵌入到語句中。在多數(shù)情況中,SQL語句就得以修正。然后,用戶輸入就被限于一個(gè)參數(shù)。下面是一個(gè)使用Java和JDBCAPI例子:
PreparedStatement prep=conn.prepareStatement("SELECT*FROM USERS WHEREPASSWORD=?");
prep.setString(1,pwd);
總體上講,有兩種方法可以保證應(yīng)用程序不易受到SQL注入的攻擊,一是使用代碼復(fù)查,二是強(qiáng)迫使用參數(shù)化語句的。強(qiáng)迫使用參數(shù)化的語句意味著嵌入用戶輸入的SQL語句在運(yùn)行時(shí)將被拒絕。不過,目前支持這種特性的并不多。如H2數(shù)據(jù)庫引擎就支持。
2.2 還要避免使用解釋程序,因?yàn)檫@正是黑客們借以執(zhí)行非法命令的手段。
2.3 防范SQL注入,還要避免出現(xiàn)一些詳細(xì)的錯(cuò)誤消息,因?yàn)楹诳蛡兛梢岳眠@些消息。要使用一種標(biāo)準(zhǔn)的輸入確認(rèn)機(jī)制來驗(yàn)證所有的輸入數(shù)據(jù)的長(zhǎng)度、類型、語句、企業(yè)規(guī)則等。
2.4 使用專業(yè)的漏洞掃描工具。但防御SQL注入攻擊也是不夠的。攻擊者們目前正在自動(dòng)搜索攻擊目標(biāo)并實(shí)施攻擊。其技術(shù)甚至可以輕易地被應(yīng)用于其它的Web架構(gòu)中的漏洞。企業(yè)應(yīng)當(dāng)投資于一些專業(yè)的漏洞掃描工具,如大名鼎鼎的Acunetix的Web漏洞掃描程序等。一個(gè)完善的漏洞掃描程序不同于網(wǎng)絡(luò)掃描程序,它專門查找網(wǎng)站上的SQL注入式漏洞。最新的漏洞掃描程序可以查找最新發(fā)現(xiàn)的漏洞。
建議Web應(yīng)用程序的程序員們對(duì)其代碼進(jìn)行測(cè)試并打補(bǔ)丁,雖然SQL注入漏洞被發(fā)現(xiàn)和利用的機(jī)率并不太高。但近來攻擊者們?cè)絹碓蕉嗟匕l(fā)現(xiàn)并惡意地利用這些漏洞。因此,在部署其軟件之前,開發(fā)人員應(yīng)當(dāng)更加主動(dòng)地測(cè)試其代碼,并在新的漏洞出現(xiàn)后立即對(duì)代碼打補(bǔ)丁,做為網(wǎng)站管理人員要在Web應(yīng)用程序開發(fā)過程的所有階段實(shí)施代碼的安全檢查。首先,要在部署Web應(yīng)用之前實(shí)施安全測(cè)試,這種措施的意義比以前更大、更深遠(yuǎn)。網(wǎng)站管理人員還應(yīng)當(dāng)在部署之后用漏洞掃描工具和站點(diǎn)監(jiān)視工具對(duì)網(wǎng)站進(jìn)行測(cè)試。
[1]馬宜義.網(wǎng)絡(luò)安全與病毒防范.上海:上海交通大學(xué)院出版社,2009.
[2]秦志興,張鳳荔.計(jì)算機(jī)病毒原理與防范[M].北京:人民郵電出版社,2007.
[3]張仁斌,李剛,等.計(jì)算機(jī)病毒與反病毒技術(shù)[M].武漢:武漢大學(xué)出版社,2006.
(編輯 呂智飛)
(作者單位:昌吉職業(yè)技術(shù)學(xué)院)