范義山
【摘 要】SQL注入漏洞對(duì)網(wǎng)站的安全構(gòu)成嚴(yán)重威脅,然而SQL注入漏洞又具有較高的普遍性。因此查找SQL注入漏洞并了解其入侵方式,及時(shí)堵塞網(wǎng)站安全漏洞,是我們網(wǎng)站管理員必須要掌握的。本文以一款SQL注入工具入侵原理入手,講解了其入侵步驟,并給出了防范措施。
【關(guān)鍵詞】SQL注入;入侵;漏洞;防范
0 引言
SQL注入攻擊指的是攻擊者通過構(gòu)建特殊的輸入作為參數(shù)傳入Web應(yīng)用程序(一般通過網(wǎng)頁地址欄或留言板等具有提交功能的欄目輸入),應(yīng)用程序接收后錯(cuò)誤的將攻擊者的輸入作為原始SQL查詢語句的一部分執(zhí)行,導(dǎo)致改變了程序原始的SQL查詢邏輯,額外的執(zhí)行了攻擊者構(gòu)造的SQL查詢語句。攻擊者根據(jù)程序返回的結(jié)果,獲得想得知的某些數(shù)據(jù)(譬如后臺(tái)管理賬戶、密碼),進(jìn)而執(zhí)行攻擊者所要的操作,其主要原因是程序沒有細(xì)致地過濾用戶輸入的數(shù)據(jù),致使信息泄露。
SQL注入攻擊是黑客對(duì)網(wǎng)站進(jìn)行攻擊、滲透的常用手段,其風(fēng)險(xiǎn)性極高,并且因?yàn)镾QL注入入侵跟普通的WEB頁面訪問沒什么區(qū)別,所以防火墻與殺毒軟件對(duì)SQL注入是沒辦法防范的。由于程序員的水平及經(jīng)驗(yàn)參差不齊,相當(dāng)大一部分程序員在編寫代碼的時(shí)候,沒有對(duì)用戶輸入數(shù)據(jù)的合法性進(jìn)行判斷,導(dǎo)致存在SQL注入漏洞的網(wǎng)站相當(dāng)普遍。如何從根本上進(jìn)行SQL注入防御,降低SQL注入風(fēng)險(xiǎn)具有極其重要的現(xiàn)實(shí)意義。
1 啊D注入工具入侵原理
所謂知己知彼,百戰(zhàn)百勝。要想有效防御SQL注入攻擊,就要了解其攻擊原理。本文通過對(duì)一款黑客常用注入工具——啊D注入工具工作原理的講解,來分析SQL注入的防范措施。
啊D注入工具的攻擊方法實(shí)際上就是逐步測試、逐步猜解,猜解網(wǎng)站數(shù)據(jù)庫中的后臺(tái)管理員表名、字段名、字段值,進(jìn)而獲取到網(wǎng)站的管理員賬號(hào)、密碼,在其它工具獲取網(wǎng)站后臺(tái)登錄地址的前提下,登錄網(wǎng)站后臺(tái),獲取網(wǎng)站控制權(quán),甚至整個(gè)服務(wù)器的管理權(quán)限。
有了這個(gè)攻擊工具,使得入侵存在SQL注入漏洞的網(wǎng)站成了小兒科的游戲,那些既不懂編程又不懂SQL、年紀(jì)小小的青年常常得以在一天之內(nèi)入侵十多個(gè)網(wǎng)站。
2 啊D注入工具攻擊步驟
2.1 啊D注入工具入侵的第一步是尋找注入點(diǎn)
怎樣才算注入點(diǎn)呢?其實(shí)就是一類URL,就是網(wǎng)站的一些鏈接,在后面人為的添加一些SQL語句、單引號(hào)等之后,這些人為添加的語句可以最終被提交到數(shù)據(jù)庫執(zhí)行,并將結(jié)果在瀏覽器端顯示出來,這樣的URL就是網(wǎng)站的注入點(diǎn)。黑客通過執(zhí)行后不同的返回結(jié)果,來猜解數(shù)據(jù)庫的表名、字段名、字段值,進(jìn)而入侵網(wǎng)站。
那么啊D注入工具是怎么尋找注入點(diǎn)的呢?實(shí)際上和手工注入一樣,就是通過在一些網(wǎng)站鏈接地址后輸入一些非法字符串,根據(jù)返回的結(jié)果判斷網(wǎng)站是否可以進(jìn)行注入。最常用的就是單引號(hào)測試法和1=2測試法。
單引號(hào)測試法就是在最后面加上單引號(hào),如果結(jié)果返回“microsoft jet database engine 錯(cuò)誤80040e14”之類的錯(cuò)誤信息,就表示單引號(hào)被連接到SQL語句中執(zhí)行了,就說明在該鏈接地址后面添加SQL語句可以被提交到數(shù)據(jù)庫執(zhí)行,就表示該鏈接地址存在SQL注入漏洞。
1=2測試法就是在網(wǎng)站鏈接地址后輸入1=2,返回的結(jié)果如果是:BOF或EOF中有一個(gè)是“真”,或者當(dāng)前的記錄已被刪除,所需的操作要求一個(gè)當(dāng)前的記錄,或者原來正常顯示的網(wǎng)頁沒有顯示出來,就表示1=2被連接到SQL語句中執(zhí)行了,就說明在該鏈接地址后面添加SQL語句可以被提交到數(shù)據(jù)庫執(zhí)行,就表示該鏈接地址存在SQL注入漏洞。
2.2 猜解表名
假如http://localhost/article.aspx?id=124是一個(gè)注入點(diǎn),要用它來猜解表名。怎么提交?
http://localhost/article.aspx?id=124 and exists(select count(*) from admin)
然后看頁面返回了,返回正常就表示該表存在,否則就不存在了。啊D工具就是這樣猜解的,它的軟件數(shù)據(jù)庫里面有很多提前添加好的表名。然后猜解的時(shí)候就是挨個(gè)試了。
2.3 猜解字段名
有了表名,下一步就是猜解字段了。需要用到這樣的語句:http://localhost/article.aspx?id=124 and exists(select username from admin)
也就是將count(*)換成了字段名。將設(shè)置列表中的字段挨個(gè)進(jìn)去匹配。頁面返回正常就表示字段存在,否則就不存在。
2.4 猜解字段長度
字段有了,下一步就是猜解字段值了,先猜解字段長度。
http://localhost/article.aspx?id=124 and (select top 1 len(username) from admin)>0
http://localhost/article.aspx?id=124 and (select top 1 len(username) from admin)>5
http://localhost/article.aspx?id=124 and (select top 1 len(username) from admin)>6
|直到準(zhǔn)確判斷出長度為止。其中的len()函數(shù)負(fù)責(zé)計(jì)算username中第一條記錄的長度。
2.5 猜解字段值
知道了長度,下一步就是準(zhǔn)確猜解每一位的值。
and(select top 1 asc(mid(username,1,1))from admin)>97
and(select top 1 asc(mid(username,1,1))from admin)>98
and(select top 1 asc(mid(username,1,1))from admin)>99
and(select top 1 asc(mid(username,1,1))from admin)=100
解析一下這個(gè)語句的含義。就是一些函數(shù)的使用技巧, asc() 負(fù)責(zé)查詢某個(gè)字符的ascii碼值,mid(addr,start,len)這個(gè)函數(shù)負(fù)責(zé)選取某個(gè)字符串中從start開始len位的字符。本語句就是取出字符串的第一個(gè)字符了。當(dāng)然第二個(gè)字符:
and(select top 1 asc(mid(username,2,1))from admin)>99就是這樣算的了,取出每一位的結(jié)果之后,轉(zhuǎn)換為對(duì)應(yīng)的字符就是用戶名或者密碼了。
這就是為什么猜解表名、字段的時(shí)候,都是一條一條的出結(jié)果,而猜解字段值的時(shí)候,是一個(gè)字符一個(gè)字符的出結(jié)果了。
3 SQL注入攻擊的防御辦法
知道了黑客入侵的原理,也就知道怎么對(duì)應(yīng)的做好防護(hù)了。從阿D注入工具入侵的步驟來看,主要就是通過提交非法SQL語句,根據(jù)不同的返回信息來確定猜測的表名、字段名、字段值是否正確,通過不斷的窮舉,最終猜解到準(zhǔn)確的表名、字段名、字段值。所以防御的辦法就是阻斷猜解過程,一是不讓非法SQL語句提交、執(zhí)行,二是不讓出錯(cuò)信息在瀏覽器端顯示出來。下面詳細(xì)敘述:
1)對(duì)用戶在地址欄的輸入、傳入的Request函數(shù)等進(jìn)行校驗(yàn),通過正則表達(dá)式,對(duì)單引號(hào)、SQL語句等進(jìn)行判斷和過濾,阻止非法SQL語句的執(zhí)行,防止SQL注入。
2)修改web服務(wù)器參數(shù)設(shè)置。SQL注入入侵是根據(jù)web服務(wù)錯(cuò)誤提示信息來獲取信息進(jìn)行入侵的??梢园褀eb服務(wù)器設(shè)置成不管出什么樣的錯(cuò)誤,只給出一種錯(cuò)誤提示信息,即http 500錯(cuò)誤,攻擊者就沒辦法從提示信息中獲取有用信息進(jìn)行入侵了,注入工具也沒有辦法了。這個(gè)方法即簡單又有效,缺點(diǎn)就是代碼出錯(cuò)時(shí),會(huì)給程序的調(diào)試帶來很大的不便。不過,服務(wù)器畢竟不是測試代碼的地方,應(yīng)堅(jiān)持安全穩(wěn)定第一,事實(shí)上許多服務(wù)器的出錯(cuò)信息都是如此設(shè)置。
另外,利用檢測工具和手工檢測方法,對(duì)網(wǎng)站進(jìn)行檢測,一旦發(fā)現(xiàn)存在漏洞,就對(duì)被注入的地址進(jìn)行參數(shù)過濾和檢查。
【參考文獻(xiàn)】
[1]方偉,方欣,一個(gè)通用防止SQL注入系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].湖南理工學(xué)院學(xué)報(bào):自然科學(xué)版,2012,12:25(4).
[2]楊省偉,楊浩杰.SQL注入數(shù)據(jù)庫攻擊與防御技術(shù)研究[J].長沙大學(xué)學(xué)報(bào),2013,9:27(5).
[3]吳金秀.SQL注入攻擊與防御[J].陜西交通職業(yè)技術(shù)學(xué)院學(xué)報(bào),2012(4).
[責(zé)任編輯:王偉平]