參加IT認(rèn)證考試前,筆者習(xí)慣到網(wǎng)上去搜搜。亂逛之余,不小心就來到了PROMETRIC的中文站。筆者發(fā)現(xiàn)整個(gè)站點(diǎn)都是ASP程序,況且剛才還有個(gè)考場的登錄界面,要是能發(fā)現(xiàn)什么漏洞就好了。
探測漏洞
隨手找了個(gè)頁面(http://www.promet.ric.com.cn/openpage.asp?page_id=0),在參數(shù)0后面加上個(gè)單引號。返回的頁面顯示:500服務(wù)器內(nèi)部錯(cuò)誤。在IE的“Internet選項(xiàng)→高級”中有一個(gè)“顯示友好HTTP錯(cuò)誤信息”的選項(xiàng),取消前面的鉤。現(xiàn)在,我們可以看到詳細(xì)的錯(cuò)誤信息:
Microsoft OLE DB Provider for ODBC Drivers 錯(cuò)誤 '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]Line 1: Incorrect syntax near ''./audIT.asp,行18??
原來PROMETRIC用的是MSSQL,看來存在嚴(yán)重的注入漏洞(由于涉嫌攻擊步驟,此處不詳細(xì)敘述)。
漏洞原理
SQL注入的漏洞通常是由于程序員對它不了解,設(shè)計(jì)程序時(shí)某個(gè)參數(shù)過濾不嚴(yán)格所致。就拿剛才測試用的鏈接中的page_id這個(gè)參數(shù)來講,肯定就沒有進(jìn)行過濾檢查,源程序中的查詢語句如下所示:
?Select * From Table Where page_id='0'??
當(dāng)我們提交http://www.prometric.com.cn/openpage.asp?page_id=0 and 1=1時(shí),
查詢語句就變成了:
Select * From Table Where page_id='0' and 1=1??
當(dāng)我們提交其他的查詢語句時(shí),程序也會(huì)進(jìn)行執(zhí)行判斷,如:
http://www.prometric.com.cn/openpage.asp?page_id=0 and user>0
查詢語句變成了:
Select * From Table Where page_id='0' and user>0??user是MSSQL的一個(gè)內(nèi)置函數(shù),指的是當(dāng)前連接數(shù)據(jù)庫的用戶名,是一個(gè)nvarchar值。當(dāng)它與整型量0進(jìn)行大小比較時(shí),MSSQL會(huì)試圖將user的值轉(zhuǎn)換成int類型,于是MSSQL就會(huì)報(bào)錯(cuò):
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'web' to a column of data type int.
錯(cuò)誤信息的后面顯示的是庫名、表名、數(shù)據(jù)等。如果對方屏蔽了錯(cuò)誤信息呢?這時(shí),我們就要利用Unicode、Substr等函數(shù)通過條件判斷來進(jìn)行猜測了。??
如何利用
大家可以利用小竹開發(fā)的NBSI2 MSSQL(以下簡稱“NBSI2”)工具。不過大家要注意,工具永遠(yuǎn)只是工具,只能用來提高效率和準(zhǔn)確性,自己一定得了解原理。