目录

1、前言+靶场搭建 

2、漏洞复现 

3、漏洞分析

4、漏洞修复 

5、心得

前言+靶场搭建

很多时候我们获得密码之后进入后台管理的界面,有些上传的漏洞或者sql注入无法getshell,但是如果发现连接mysql服务的数据包中可以传参,那么我们就可以尝试控制链接mysql服务器,反序列化代码来得到shell。所以该漏洞的关键只需要能够控制客户端的jdbc连接,在连接阶段就可以进行触发反序列化。这篇文章也不深入理解mysql的协议。使用idea maven项目创建,在pom中导入jdbc的坐标。(5版本的在5.1.40以下,8版本的在8.0.20以下)导入之后在右边点击maven图标导入。

需要自行根据版本选择JDBC连接串,最后有基于各版本Connector连接串的总结。

public class test1 {public static void main(String[] args) throws Exception {String driver = "com.mysql.jdbc.Driver";  //8版本是"com.mysql.cj.jdbc.driver"//String DB_URL = "jdbc:mysql://127.0.0.1:3306/test?autoDeserialize=true&queryInterceptors=com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor&yso_CommonsCollections5_calc"; //8.x使用String DB_URL = "jdbc:mysql://127.0.0.1:3306/test?detectCustomCollations=true&autoDeserialize=true&user=yso_CommonsCollections5_calc"; //5.x使用Class.forName(driver);Connection conn = DriverManager.getConnection(DB_URL);}
}

漏洞复现

一、 准备伪造的mysql服务

MySQL服务器使用:https://github.com/fnmsd/MySQL_Fake_Server

二、 可控的mysql连接的字符串

可以去找到"靶场"。这里当然以本地靶场搭建。

漏洞分析 

detectCustomCollations触发方式

测试环境中使用mysql-connector-java 5.1.32+java 1.8.221:

我们在 com.mysql.jdbc#buildCollationMapping()下上断点,初始化了一个Map indexTocharset;并且if判断为false再进入下一个if体。

关键的语句在蓝色的那一行。前提条件是红框判断jdbc的版本大于4.1.0,然后执行show collation语句,再判断版本大于5.0.0,才将show collation的执行结果results传入的Util的resultSetToMap执行。

进入

跟入com.mysqljdbc.result.ResultSetImpl#getObject可以看到反序列化的触发点,因为刚刚传入的参数是2和3,所以只要这两个字段的sqlType属性为-4,那么我们就可以进入反序列化的入口。

sqlType为-4,一直进入到-2的判断。这里我们可以看到field.mysqlType不能为255,并且field是Binary而且是Blob属性才能进入获取字段的data属性,并进行之后的反序列化。

ServerStatusDiffInterceptor触发方式

测试环境中使用mysql-connector-java 8.0.14+java 1.8.221:

这部分有点长,解释一下为什么会执行四次命令。

queryInterceptors:一个逗号分割的Class列表(实现了com.mysql.cj.interceptors.QueryInterceptor接口的Class),在Query"之间"进行执行来影响效果。(效果上来看是在Query执行前后各插入一次操作)autoDeserialize:自动检测与反序列化存在BLOB字段中的对象。

所以如上所述,如果要触发queryInterceptors则需要触发SQL Query,而在getConnection过程中,会触发SET NAMES utf、set autocommit=1一类的请求,所以会触发我们所配置的queryInterceptors。

com.mysql.cj.protocol.a.NativeProtocol#invokeQueryInterceptorsPre方法会调用ServerStatusDiffInterceptor的preProcess方法,再去调用了populateMapWithSessionStatusValues,以下是调用链:

首先先大致说一下为什么会执行四次命令

接下来我们细分一下到底查询了什么之后的细分步骤。

首先连接mysql服务器,并ConnectionImpl中设置客户端的字符集,我们进入这个方法。因为前面那个方法的charsetEncoding为空值,所以进入这个方法查询如何配置。

在NativeSession.class里会获取当前mysql的环境然后会触发一次查询"SET NAMES utf",并发送该请求,在python中收到请求。

走完之后完成了下断点的这句,紧接着走箭头所指向的这句话。还在com.mysql.cj.jdbc.ConnectionImpl这个类中。

随后会调用com.mysql.cj.protocol.a.NativeProtocol类中的sendQueryString->sendQueryPacket里面再是sendCommand->send方法,有兴趣可以跟一下),在这里我们可以看到这个方法将setautocommit=1传入invokeQueryInteceptorsPre()方法中。而进入这里的方法只是将上次的set namesutf8的结果返回并反序列化中,而进入这里的方法只是将上次的set namesutf8的结果返回并反序列化。

而在上述的利用链中我们可以得知在com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor中的preProcess及postProcess都会触发populateMapWithSessionStatusValues这个方法,而这个方法是反序列化readObject方法的前置出发点。

一直走到反序列化的点,将结果返回后反序列化,弹出第一次计算机。

resultSetToMap

getObject的反序列化方法

刚刚将set names utf8并结果返回的show session status invokeQueryInterceptorPre走完,到

再到,可以看到调用了postProcess执行反序列化操作

postProcess走完,控制台打印

python

至此第一部分结束。

第二部分流程也是类似的情况,就不列举了:

都是在第二次的show Session Status进行了反序列化的操作。刚刚是分析了第一个红框的两次反序列化操作,接下来是下一个红框的反序列化操作,可以看到左下角的调用栈。

