2025国赛暨长城杯AWDP-TimeCapsule完整题解
字数 1499 2025-08-30 06:50:35
AWDP-TimeCapsule漏洞分析与利用完整指南
漏洞概述
这是一个关于2025年国赛暨长城杯AWDP比赛中TimeCapsule题目的完整漏洞分析与利用方案。题目涉及Java反序列化漏洞和AES加密绕过,主要利用点包括:
- 存在反序列化漏洞的路由:
/api/capsule/import - 使用JDK8+Jackson环境,存在Jackson反序列化链
- 通过二次反序列化绕过SafeObjectInputStream限制
- 利用AES/CTR模式漏洞伪造加密数据
漏洞修复方案
Fix方案:
直接删除com.ctf.util.FieldGetterHandler类即可修复漏洞。
漏洞利用分析
1. 反序列化入口点
审计代码发现存在反序列化的路由:
/api/capsule/import
环境依赖:
- JDK8
- Jackson
2. 反序列化限制
题目中ObjectInputStream做了限制:
- 只能反序列化
ctf包下的类 - 或
java.开头的类 - 或数组类型
3. 寻找Gadget链
题目中存在一个代理类FieldGetterHandler,其invoke方法可以执行任意getter方法。例如:
proxyInstance.anyMethod(a) // 会执行a.getXxx()
利用思路:
-
使用
SignedObject类的getObject方法进行二次反序列化SignedObject位于java.security包,满足限制条件getObject方法可以对任意数据进行反序列化
-
触发机制:
- 使用
PriorityQueue的compare方法触发代理调用 - 将
comparator设为代理对象proxyInstance - 将比较对象
x设为signedObject
- 使用
4. 绕过AES验证
加密方式:AES/CTR/nopadding
攻击方法:
- 利用已知明文R和对应密文E,可以还原出keystream
- 使用还原的keystream可以伪造相同长度明文的密文
具体步骤:
- 构造一个与恶意序列化数据长度相同(3607字节)的
TimeCapsule对象 - 通过以下路由获取加密数据:
/api/capsules- 创建capsule/api/capsules/{id}/export- 获取加密后的capsule数据
- 使用还原的keystream伪造恶意序列化数据的密文
5. 完整利用流程
- 注册用户获取密钥
- 构造恶意序列化数据(PriorityQueue链)
- 创建相同长度的合法capsule获取加密数据
- 计算keystream并伪造恶意数据的密文
- 通过
/api/capsule/import触发反序列化
技术细节
1. 反序列化链构造
利用PriorityQueue触发链:
PriorityQueue.readObject()
-> heapify()
-> siftDown()
-> siftDownUsingComparator()
-> comparator.compare(x, y) // 触发代理调用
2. AES/CTR攻击原理
CTR模式加密公式:
C = P ⊕ E(K, IV)
其中:
- C: 密文
- P: 明文
- K: 密钥
- IV: 初始化向量
- E: 加密函数
攻击者已知一对(P, C),可以计算:
E(K, IV) = P ⊕ C
然后对于新的明文P',可以构造:
C' = P' ⊕ E(K, IV)
3. 长度控制
需要精确控制序列化数据的长度(约3607字节),可以通过调整content字段实现。
防御建议
- 避免使用不安全的反序列化
- 使用安全的ObjectInputStream实现
- 避免使用不安全的加密模式(如CTR)
- 对用户输入进行严格验证
- 移除不必要的危险类(如FieldGetterHandler)
总结
该题目综合考察了:
- Java反序列化漏洞利用
- 二次反序列化绕过技巧
- 加密算法攻击
- 长度扩展攻击
在实际比赛中,需要快速识别反序列化入口,分析限制条件,并找到合适的绕过方法。同时需要理解加密算法的弱点,才能完成完整的攻击链。