VNCTF java 题目调用链分析
字数 1791 2025-08-22 12:23:24
VNCTF Java反序列化题目调用链分析教学文档
一、题目概述
这是一个Java反序列化漏洞利用的CTF题目,主要考察反序列化调用链的构造和绕过WAF的技巧。题目使用了多层反序列化调用链,结合了JDK原生类和Fastjson的漏洞利用方式。
二、环境分析
1. 依赖分析
- 题目使用了较少的依赖
- 主要关注点是JDK原生类和Fastjson
2. 关键类分析
- 反序列化入口类
- WAF类(位于特定包名下)
- 出口类(用于最终执行恶意代码)
3. WAF限制
- 禁用了Jackson的利用链
- 需要寻找其他可利用的链
三、主要利用链分析
1. 主调用链结构
EventListenerList.readObject()
-> UndoManager.toString()
-> Vector.toString()
-> Fastjson原生触发
-> 二次反序列化
-> BadAttributeValueException
-> 出口类.getOutputProperties()
-> 字节码加载
2. 详细调用过程
第一阶段:初始反序列化
-
EventListenerList.readObject()
- JDK原生类
javax.swing.event.EventListenerList的readObject方法 - 会调用
add方法将反序列化的对象添加到监听器列表
- JDK原生类
-
UndoManager.toString()触发
add方法中将javax.swing.undo.UndoManager对象与字符串拼接- 这会触发
UndoManager的toString()方法
-
Vector.toString()调用
UndoManager.toString()会调用到java.util.Vector的toString方法Vector.toString()会调用父类的AbstractCollection.toString()
-
Fastjson原生触发
- 在
AbstractCollection.toString()中会调用append方法 - 进而调用
String.valueOf(obj),触发obj的toString方法 - 控制obj为
JSONArray对象,触发Fastjson的原生漏洞
- 在
第二阶段:Fastjson原生利用
-
Fastjson触发机制
- Fastjson原生漏洞会触发类的getter方法
- 需要构造一个能触发二次反序列化的场景
-
SignedObject利用
- 控制
JSONArray中包含SignedObject对象 SignedObject.getObject()方法会执行二次反序列化- 可以绕过WAF对第一次反序列化的限制
- 控制
第三阶段:二次反序列化
-
BadAttributeValueException利用
- 在二次反序列化中使用
BadAttributeValueException - 这是Java反序列化中常用的触发
toString的老朋友 - 可以触发出口类的
getOutputProperties方法
- 在二次反序列化中使用
-
最终执行
- 通过
getOutputProperties触发字节码加载 - 实现任意代码执行
- 通过
四、其他可能的利用链
1. JNDI攻击面
- 使用
LdapAttribute(JDK原生类) - 构造LDAP引用攻击
- 需要注意JDK版本限制
利用步骤:
- 自建恶意LDAP服务
- 构造
LdapAttribute对象指向恶意服务 - 触发JNDI查找
2. Jackson原生利用
- 如果WAF没有完全禁用Jackson
- 可以通过二次反序列化触发Jackson漏洞
POC结构:
第一次反序列化(绕过WAF)
-> 触发二次反序列化
-> Jackson原生链
-> 任意代码执行
五、关键知识点总结
-
多阶段反序列化
- 通过第一次反序列化触发第二次反序列化
- 绕过WAF对第一次反序列化的限制
-
toString触发点
- 利用对象与字符串拼接、集合toString等方法
- 触发关键类的toString方法
-
Fastjson原生利用
- 通过控制JSONArray触发Fastjson漏洞
- 利用getter方法执行链
-
SignedObject绕过
- 利用SignedObject进行二次反序列化
- 绕过对直接反序列化的限制
-
出口类利用
- 最终需要通过某个类的特定方法执行代码
- 通常使用能触发字节码加载或命令执行的类
六、防御建议
-
反序列化防御
- 使用白名单控制可反序列化的类
- 避免直接反序列化不可信数据
-
WAF增强
- 不仅要检查第一次反序列化,还要防范二次反序列化
- 禁止关键危险类如SignedObject
-
依赖管理
- 及时更新Fastjson等有漏洞的组件
- 移除不必要的依赖
-
JNDI防护
- 限制JNDI查找
- 升级JDK版本
-
运行时保护
- 使用SecurityManager限制敏感操作
- 监控异常行为