Skip to content

Latest commit

 

History

History
49 lines (40 loc) · 3.58 KB

File metadata and controls

49 lines (40 loc) · 3.58 KB

XString 调用toString(XStringToString1)

  • 类别:common 别名:— 优先级:—
  • 作者:—
  • 依赖jdk:com.sun.org.apache.xpath.internal.objects.XString(JDK 内置 Xalan,无需外部依赖)

作用

Equals → ToString 的桥接构件。构造一个 com.sun.org.apache.xpath.internal.objects.XString 对象与内层对象一起返回;当上游以 equals() 触发本对象时,XString.equals() 会对参数调用 toString(),从而把链从「equals 触发环」切换到「toString 触发环」,之后可调用任意对象的 toString()

链接标签

  • 入口 tagsEquals —— 承接一个「会调用 equals()」的上一环(如基于哈希碰撞的 Map 类 gadget)。
  • 衔接 nextTagsToString —— 之后接一个「由 toString() 触发」的下游 gadget。
  • excludes:无。

源码剖析

public Object getObject() throws Exception {
    XString xString = new XString("");
    return xString;
}

@Override
public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
    Object obj2 = chain.doCreate(context);      // 内层:ToString 触发目标
    Object obj1 = this.getObject();             // XString 空串实例
    Object[] objects = new Object[]{obj1, obj2};
    return objects;
}
  • getObject 直接 new XString(""),构造一个内容为空串的 XStringXString 是 JDK 自带 Xalan 的 XPath 对象,实现了 Serializable,可安全进入序列化流。
  • invokechain.doCreate(context) 取内层对象 obj2(真正要被 toString() 触发的下游产物),再把 obj1(XString)与 obj2 打包成 Object[]{obj1, obj2} 返回。
  • 触发原理XString.equals(Object obj2) 的实现最终归结为 this.str().equals(obj2.toString())——它会对入参调用 toString()。上游 Equals 环(如 HashMapEquals/HashTableEquals/ConcurrentHashMapEquals 制造哈希碰撞)在反序列化 readObject 阶段会执行 obj1.equals(obj2),即 xString.equals(obj2),于是 obj2.toString() 被调用,链继续走向 ToString 下游。
  • 返回的两元素数组正是为上游 Equals gadget 准备的「碰撞键值对」:一个作为被比较键(XString),另一个作为比较参数(内层对象)。

参数(@Param)

本类无 @Param,无用户可配字段。

适用版本与原理要点

  • 使用 JDK 内置 com.sun.org.apache.xpath.internal.objects.XString无需引入外部 xalan 依赖,通用性好;受高版本 JDK 对 com.sun.* 内部类模块封装(JPMS)影响时需注意可达性。
  • XString.equalsequals→toString 语义是本桥的核心;三个 XStringToStringNXalanXStringToString1 只是「XString 载体的不同实现」,equals 逻辑同源。
  • 本构件不产生代码执行,仅完成触发方式的切换,RCE 能力取决于上游 Equals 环与下游 ToString sink。

所属预设链

usedInChains 为空 —— 自由构件,未直接出现在 51 条预设链中。作为 EqualsToString 通用跳板按需拼接。

关联

  • 上游(tags=Equals):HashMapEqualsHashTableEqualsConcurrentHashMapEquals 等基于 equals() 触发的 gadget。
  • 下游(nextTags=ToString):由 toString() 触发的 gadget,如 BadAttributeValueExpExceptionToString、各 *ToString 系列。
  • 同族变体:XStringToString2(XStringForChars)、XStringToString3(XStringForFSB)、XalanXStringToString1(独立 xalan 版)。