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 替代方案
通过研究发现存在其他触发点:
- 利用
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高版本二次反序列化绕过的原理和实现方式,同时也能帮助开发人员更好地防御此类漏洞。