HotSwappableTargetSource+XString利用分析
字数 1078 2025-08-29 22:41:10
HotSwappableTargetSource与XString利用分析
前言
本文详细分析HotSwappableTargetSource与XString在Java反序列化中的利用方式,解释为什么XString需要配合HotSwappableTargetSource使用而不能单独利用equals调用toString方法。
XString单独利用分析
基本原理
XString可以通过HashMap的putVal方法触发equals调用,进而调用toString方法。关键调用链如下:
HashMap#putVal -> XString#equals -> JSONObject#toString
利用条件
- 需要向HashMap添加两个键值对
- 两个键的hash值必须相同,才能触发equals比较
- 第二个键的equals方法会被调用,参数是第一个键
关键代码分析
// HashMap.putVal关键代码
if (p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k))))
hash碰撞问题
XString的hash计算特点:
- 会将参数强制转换为String类型计算hash
- 例如XString("x")会计算"x"的hash值
对于JSONObject中的TemplatesImpl对象存在问题:
- TemplatesImpl没有hashCode方法,会调用Object.hashCode()
- 每次实例化的hashCode不同,导致本地爆破的hash值与反序列化时不一致
爆破脚本示例
# hash爆破脚本示例
for i in range(0, 256):
if hash(chr(i)) % 2048 == 10 % 2048:
print(chr(i))
HotSwappableTargetSource的妙用
解决hash不一致问题
HotSwappableTargetSource的优势:
- 自身实现了hashCode方法,hash值稳定
- 可以作为HashMap的键,确保hash碰撞
- 在equals方法中会调用target的equals方法
调用链
HashMap#putVal ->
HotSwappableTargetSource#equals ->
XString#equals ->
JSONObject#toString ->
TemplatesImpl#getOutputProperties
关键代码
// HotSwappableTargetSource.equals方法
public boolean equals(Object obj) {
return this.target.equals(obj);
}
XString其他组合利用
与QName的组合
在Resin反序列化中,XString可以与QName配合使用:
- QName实现了hashCode方法,hash值稳定
- hashCode基于构造时传入的字符串计算
- 可以通过Hessian反序列化触发HashMap.put
QName的hashCode实现
public int hashCode() {
return this.qname.hashCode();
}
总结对比
| 利用方式 | 优点 | 缺点 |
|---|---|---|
| 单独XString | 直接 | 受限于hash稳定性 |
| XString+HotSwappableTargetSource | hash稳定 | 需要额外类 |
| XString+QName | hash可控 | 特定环境 |
参考
- https://boogipop.com/2023/05/18/Resin&&XBean反序列化利用链学习/
- 先知社区相关分析文章