ASP編程門檻很低,新手很容易上路。在一段不長(zhǎng)的時(shí)間里,新手往往就已經(jīng)能夠編出看來(lái)比較完美的動(dòng)態(tài)網(wǎng)站,在功能上,老手能做到的,新手也能夠做到。那么新手與老手就沒區(qū)別了嗎?這里面區(qū)別可就大了,只不過外行人很難一眼就看出來(lái)罷了。在界面的友好性、運(yùn)行性能以及網(wǎng)站的安全性方面是新手與老手之間區(qū)別的三個(gè)集中點(diǎn)。而在安全性方面,新手最容易忽略的問題就是SQL注入漏洞的問題。用NBSI 2.0對(duì)網(wǎng)上的一些ASP網(wǎng)站稍加掃描,就能發(fā)現(xiàn)許多ASP網(wǎng)站存在SQL注入漏洞,教育網(wǎng)里高校內(nèi)部機(jī)構(gòu)的一些網(wǎng)站這種漏洞就更普遍了,可能這是因?yàn)檫@些網(wǎng)站大都是一些學(xué)生做的緣故吧,雖然個(gè)個(gè)都很聰明,可是畢竟沒有經(jīng)驗(yàn),而且處于學(xué)習(xí)中,難免漏洞多多了。本文主要講講SQL注入的防范措施,而要明白這些防范措施的用處,須先詳細(xì)講解利用SQL注入漏洞入侵的過程。新手們看明白啦。
相當(dāng)大一部分程序員在編寫代碼的時(shí)候,沒有對(duì)用戶輸入數(shù)據(jù)的合法性進(jìn)行判斷,使應(yīng)用程序存在安全隱患。如這是一個(gè)正常的網(wǎng)址http://localhost/lawjia/show.asp?ID=444,將這個(gè)網(wǎng)址提交到服務(wù)器后,服務(wù)器將進(jìn)行類似Select * from 表名 where 字段="&ID的查詢(ID即客戶端提交的參數(shù),本例是即444),再將查詢結(jié)果返回給客戶端,如果這里客戶端故意提交這么一個(gè)網(wǎng)址:http://localhost/lawjia/show.asp?ID=444 and user>0,這時(shí),服務(wù)器運(yùn)行Select * from 表名 where 字段=444 and user>0這樣的查詢,當(dāng)然,這個(gè)語(yǔ)句是運(yùn)行不下去的,肯定出錯(cuò),錯(cuò)誤信息如下:
·錯(cuò)誤類型:
Microsoft OLE DB Provider for ODBC Drivers (0x80040E07)
[Microsoft][ODBC SQL Server Driver]
[SQL Server]將 nvarchar 值
’sonybb’ 轉(zhuǎn)換為數(shù)據(jù)類型為 int 的列時(shí)發(fā)生語(yǔ)法錯(cuò)誤。
/lawjia/show.asp, 第 47 行
但是別有用心的人從這個(gè)出錯(cuò)信息中,可以獲得以下信息:該站使用MS_SQL數(shù)據(jù)庫(kù),用ODBC連接,連接帳號(hào)名為:sonybb。所謂SQL注入(SQL Injection),就是利用程序員對(duì)用戶輸入數(shù)據(jù)的合法性檢測(cè)不嚴(yán)或不檢測(cè)的特點(diǎn),故意從客戶端提交特殊的代碼,從而收集程序及服務(wù)器的信息,從而獲取想得到的資料。通常別有用心者的目標(biāo)是獲取網(wǎng)站管理員的帳號(hào)和密碼。比如當(dāng)某個(gè)人知道網(wǎng)站管理員帳號(hào)存在表login中,管理員帳號(hào)名為admin,他想知道管理員密碼,這里他從客戶端接著提交這樣一個(gè)網(wǎng)址:http://localhost/lawjia/show.asp?ID=444 and (Select password from login where user_name=’admin’)>0,返回的出錯(cuò)信息如下:
·錯(cuò)誤類型:
Microsoft OLE DB Provider for ODBC Drivers (0x80040E07)
[Microsoft][ODBC SQL Server Driver]
[SQL Server]將 varchar 值 ’
?。。溃#dmin’ 轉(zhuǎn)換為數(shù)據(jù)類型為 int 的列時(shí)發(fā)生語(yǔ)法錯(cuò)誤。
/lawjia/show.asp, 第 47 行
你知道嗎?上面標(biāo)紅的部分就是管理員帳號(hào)admin的密碼!雖然很復(fù)雜,讓人看幾遍也記不住的,但它就這樣顯示在你面前了,這時(shí)您就可以用這個(gè)帳號(hào)和密碼接管人家的網(wǎng)站了!這時(shí)你可能還會(huì)說,如果他不是事先知道管理員帳號(hào)存在表login中,而且知道管理員帳號(hào)為admin,那他就不可能獲得管理員密碼。你錯(cuò)了,只要人家愿意多花時(shí)間嘗試,他將可以獲得數(shù)據(jù)庫(kù)連接帳號(hào)權(quán)限內(nèi)所能獲得的所有信息!具體過程請(qǐng)參看網(wǎng)上的這篇文章:SQL注入漏洞全接觸。
當(dāng)然這個(gè)過程是很煩瑣的而且要花費(fèi)很多的時(shí)間,如果只能以這種手動(dòng)方式進(jìn)行SQL注入入侵的話,那么許多存在SQL注入漏洞的ASP網(wǎng)站會(huì)安全很多了,不是漏洞不存在了,而是利用這個(gè)漏洞入侵的成本太高了。但是如果利用專門的黑客工具來(lái)入侵的話,那情況就大大不同了。手動(dòng)方式進(jìn)行SQL注入入侵至少需要半天或一天乃至很多天的時(shí)間,而利用專門的工具來(lái)入侵就只需要幾分鐘時(shí)間了(視網(wǎng)速快慢決定),再利用獲得的管理帳號(hào)和密碼,上傳一個(gè)從網(wǎng)上下載的ASP后門程序,就輕易獲得整個(gè)網(wǎng)站的管理權(quán)限了,甚至整個(gè)服務(wù)器的管理權(quán)限。最有名的一種SQL注入入侵工具是NBSI 2.0,現(xiàn)在已經(jīng)出到2.0版本了,不過,人家正式名稱不叫SQL注入入侵工具,而叫做網(wǎng)站安全漏洞檢測(cè)工具。有了這個(gè)所謂的檢測(cè)工具,使得入侵存在SQL注入漏洞的ASP網(wǎng)站成了小兒科的游戲,那些既不懂ASP又不懂SQL、年紀(jì)小小的男性青年常常得以在一天之內(nèi)入侵十多個(gè)ASP網(wǎng)站,他們以此獲得內(nèi)心的極大滿足。他們似乎也非常講究職業(yè)道德,往往并不破壞網(wǎng)站數(shù)據(jù)和系統(tǒng),常見的破壞方式大都僅僅是改換掉網(wǎng)站的主頁(yè),留下"善意的警告",如:你的網(wǎng)站存在SQL注入漏洞,請(qǐng)管理員做好防范措施!并聲明"我沒有破壞數(shù)據(jù)和系統(tǒng)",有的還要借機(jī)發(fā)布一下他的倡導(dǎo):"國(guó)內(nèi)網(wǎng)站大家不要入侵",最后,簽上他的鼎鼎大名是必不可少的程序。
如此大的成就多數(shù)情況下僅需動(dòng)動(dòng)鼠標(biāo)就做到了。打開最新版的NBSI 2.0,輸入地址到A區(qū),注意網(wǎng)址必須是帶傳遞參數(shù)的那種,點(diǎn)擊右邊的檢測(cè)按鈕,即出來(lái)B區(qū)信息,顯示當(dāng)前用戶為sonybb的權(quán)限為PUBLIC,當(dāng)前庫(kù)為lawjia。有點(diǎn)可惜啊,如果是SA權(quán)限的話,就可以跨庫(kù)注入了。不過,這個(gè)權(quán)限也足夠獲取該網(wǎng)站管理員帳號(hào)和密碼了。點(diǎn)C區(qū)下的自動(dòng)猜解按鈕,即出來(lái)當(dāng)前庫(kù)lawjia中的各種表,哇,login表中一定是存管理員帳號(hào)和密碼的吧?選中它吧,接著點(diǎn)擊D區(qū)下的自動(dòng)猜解按鈕,立即出來(lái)login表里的列名稱,果然是存放用戶名和密碼的啊,太棒了!趕快打上勾,迫不急待的點(diǎn)擊E區(qū)下的自動(dòng)猜解按鈕。激動(dòng)人心的時(shí)刻就要到來(lái)啦,只見唰唰地幾下,帳號(hào)與密碼全部出來(lái)了。剩下的事就是辨別哪一個(gè)帳號(hào)是管理員了。
相當(dāng)大一部分程序員在編寫代碼的時(shí)候,沒有對(duì)用戶輸入數(shù)據(jù)的合法性進(jìn)行判斷,使應(yīng)用程序存在安全隱患。如這是一個(gè)正常的網(wǎng)址http://localhost/lawjia/show.asp?ID=444,將這個(gè)網(wǎng)址提交到服務(wù)器后,服務(wù)器將進(jìn)行類似Select * from 表名 where 字段="&ID的查詢(ID即客戶端提交的參數(shù),本例是即444),再將查詢結(jié)果返回給客戶端,如果這里客戶端故意提交這么一個(gè)網(wǎng)址:http://localhost/lawjia/show.asp?ID=444 and user>0,這時(shí),服務(wù)器運(yùn)行Select * from 表名 where 字段=444 and user>0這樣的查詢,當(dāng)然,這個(gè)語(yǔ)句是運(yùn)行不下去的,肯定出錯(cuò),錯(cuò)誤信息如下:
·錯(cuò)誤類型:
Microsoft OLE DB Provider for ODBC Drivers (0x80040E07)
[Microsoft][ODBC SQL Server Driver]
[SQL Server]將 nvarchar 值
’sonybb’ 轉(zhuǎn)換為數(shù)據(jù)類型為 int 的列時(shí)發(fā)生語(yǔ)法錯(cuò)誤。
/lawjia/show.asp, 第 47 行
但是別有用心的人從這個(gè)出錯(cuò)信息中,可以獲得以下信息:該站使用MS_SQL數(shù)據(jù)庫(kù),用ODBC連接,連接帳號(hào)名為:sonybb。所謂SQL注入(SQL Injection),就是利用程序員對(duì)用戶輸入數(shù)據(jù)的合法性檢測(cè)不嚴(yán)或不檢測(cè)的特點(diǎn),故意從客戶端提交特殊的代碼,從而收集程序及服務(wù)器的信息,從而獲取想得到的資料。通常別有用心者的目標(biāo)是獲取網(wǎng)站管理員的帳號(hào)和密碼。比如當(dāng)某個(gè)人知道網(wǎng)站管理員帳號(hào)存在表login中,管理員帳號(hào)名為admin,他想知道管理員密碼,這里他從客戶端接著提交這樣一個(gè)網(wǎng)址:http://localhost/lawjia/show.asp?ID=444 and (Select password from login where user_name=’admin’)>0,返回的出錯(cuò)信息如下:
·錯(cuò)誤類型:
Microsoft OLE DB Provider for ODBC Drivers (0x80040E07)
[Microsoft][ODBC SQL Server Driver]
[SQL Server]將 varchar 值 ’
?。。溃#dmin’ 轉(zhuǎn)換為數(shù)據(jù)類型為 int 的列時(shí)發(fā)生語(yǔ)法錯(cuò)誤。
/lawjia/show.asp, 第 47 行
你知道嗎?上面標(biāo)紅的部分就是管理員帳號(hào)admin的密碼!雖然很復(fù)雜,讓人看幾遍也記不住的,但它就這樣顯示在你面前了,這時(shí)您就可以用這個(gè)帳號(hào)和密碼接管人家的網(wǎng)站了!這時(shí)你可能還會(huì)說,如果他不是事先知道管理員帳號(hào)存在表login中,而且知道管理員帳號(hào)為admin,那他就不可能獲得管理員密碼。你錯(cuò)了,只要人家愿意多花時(shí)間嘗試,他將可以獲得數(shù)據(jù)庫(kù)連接帳號(hào)權(quán)限內(nèi)所能獲得的所有信息!具體過程請(qǐng)參看網(wǎng)上的這篇文章:SQL注入漏洞全接觸。
當(dāng)然這個(gè)過程是很煩瑣的而且要花費(fèi)很多的時(shí)間,如果只能以這種手動(dòng)方式進(jìn)行SQL注入入侵的話,那么許多存在SQL注入漏洞的ASP網(wǎng)站會(huì)安全很多了,不是漏洞不存在了,而是利用這個(gè)漏洞入侵的成本太高了。但是如果利用專門的黑客工具來(lái)入侵的話,那情況就大大不同了。手動(dòng)方式進(jìn)行SQL注入入侵至少需要半天或一天乃至很多天的時(shí)間,而利用專門的工具來(lái)入侵就只需要幾分鐘時(shí)間了(視網(wǎng)速快慢決定),再利用獲得的管理帳號(hào)和密碼,上傳一個(gè)從網(wǎng)上下載的ASP后門程序,就輕易獲得整個(gè)網(wǎng)站的管理權(quán)限了,甚至整個(gè)服務(wù)器的管理權(quán)限。最有名的一種SQL注入入侵工具是NBSI 2.0,現(xiàn)在已經(jīng)出到2.0版本了,不過,人家正式名稱不叫SQL注入入侵工具,而叫做網(wǎng)站安全漏洞檢測(cè)工具。有了這個(gè)所謂的檢測(cè)工具,使得入侵存在SQL注入漏洞的ASP網(wǎng)站成了小兒科的游戲,那些既不懂ASP又不懂SQL、年紀(jì)小小的男性青年常常得以在一天之內(nèi)入侵十多個(gè)ASP網(wǎng)站,他們以此獲得內(nèi)心的極大滿足。他們似乎也非常講究職業(yè)道德,往往并不破壞網(wǎng)站數(shù)據(jù)和系統(tǒng),常見的破壞方式大都僅僅是改換掉網(wǎng)站的主頁(yè),留下"善意的警告",如:你的網(wǎng)站存在SQL注入漏洞,請(qǐng)管理員做好防范措施!并聲明"我沒有破壞數(shù)據(jù)和系統(tǒng)",有的還要借機(jī)發(fā)布一下他的倡導(dǎo):"國(guó)內(nèi)網(wǎng)站大家不要入侵",最后,簽上他的鼎鼎大名是必不可少的程序。
如此大的成就多數(shù)情況下僅需動(dòng)動(dòng)鼠標(biāo)就做到了。打開最新版的NBSI 2.0,輸入地址到A區(qū),注意網(wǎng)址必須是帶傳遞參數(shù)的那種,點(diǎn)擊右邊的檢測(cè)按鈕,即出來(lái)B區(qū)信息,顯示當(dāng)前用戶為sonybb的權(quán)限為PUBLIC,當(dāng)前庫(kù)為lawjia。有點(diǎn)可惜啊,如果是SA權(quán)限的話,就可以跨庫(kù)注入了。不過,這個(gè)權(quán)限也足夠獲取該網(wǎng)站管理員帳號(hào)和密碼了。點(diǎn)C區(qū)下的自動(dòng)猜解按鈕,即出來(lái)當(dāng)前庫(kù)lawjia中的各種表,哇,login表中一定是存管理員帳號(hào)和密碼的吧?選中它吧,接著點(diǎn)擊D區(qū)下的自動(dòng)猜解按鈕,立即出來(lái)login表里的列名稱,果然是存放用戶名和密碼的啊,太棒了!趕快打上勾,迫不急待的點(diǎn)擊E區(qū)下的自動(dòng)猜解按鈕。激動(dòng)人心的時(shí)刻就要到來(lái)啦,只見唰唰地幾下,帳號(hào)與密碼全部出來(lái)了。剩下的事就是辨別哪一個(gè)帳號(hào)是管理員了。