前面MySQL讲了挺多的,但是我给忘了讲Mysql数据库的一些特性,所以在讲MSSQL注入前,我把Mysql数据库中的一些细节说一下。
Mysql
以phpstudy集成的MySQL来说,它的数据库存在phpstudy/PHPTutorial/MySQL/data中
可以直接看到我们有四个数据库:mysql、performance_schema、security、test。那么我们在MySQL命令行终端show databases看看。
可以看到多出一个库information_schema,也就是这个库使得攻击者在找到闭合后对查库查表啥的有了更方便的方式以及更统一的payload,information_schema库存在于MySQL5.1+,而在版本5之前是不存在这个库的。
设计这个库的初衷是为了管理员对库更方便的查询和修改。但是没办法,一旦方便了管理员,如果管理员沦陷了,也就方便了攻击者。
如果需要获取数据库中的信息,在这个库里面有几个关键的表需要一起学习一下,
SCHEMATA表:提供了当前mysql实例中所有数据库的信息。是show databases的结果取之此表。
TABLES表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息。是show tables from schemaname的结果取之此表。
COLUMNS表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。是show columns from schemaname.tablename的结果取之此表。
除此之外,我们还需要了解一些表中的列名
如上有个table_schema,这玩意儿就是数据库名,所以我们可以通过对该库进行where限制达到查询想查询库中的表。
这个表有点丑,直接看我写的就行。
上面我们可以看到columns表中有一个列名 table_name,这玩意儿的意思是数据表名,也就是可以通过对表名做限制最后达到查询我们想知道表中的数据。
到这里差不多就是MySQL中注入最常规知识点,下面是一个简单的查库、查表、查列、查字段的payload。
查库:-1' union select 1,2,group_concat(schema_name) from information_schema.schemata--+
查表:-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema = 'security'--+
查列:-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name = 'users'--+
查字段:-1' union select 1,group_concat(id),group_concat(concat_ws('~',username,password)) from users--+
over,接下来讲一下今天的重点,MSSQL注入。
MSSQL
平时的SQL注入的学习主要是针对于MySQL数据库,这里提个醒,如果MySQL数据库的注入不是很熟的话建议多刷sqli-labs巩固MySQL,否则都学的话半生不熟容易乱还容易忘记。
MSSQL又称为SQL server数据库,与MySQL的相似性还是非常高的,由于与MySQL非常相似,有些MySQL讲过的东西就不会细说了。
前置知识
与MySQL相同,MSSQL有类似于MySQL中information_schema库这种默认存在可简便查询的存在。information_schema在MySQL中已经讲过了,MSSQL也可以用就不重复了。我想讲一讲与MySQL不同的,MSSQL独有的特性。
MSSQL中每个数据库都存在三张默认的表sysdatabases、sysobjects、syscolumns
sysdatabases :该表保存在master数据库中,这个表中保存的是所有的库名,以及库的ID,和一些相关信息。
sysobjects: SQL-SERVER的每个数据库内都有此系统表,它存放该数据库内创建的所有对象,如约束 、默认值、日志、规则、存储过程等,每个对象在表中占一行。
syscolumns:该表位于每个数据库中,其中包含了这个库中的所有列名。
知道三张表的意思我们就可以用这个去查询我们想要查询任何数据,但是三张表中除了数据库表以外另两张表都存储了一些约束、默认值、日志等等,而这些存储会影响到我们对敏感数据的查询,这个时候我们需要找出一个列分类出哪些是一些限制存储,哪些又是一些数据存储。
可以看到sysdatabases数据库表中的内容只有数据库
sysobjects一堆表,啥都有,于是乎查到了一个分类的标准,那就是其中的xtype
xtype | char(2) | 对象类型。常用列。xtype可以是下列对象类型中的一种: C = CHECK 约束 D = 默认值或 DEFAULT 约束 F = FOREIGN KEY 约束 L = 日志 FN = 标量函数 IF = 内嵌表函数 P = 存储过程 PK = PRIMARY KEY 约束(类型是 K) RF = 复制筛选存储过程 S = 系统表 TF = 表函数 TR = 触发器 U = 用户表 UQ = UNIQUE 约束(类型是 K) V = 视图 X = 扩展存储过程 |
可以看到,U类型是用户表,所以我们利用这个限制查询
成功,四张数据表都可以看到了。最后只剩下一个问题了,那就是如何查询到我们想查到的关键列明。由于syscolumns中存储的不仅仅只是数据表中列,还有视图啥的,这些很多也是非常影响我们对数据的查询,因此我们还是要用一个列将他们区分开来。
经过我的查询以及学习得知,sysobjects中的id列与syscolumns中的id列外键关联,啥意思呢?也就是说syscolumns的列中有一个id指对应着sysobjects中的id,而我们的表是从sysobjects中得来,那么有意思的就是我们可以通过对sysobjects中的id获得syscolumns的列数据,最后查字段就轻轻松松了。
select * from syscolumns where id=(select id from sysobjects where name='users')
或者也可以直接查id代入
select * from syscolumns where id=885578193
到此为止,MSSQL中默认存在的库、表、列就讲完了,接下还想把我们在SQL注入中需要用到的一些常用的函数提一下。
函数 | 释义 |
---|---|
host_name() | 返回服务器端计算机的名称 |
Current_user | 返回当前数据库的用户 |
db_name () | 返回当前数据库的名 |
CHAR() | 将ASCII 码转换为字符,如果没有输入0 ~ 255 之间的ASCII 码值,CHAR()返回 NULL |
Object_id() | 返回数据库表名,通常用于16进制或SQL编码的转换 |
col_name ( table_id , column_id ) | 返回指定表中指定字段 |
Substring() | 返回子字符串,例:substring(“123456” ,1,3)返回“123” |
Cast() | 将某种数据类型的表达式显式转换为另一种数据类型 |
MSSQL。
MMSQL的特性就差不多了,后面另启一篇再讲讲几个题目吧
参考:SQL注入之Mssql注入_缘员的博客-CSDN博客_mssql注入
认识SQLSERVER中的syscolumns表 - 编程之家
SQL Server系统表sysobjects详细介绍与使用_飞天海里鱼的博客-CSDN博客_sysobjects