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

利用条件

  1. 需要向HashMap添加两个键值对
  2. 两个键的hash值必须相同,才能触发equals比较
  3. 第二个键的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的优势:

  1. 自身实现了hashCode方法,hash值稳定
  2. 可以作为HashMap的键,确保hash碰撞
  3. 在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配合使用:

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