fastjson高版本二次反序列化绕过
字数 1317 2025-08-22 12:23:35

Fastjson高版本二次反序列化绕过技术分析

1. 背景介绍

Fastjson是阿里巴巴开源的一个高性能JSON处理库,在Java开发中被广泛使用。然而,Fastjson历史上存在多个反序列化漏洞,本文主要分析高版本Fastjson中二次反序列化绕过的技术细节。

2. 环境分析

2.1 依赖检查

首先需要分析目标应用的依赖情况:

  • 检查pom.xml文件确认Fastjson版本
  • 查看是否存在其他相关依赖
  • 确认反序列化触发路由

2.2 黑名单机制

高版本Fastjson实现了反序列化黑名单机制:

  • 不能以BadAttributeValueExpException#readObject开头进行反序列化
  • 需要寻找其他触发点绕过黑名单

3. 漏洞链分析

3.1 经典Gadget

传统的利用链通常需要触发JSONObject#toString方法,但在高版本中受到限制。

3.2 替代方案

通过研究发现存在其他触发点:

  1. 利用SignedObject#getObject方法触发二次反序列化
  2. 通过EventListenerList链触发JSONArray#toString
  3. 最终组合多层结构绕过黑名单

4. Payload构造

4.1 基本结构

完整的Payload需要多层嵌套:

  1. 最内层包含恶意字节码
  2. 外层使用JSONArray#toString结构
  3. 再外层使用BadAttributeValueExpException#readObject
  4. 最外层实现二次反序列化绕过黑名单

4.2 编码注意事项

  • 使用BP发包时必须进行二次编码
  • 特别注意+号等特殊字符的处理,避免被当作空格

5. 内存马利用

在目标环境不出网的情况下,可以部署SpringBoot内存马:

  • 提供SpringMemShell.java作为内存马实现
  • 通过反序列化漏洞注入内存马
  • 内存马可以提供WebShell功能或其他持久化访问方式

6. 其他可利用Gadget

6.1 Xtring利用链

  • 利用Hashmap#readObject触发equal方法
  • 通过XString#equal触发JSON的toString方法
  • 绕过黑名单限制

6.2 HotSwappableTargetSource链

参考文章详细介绍了该链的利用方式:

  • 属于Rome链的变种
  • 提供新的反序列化触发路径
  • 适用于特定环境下的绕过

7. 技术总结

  1. Java反序列化漏洞利用链与PHP有相似之处,但调用路径更复杂
  2. 高版本防御需要寻找二次反序列化触发点
  3. 多种Gadget可以组合使用,提高利用成功率
  4. 内存马技术在不具备外联条件的环境中特别有用

8. 防御建议

  1. 及时升级Fastjson到最新安全版本
  2. 严格控制反序列化源,避免不可信数据输入
  3. 实施更严格的黑白名单机制
  4. 监控异常反序列化行为

9. 参考文献

  1. 先知社区原文章
  2. HotSwappableTargetSource链分析文章
  3. Fastjson官方安全公告

通过以上技术分析,安全研究人员可以深入理解Fastjson高版本二次反序列化绕过的原理和实现方式,同时也能帮助开发人员更好地防御此类漏洞。

Fastjson高版本二次反序列化绕过技术分析 1. 背景介绍 Fastjson是阿里巴巴开源的一个高性能JSON处理库,在Java开发中被广泛使用。然而,Fastjson历史上存在多个反序列化漏洞,本文主要分析高版本Fastjson中二次反序列化绕过的技术细节。 2. 环境分析 2.1 依赖检查 首先需要分析目标应用的依赖情况: 检查 pom.xml 文件确认Fastjson版本 查看是否存在其他相关依赖 确认反序列化触发路由 2.2 黑名单机制 高版本Fastjson实现了反序列化黑名单机制: 不能以 BadAttributeValueExpException#readObject 开头进行反序列化 需要寻找其他触发点绕过黑名单 3. 漏洞链分析 3.1 经典Gadget 传统的利用链通常需要触发 JSONObject#toString 方法,但在高版本中受到限制。 3.2 替代方案 通过研究发现存在其他触发点: 利用 SignedObject#getObject 方法触发二次反序列化 通过 EventListenerList 链触发 JSONArray#toString 最终组合多层结构绕过黑名单 4. Payload构造 4.1 基本结构 完整的Payload需要多层嵌套: 最内层包含恶意字节码 外层使用 JSONArray#toString 结构 再外层使用 BadAttributeValueExpException#readObject 最外层实现二次反序列化绕过黑名单 4.2 编码注意事项 使用BP发包时必须进行二次编码 特别注意 + 号等特殊字符的处理,避免被当作空格 5. 内存马利用 在目标环境不出网的情况下,可以部署SpringBoot内存马: 提供 SpringMemShell.java 作为内存马实现 通过反序列化漏洞注入内存马 内存马可以提供WebShell功能或其他持久化访问方式 6. 其他可利用Gadget 6.1 Xtring利用链 利用 Hashmap#readObject 触发 equal 方法 通过 XString#equal 触发JSON的 toString 方法 绕过黑名单限制 6.2 HotSwappableTargetSource链 参考文章详细介绍了该链的利用方式: 属于Rome链的变种 提供新的反序列化触发路径 适用于特定环境下的绕过 7. 技术总结 Java反序列化漏洞利用链与PHP有相似之处,但调用路径更复杂 高版本防御需要寻找二次反序列化触发点 多种Gadget可以组合使用,提高利用成功率 内存马技术在不具备外联条件的环境中特别有用 8. 防御建议 及时升级Fastjson到最新安全版本 严格控制反序列化源,避免不可信数据输入 实施更严格的黑白名单机制 监控异常反序列化行为 9. 参考文献 先知社区原文章 HotSwappableTargetSource链分析文章 Fastjson官方安全公告 通过以上技术分析,安全研究人员可以深入理解Fastjson高版本二次反序列化绕过的原理和实现方式,同时也能帮助开发人员更好地防御此类漏洞。