这是一个用于测试 Fastjson + MySQL 条件下不出网利用的测试环境。该环境演示了在 Fastjson 1.2.83 开启 autotype 的情况下(对于老版本 Fastjson 不开启 autotype 的情况也能利用类似的手法),通过 MySQL JDBC 的 NamedPipe 机制实现不出网 RCE 的利用方式。
详细的技术分析和利用原理请参考:
Fastjson1.2.83(开autotype)+MySQL不出网利用
https://fushuling.com/index.php/2025/12/04/fastjson1-2-83%e5%bc%80autotypemysql%e4%b8%8d%e5%87%ba%e7%bd%91%e5%88%a9%e7%94%a8/
使用 docker-compose 启动测试环境:
docker-compose up启动后访问:http://127.0.0.1:8080
exp.py 是利用脚本,默认利用的是 java-chains 上的 OneForAllEcho 内存马(利用的是 rce.txt)。
通过请求头 X-Authorization 可以指定执行的命令,例如:
python exp.py脚本会自动:
- 将
rce.txt中的恶意数据通过 socket 发送到目标服务器 - 通过爆破
/proc/self/fd/{fd}的方式找到缓存的恶意文件 - 构造 Fastjson payload 触发反序列化
- 执行内存马,通过
X-Authorization请求头传递命令
fastjson_mysql/
├── docker-compose.yml # Docker Compose 配置文件
├── Dockerfile # Docker 镜像构建文件
├── pom.xml # Maven 项目配置文件
├── exp.py # 利用脚本(使用 OneForAllEcho 内存马)
├── rce.txt # OneForAllEcho 内存马的恶意 pipe 文件
├── calc_5.txt # MySQL 5 版本的恶意 pipe 文件(用于弹出计算器)
├── calc_6.txt # MySQL 6 版本的恶意 pipe 文件(用于弹出计算器)
├── calc_8.txt # MySQL 8 版本的恶意 pipe 文件(用于弹出计算器)
├── src/
│ └── main/
│ └── java/
│ └── com/
│ └── suctf/
│ ├── Application.java # Spring Boot 主应用类
│ ├── Fastjson_mysql_calc_5.java # MySQL 5 条件下 Fastjson 不出网利用示例代码(需要 calc_5.txt)
│ ├── Fastjon_mysql_calc_6.java # MySQL 6 条件下 Fastjson 不出网利用示例代码(需要 calc_6.txt)
│ ├── Fastjson_mysql_calc_8.java # MySQL 8 条件下 Fastjson 不出网利用示例代码(需要 calc_8.txt)
│ ├── Mysql_calc.java # MySQL 相关测试代码
│ └── controller/
│ ├── IndexController.java # 首页控制器
│ └── JsonController.java # JSON 解析控制器(/json/parse 接口)
└── README.md # 本文件
- exp.py: 自动化利用脚本,使用 OneForAllEcho 内存马实现 RCE
- 通过
X-Authorization请求头传递要执行的命令 - 使用
rce.txt作为恶意 pipe 文件
- 通过
- rce.txt: OneForAllEcho 内存马的恶意 pipe 文件,用于
exp.py脚本 - calc_5.txt: MySQL 5 版本的恶意 pipe 文件,用于弹出计算器演示
- calc_6.txt: MySQL 6 版本的恶意 pipe 文件,用于弹出计算器演示
- calc_8.txt: MySQL 8 版本的恶意 pipe 文件,用于弹出计算器演示
-
Fastjson_mysql_calc_5.java: MySQL 5 条件下 Fastjson 不出网利用的示例代码
- 需要配合
calc_5.txt使用 - 演示如何通过 Fastjson 反序列化触发 MySQL JDBC 的 NamedPipe 机制
- 需要配合
-
Fastjon_mysql_calc_6.java: MySQL 6 条件下 Fastjson 不出网利用的示例代码
- 需要配合
calc_6.txt使用 - 使用
com.mysql.cj.jdbc.ha.LoadBalancedMySQLConnection类
- 需要配合
-
Fastjson_mysql_calc_8.java: MySQL 8 条件下 Fastjson 不出网利用的示例代码
- 需要配合
calc_8.txt使用
- 需要配合
- Application.java: Spring Boot 应用主类
- JsonController.java: 提供
/json/parse接口,用于接收和解析 JSON 数据 - IndexController.java: 首页控制器
该利用方式的核心在于:
- Fastjson autotype 开启: 当 Fastjson 开启 autotype 时,会走黑名单机制,可以使用一些未进入黑名单的类
- MySQL JDBC NamedPipe: 通过
NamedPipeSocketFactory可以指定一个本地文件作为数据源,而不需要真实的网络连接 - 文件描述符爆破: 利用 Linux 的
/proc/self/fd/{fd}机制,通过爆破文件描述符找到缓存的恶意文件 - 反序列化链: 恶意 pipe 文件中包含反序列化 payload,触发后可以实现 RCE
- 该环境仅用于安全研究和测试目的
- 请勿在生产环境中使用
- 确保在隔离的网络环境中运行
- java-chains - 提供恶意 pipe 文件生成功能
- jdbc-tricks - JDBC 利用技巧总结