科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道有孔就入SQL Injection的深入探讨(2)

有孔就入SQL Injection的深入探讨(2)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

SQL Injection这个话题越来越热了,很多的论坛和hack站点都或多或少地在谈论这个问题,当然也有很多革命前辈写了N多的关于这方面的文章,所利用的也是许多知名的程序

作者:heha 来源:赛迪网技术社区 2007年9月7日

关键字: Injection SQL Server SQL Server 各版本 数据库

  • 评论
  • 分享微博
  • 分享邮件
 

二、深入研究,让SQL自己招数据库结构

很多时候,我们只能猜到大家比较熟用的表名,如果是非原程序公开下载的,我们很猜到他的真实数据库结构,有时候猜半天都猜不到,令人很郁闷,那么该如何拿到他的表结构呢?我们知道SQL SERVER的每一个数据库都会有用户表和系统表,根据SQL SERVER的联机帮助描述是系统表sysobjects:在数据库内创建的每个对象(约束、默认值、日志、规则、存储过程等)在表中占一行,那么也就是说当前数据库的表名都会在该表内有存在,(对象名 admin 无效。大家可以看到上面出现的报错把表名描述成对象)。

我们要用的是其中的3个,描述如下(详细的见SQL SERVER的联机帮助):

name 数据表的名字;

xtype 数据表的类型 u为用户表;

id 数据表的对象标志;

status 保留字段,用户表一般都是大于0的。

在查询分析器执行以下SQL语句(以我本地的数据库为例子):

select top 1 name from sysobjects where xtype=u and status>0

我们马上就可以得到该数据库下用户表的第一个表名gallery:

select top 1 id from sysobjects where xtype=u and name=gallery

我们马上就可以得到该数据库下用户表的第一个表名gallery的对象标志2099048:

select top 1 name from sysobjects where xtype=u and id>2099048

再得到第2个表名gb_data,这里用到的是id>2099048,因为对象标志id是根据由小到大排列的。

以此类推,我们可以得到所有的用户表的名字了。接下来,我们要根据得到的表名取他的字段名,这里我们用到的是系统自带的2个函数col_name()和object_id(),在查询分析器执行以下SQL语句(以我本地的数据库为例子):

select top 1 col_name(object_id(gallery),1) from gallery

得到gallery表的第一个字段名为id。

注:

col_name()的语法

COL_NAME ( table_id , column_id )

参数

table_id:包含数据库列的表的标识号。table_id 属于 int 类型。

column_id:列的标识号。column_id 参数属于 int 类型。

其中我们用object_id()函数来得到该表的标识号,1、2、3。。表示该表的第1个、第2个、第3个。。字段的标识号,以此类推得到该表所有的字段名称。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章