ASP編程門(mén)檻很低,新手很容易上路。在一段不長(cháng)的時(shí)間里,新手往往就已經(jīng)能夠編出看來(lái)比較完美的動(dòng)態(tài)網(wǎng)站,在功能上,老手能做到的,新手也能夠做到。那么新手與老手就沒(méi)區別了嗎?這里面區別可就大了,只不過(guò)外行人很難一眼就看出來(lái)罷了。在界面的友好性、運行性能以及網(wǎng)站的安全性方面是新手與老手之間區別的三個(gè)集中點(diǎn)。而在安全性方面,新手最容易忽略的問(wèn)題就是SQL注入漏洞的問(wèn)題。用NBSI 2.0對網(wǎng)上的一些ASP網(wǎng)站稍加掃描,就能發(fā)現許多ASP網(wǎng)站存在SQL注入漏洞,教育網(wǎng)里高校內部機構的一些網(wǎng)站這種漏洞就更普遍了,可能這是因為這些網(wǎng)站大都是一些學(xué)生做的緣故吧,雖然個(gè)個(gè)都很聰明,可是畢竟沒(méi)有經(jīng)驗,而且處于學(xué)習中,難免漏洞多多了。本文主要講講SQL注入的防范措施,而要明白這些防范措施的用處,須先詳細講解利用SQL注入漏洞入侵的過(guò)程。新手們看明白啦。
相當大一部分程序員在編寫(xiě)代碼的時(shí)候,沒(méi)有對用戶(hù)輸入數據的合法性進(jìn)行判斷,使應用程序存在安全隱患。如這是一個(gè)正常的網(wǎng)址http://localhost/lawjia/show.asp?ID=444,將這個(gè)網(wǎng)址提交到服務(wù)器后,服務(wù)器將進(jìn)行類(lèi)似Select * from 表名 where 字段="&ID的查詢(xún)(ID即客戶(hù)端提交的參數,本例是即444),再將查詢(xún)結果返回給客戶(hù)端,如果這里客戶(hù)端故意提交這么一個(gè)網(wǎng)址:
http://localhost/lawjia/show.asp?ID=444 and user>0,這時(shí),服務(wù)器運行Select * from 表名 where 字段=444 and user>0這樣的查詢(xún),當然,這個(gè)語(yǔ)句是運行不下去的,肯定出錯,錯誤信息如下:
·錯誤類(lèi)型:
Microsoft OLE DB Provider for ODBC Drivers (0x80040E07)
[Microsoft][ODBC SQL Server Driver][SQL Server]將 nvarchar 值 'sonybb' 轉換為數據類(lèi)型為 int 的列時(shí)發(fā)生語(yǔ)法錯誤。
/lawjia/show.asp, 第 47 行
但是別有用心的人從這個(gè)出錯信息中,可以獲得以下信息:該站使用MS_SQL數據庫,用ODBC連接,連接賬號名為:sonybb。所謂SQL注入(SQL Injection),就是利用程序員對用戶(hù)輸入數據的合法性檢測不嚴或不檢測的特點(diǎn),故意從客戶(hù)端提交特殊的代碼,從而收集程序及服務(wù)器的信息,從而獲取想得到的資料。通常別有用心者的目標是獲取網(wǎng)站管理員的賬號和密碼。比如當某個(gè)人知道網(wǎng)站管理員賬號存在表login中,管理員賬號名為admin,他想知道管理員密碼,這里他從客戶(hù)端接著(zhù)提交這樣一個(gè)網(wǎng)址:
http://localhost/lawjia/show.asp?ID=444 and (Select password from login where user_name='admin')>0,返回的出錯信息如下:
·錯誤類(lèi)型:
Microsoft OLE DB Provider for ODBC Drivers (0x80040E07)
[Microsoft][ODBC SQL Server Driver][SQL Server]將 varchar 值 '?。溃#dmin' 轉換為數據類(lèi)型為 int 的列時(shí)發(fā)生語(yǔ)法錯誤。
/lawjia/show.asp, 第 47 行
你知道嗎?上面標紅的部分就是管理員賬號admin的密碼!雖然很復雜,讓人看幾遍也記不住的,但它就這樣顯示在你面前了,這時(shí)您就可以用這個(gè)賬號和密碼接管人家的網(wǎng)站了!這時(shí)你可能還會(huì )說(shuō),如果他不是事先知道管理員賬號存在表login中,而且知道管理員賬號為admin,那他就不可能獲得管理員密碼。你錯了,只要人家愿意多花時(shí)間嘗試,他將可以獲得數據庫連接賬號權限內所能獲得的所有信息!具體過(guò)程請參看網(wǎng)上的這篇文章:SQL注入漏洞全接觸。
當然這個(gè)過(guò)程是很煩瑣的而且要花費很多的時(shí)間,如果只能以這種手動(dòng)方式進(jìn)行SQL注入入侵的話(huà),那么許多存在SQL注入漏洞的ASP網(wǎng)站會(huì )安全很多了,不是漏洞不存在了,而是利用這個(gè)漏洞入侵的成本太高了。但是如果利用專(zhuān)門(mén)的黑客工具來(lái)入侵的話(huà),那情況就大大不同了。手動(dòng)方式進(jìn)行SQL注入入侵至少需要半天或一天乃至很多天的時(shí)間,而利用專(zhuān)門(mén)的工具來(lái)入侵就只需要幾分鐘時(shí)間了(視網(wǎng)速快慢決定),再利用獲得的管理賬號和密碼,上傳一個(gè)從網(wǎng)上下載的ASP后門(mén)程序,就輕易獲得整個(gè)網(wǎng)站的管理權限了,甚至整個(gè)服務(wù)器的管理權限。最有名的一種SQL注入入侵工具是NBSI 2.0,現在已經(jīng)出到2.0版本了,不過(guò),人家正式名稱(chēng)不叫SQL注入入侵工具,而叫做網(wǎng)站安全漏洞檢測工具。有了這個(gè)所謂的檢測工具,使得入侵存在SQL注入漏洞的ASP網(wǎng)站成了小兒科的游戲,那些既不懂ASP又不懂SQL、年紀小小的男性青年常常得以在一天之內入侵十多個(gè)ASP網(wǎng)站,他們以此獲得內心的極大滿(mǎn)足。他們似乎也非常講究職業(yè)道德,往往并不破壞網(wǎng)站數據和系統,常見(jiàn)的破壞方式大都僅僅是改換掉網(wǎng)站的主頁(yè),留下"善意的警告",如:你的網(wǎng)站存在SQL注入漏洞,請管理員做好防范措施!并聲明"我沒(méi)有破壞數據和系統",有的還要借機發(fā)布一下他的倡導:"國內網(wǎng)站大家不要入侵,有本事入侵小日本的!",最后,簽上他的鼎鼎大名是必不可少的程序。
如此大的成就多數情況下僅需動(dòng)動(dòng)鼠標就做到了。打開(kāi)最新版的NBSI 2.0,如圖1所示:輸入地址到A區,注意網(wǎng)址必須是帶傳遞參數的那種,點(diǎn)擊右邊的檢測按鈕,即出來(lái)B區信息,顯示當前用戶(hù)為sonybb的權限為PUBLIC,當前庫為lawjia。有點(diǎn)可惜啊,如果是SA權限的話(huà),就可以跨庫注入了。不過(guò),這個(gè)權限也足夠獲取該網(wǎng)站管理員賬號和密碼了。點(diǎn)C區下的自動(dòng)猜解按鈕,即出來(lái)當前庫lawjia中的各種表,哇,login表中一定是存管理員賬號和密碼的吧?選中它吧,接著(zhù)點(diǎn)擊D區下的自動(dòng)猜解按鈕,立即出來(lái)login表里的列名稱(chēng),果然是存放用戶(hù)名和密碼的啊,太棒了!趕快打上勾,迫不急待的點(diǎn)擊E區下的自動(dòng)猜解按鈕。激動(dòng)人心的時(shí)刻就要到來(lái)啦,只見(jiàn)唰唰地幾下,賬號與密碼全部出來(lái)了。剩下的事就是辨別哪一個(gè)賬號是管理員了。
![]() 圖1(圖中的示例網(wǎng)站在作者本地電腦上運行) |
![]() 圖2、IIS出錯信息設置 |
但是這樣設置一個(gè)不好的地方是程序員編寫(xiě)的代碼出錯時(shí),服務(wù)器不給出詳細的錯誤提示信息,會(huì )給程序員帶來(lái)很大的不便。不過(guò),服務(wù)器畢竟不是測試代碼的地方,應堅持安全穩定第一,這樣設置也是無(wú)可厚非的,事實(shí)上許多服務(wù)器的出錯信息都是如此設置。
服務(wù)器管理員還應在IIS中為每個(gè)網(wǎng)站設置好執行權限,可千萬(wàn)別給人家靜態(tài)網(wǎng)站以"腳本和可執行"權限。一般情況下給個(gè)"純腳本"權限就夠了,對于那些通過(guò)網(wǎng)站后臺管理中心上傳的文件存放的目錄,就更吝嗇一點(diǎn)吧,執行權限設為"無(wú)"好了,這樣做是為了防止人家上傳ASP木馬,執行權限設為"無(wú)",人家上傳ASP木馬也運行不了。一般情況下,SQL注入漏洞僅是涉及一個(gè)網(wǎng)站安全的事,如果人家通過(guò)這個(gè)漏洞上傳了ASP木馬并運行起來(lái),那整個(gè)服務(wù)器都失陷了。所以有遠見(jiàn)的、有責任心的服務(wù)器管理員應該十分吝嗇的配置IIS的執行權限。
同樣的吝嗇態(tài)度應適用于數據庫用戶(hù)的權限配置上,當然這里數據庫是指MS_SQL啦,ACCESS都沒(méi)有用戶(hù)權限配置這一步驟。如果PUBLIC權限足夠使用的絕不給再高的權限,可千萬(wàn)別把SA級別的權限隨隨便便地給人家啊。那個(gè)所謂的網(wǎng)站安全漏洞檢測工具NBSI 2.0可有跨庫進(jìn)行SQL注入的功能啊,如果你把SA權限給了存在SQL注入漏洞的庫,那其它庫就不保啦!城門(mén)失火,殃及池魚(yú)呀。而人家還可以通過(guò)調用xp_cmdshell命令得到系統的最高權限。具體步驟還是請參看上面提到的那篇《SQL注入漏洞全接觸》這篇文章吧。
接下來(lái)要講講程序員的防范措施了。程序主要要做兩件事,最重要的一件事,當然是對客戶(hù)端提交的變量參數進(jìn)行仔細地檢測啦。對客戶(hù)端提交的變量進(jìn)行檢查以防止SQL注入,有各種方法,到 程序員要做的第二件事是給用戶(hù)密碼加密啦。比如用MD5加密。MD5是沒(méi)有反向算法,不能解密的。人家即使知道經(jīng)加密后存在數據庫里的像亂碼一樣的密碼,他也沒(méi)辦法知道原始密碼了。不過(guò),人家可以用UPDATE方法用他的密碼代替你的密碼,但這個(gè)操作還是有點(diǎn)麻煩,人家可能會(huì )怕麻煩而放棄。而那個(gè)所謂的網(wǎng)站安全漏洞檢測工具NBSI 2.0是沒(méi)有提供UPDATE操作功能的,所以用MD5加密后,人家僅用NBSI 2.0而不輔以手動(dòng)操作的話(huà),就不可能獲得網(wǎng)站管理員賬號的密碼,這將擋住許多菜鳥(niǎo)級的攻擊者,至少那些既不懂ASP又不懂SQL、年紀小小的男性青年是沒(méi)有辦法啦! 文章寫(xiě)到這,已經(jīng)夠長(cháng)了,本來(lái)還想對那些所謂的網(wǎng)站安全漏洞檢測工具如NBSI之流的黑客工具進(jìn)行一番理性的探討的,看來(lái)還是放棄好了。為了增強網(wǎng)站安全,了解攻擊手段是必須的,但是,利用漏洞開(kāi)發(fā)專(zhuān)門(mén)的黑客工具,使那些其實(shí)并不具備必要的網(wǎng)絡(luò )技術(shù)和網(wǎng)絡(luò )安全知識的人(就是文中提到的"既不懂ASP又不懂SQL、年紀小小的男性青年")輕而易舉地侵入一家網(wǎng)站,這除了為許多網(wǎng)絡(luò )管理員制造麻煩外,是否還具有加強網(wǎng)絡(luò )安全意識提高網(wǎng)絡(luò )安全水平的功效呢?
聯(lián)系客服