随后服务器因为执行了SHOW SESSION STATUS会触发一次preProcess()

进而在触发SET sql_mode='STRICT_TRANS_TABLES'

查询然后进入NativeProtocol#sendQueryString触发一次postProcess

postProcess中最后打印台的两句话印证了我们的思路并且将结果返回。

漏洞修复

queryInterceptors参数是mysql-connector-java-8.0.7版本才开始支持的,21版本以上被修复。

取消了反序列化的操作,getObject改成了getString。

心得

这个也是在反序列化的过程中没有对数据做严格的检验导致的,利用起来的话,反序列化的操作还是需要环境有可利用的类,所以这个漏洞有可能利用起来很鸡肋,但是如果能够找到这样一个控制mysql字符串的地方,不妨可以试一试。

追洞小组 | Jdbc反序列化漏洞复现浅析相关推荐

  1. 追洞小组 | Windows安装Immunity CANVAS教程

    文章来源|MS08067 WEB攻防知识星球 本文作者:Taoing(Ms08067实验室追洞小组组长) 漏洞复现分析  认准追洞小组 参考:https://mp.weixin.qq.com/s/7L ...

  2. JBoss 反序列化漏洞复现

    JBoss 反序列化漏洞复现 漏洞描述: 互联网爆出JBOSSApplication Server反序列化命令执行漏洞(CVE-2017-12149),远程攻击者利用漏洞可在未经任何身份验证的服务器主 ...

  3. CVE-2020-15148--Yii2 反序列化漏洞复现

    目录 简介: 环境部署: 知识点: 分析: 复现: 参考链接: 其他问题: 简介: Yii Framework是一个基于组件.用于开发大型Web应用的高性能 PHP 框架.Yii提供了今日Web 2. ...

  4. Fastjson 1.2.24 反序列化漏洞复现

    Fastjson 1.2.24 反序列化漏洞复现 1.漏洞介绍 FastjsonEngine是其中的一个JSON处理引擎.Fastjson是其中的一个基于Java的JSON解析器/生成器. Pippo ...

  5. typecho反序列化漏洞复现

    typecho框架存在反序列化漏洞,利用此漏洞可执行任意代码 环境搭建 第一步 第二步 第三步 第三步 第四步 第五步 第六步 第七步 第八步 第九步 漏洞分析 typecho\build\insta ...

  6. Fastjson1.2.47反序列化漏洞复现

    一.漏洞描述 Fastjson是阿里巴巴公司开源的一款json解析器,其性能优越,被广泛应用于各大厂商的Java项目中.Fastjson提供了autotype功能,允许用户在反序列化数据中通过&quo ...

  7. 【漏洞复现】ApacheShiro1.2.4反序列化漏洞复现(CVE-2016-4437)

    前言: Apache Shiro是一款开源安全框架,提供身份验证.授权.密码学和会话管理.Shiro框架直观.易用,同时也能提供健壮的安全性. 影响版本: Apache Shiro <= 1.2 ...

  8. Shiro RememberMe反序列化漏洞复现(Shiro-550)

    0x00 漏洞原理简要分析 官方说明:https://issues.apache.org/jira/browse/SHIRO-550 Shiro提供了记住我(RememberMe)的功能,关闭了浏览器 ...

  9. shiro 721 反序列化漏洞复现与原理以及Padding Oracle Attack攻击加解密原理

    文章目录 1. 前置知识 1.1 shiro550利用条件 原理 1.2 shiro721利用条件 原理 shiro-721对cookie中rememberMe的值的解析过程 1.3 基于返回包的sh ...

最新文章

  1. 自定义webpart显示Lync状态球
  2. 乌班图系统16.04安装
  3. 数据图表可视化_数据可视化十大最有用的图表
  4. zsh: command not found: 解决方法
  5. 2011下半年信息系统项目管理师考后感
  6. CodeForce 589J Cleaner Robot
  7. 未来公务员都会是数据分析高手了,你还要当个只会Excel的小白吗?
  8. HTML | 分享几个HTML邮件样式模板
  9. LINGO11免密版windows
  10. 网络暴利行业,天龙私服赚千万是不是梦想?
  11. 如何优化cocos2d的使用内存
  12. Linux C/C++实现时间戳转换工具
  13. java 获取上周开始时间和结束时间,上上周开始和上上周结束时间
  14. 发际线与程序员的暧昧关系
  15. Random Walk 随机游走算法
  16. linux技术基础教程 [转载]
  17. BUPT OJ146 Coin Tossing
  18. 「UG/NX」BlockUI 控件集合
  19. 一些网络安全的工具软件的介绍
  20. 爆料称华为鸿蒙HarmonyOS 2.0陆续开源,是否为安卓“代码里见”

热门文章

  1. Hive体系结构(一)架构与基本组成
  2. spring 循环依赖_简单说说 Spring 的循环依赖
  3. kotlin学习之基础(一)
  4. 洛谷——P1223 排队接水
  5. Vue指令篇_v-bind
  6. 9行代码满分 【C语言】 L1-062 幸运彩票 (15分)
  7. C语言:L1-033 出生年 (15分)(解题报告)
  8. 计算机网络实验(华为eNSP模拟器)——第十三章 VLAN注册协议(GVRP)
  9. 微信小程序开发与应用 第一章 微信小程序的基本知识1
  10. Linux LVM与磁盘配额详解