Skip to content

Latest commit

 

History

History
49 lines (40 loc) · 3.16 KB

File metadata and controls

49 lines (40 loc) · 3.16 KB

XStringForChars 调用toString(XStringToString2)

  • 类别:common 别名:— 优先级:—
  • 作者:—
  • 依赖jdk:com.sun.org.apache.xpath.internal.objects.XStringForFSB(实际使用其兄弟类 XStringForChars,均为 JDK 内置 Xalan)

作用

Equals → ToString 桥接构件,与 XStringToString1 同源,区别仅在于载体换成 XString 的子类 com.sun.org.apache.xpath.internal.objects.XStringForChars。上游以 equals() 触发时,继承自 XStringequals() 对参数调用 toString(),把链切到 toString 触发环。

链接标签

  • 入口 tagsEquals —— 承接「会调用 equals()」的上一环。
  • 衔接 nextTagsToString —— 之后接由 toString() 触发的下游 gadget。
  • excludes:无。

源码剖析

public Object getObject() throws Exception {
    XStringForChars xStringForChars = new XStringForChars(new char[0], 0, 0);
    Reflections.set(xStringForChars, "m_strCache", "");
    return xStringForChars;
}

@Override
public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
    Object obj2 = chain.doCreate(context);
    Object obj1 = this.getObject();
    Object[] objects = new Object[]{obj1, obj2};
    return objects;
}
  • XStringForCharsXString 的子类,其构造器 XStringForChars(char[], int, int) 需要一个字符数组;这里传空数组 new char[0], 0, 0 构造一个「空字符串」载体。
  • 关键差异是那句 Reflections.set(xStringForChars, "m_strCache", "")XString.str() 会优先返回缓存字段 m_strCacheXStringForChars 基于字符数组,若不预置缓存,str() 在某些路径下会去访问底层 char 缓冲区而可能抛异常或行为不稳;直接把 m_strCache 反射设为空串,保证 equals()this.str() 稳定返回 "",从而顺利走到 obj2.toString()
  • invoke 的封装逻辑与同族一致:内层对象 obj2XStringForChars 载体 obj1 打包成 Object[]{obj1, obj2},交给上游 Equals 环,反序列化时触发 obj1.equals(obj2)obj2.toString()

参数(@Param)

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

适用版本与原理要点

  • 使用 JDK 内置 XStringForChars;当环境对 XString 直接实例化不便、或需要一个「基于 char[] 的 XString 子类」作为载体时选用本变体。
  • m_strCache 反射预置是本变体独有的关键点,保证 str() 不触碰空 char 缓冲;equals→toString 语义仍继承自基类 XString
  • 受高版本 JDK 对 com.sun.* 内部类模块封装影响时需注意可达性。

所属预设链

usedInChains 为空 —— 自由构件,未直接出现在 51 条预设链中

关联

  • 上游(tags=Equals):HashMapEqualsHashTableEqualsConcurrentHashMapEquals 等。
  • 下游(nextTags=ToString):由 toString() 触发的 gadget(BadAttributeValueExpExceptionToString、各 *ToString 系列)。
  • 同族变体:XStringToString1XStringToString3XalanXStringToString1