- 类别:common 别名:— 优先级:—
- 作者:—
- 依赖:
jdk:com.sun.org.apache.xpath.internal.objects.XStringForFSB(JDK 内置 Xalan)
Equals → ToString 桥接构件,与同族一致,载体换成 com.sun.org.apache.xpath.internal.objects.XStringForFSB(基于 FastStringBuffer 的 XString 子类)。上游以 equals() 触发时,继承自 XString 的 equals() 对参数调用 toString(),完成到 toString 触发环的切换。
- 入口
tags:Equals—— 承接「会调用equals()」的上一环。 - 衔接
nextTags:ToString—— 之后接由toString()触发的下游 gadget。 excludes:无。
public Object getObject() throws Exception {
Object xStringForFSB = Reflections.createWithoutConstructor(
"com.sun.org.apache.xpath.internal.objects.XStringForFSB");
Reflections.setFieldValue(xStringForFSB, "m_obj", null);
return xStringForFSB;
}
@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;
}XStringForFSB的构造器需要一个FastStringBuffer实例,直接new较繁琐;这里用Reflections.createWithoutConstructor(...)绕过构造器直接实例化一个空壳对象。- 随后
Reflections.setFieldValue(xStringForFSB, "m_obj", null):XString/XObject体系的取值字段m_obj被显式置为null,避免序列化/比较过程中携带无关或不可序列化的内部缓冲对象,保证对象干净可序列化,equals()路径仍能走到对参数的toString()。 invoke封装同族一致:Object[]{obj1=XStringForFSB, obj2=内层对象},交由上游Equals环,反序列化时obj1.equals(obj2)→obj2.toString()。
本类无 @Param,无用户可配字段。
- 使用 JDK 内置
XStringForFSB,通过「免构造器实例化 + 反射清空m_obj」得到一个可序列化的空壳载体;适合XString/XStringForChars直接构造受限或需要 FSB 子类作为载体的场景。 equals→toString语义继承自基类XString,与 XStringToString1/XStringToString2 同源。- 受高版本 JDK 对
com.sun.*内部类模块封装(JPMS)影响时需注意可达性。
usedInChains 为空 —— 自由构件,未直接出现在 51 条预设链中。
- 上游(
tags=Equals):HashMapEquals、HashTableEquals、ConcurrentHashMapEquals等。 - 下游(
nextTags=ToString):由toString()触发的 gadget(BadAttributeValueExpExceptionToString、各*ToString系列)。 - 同族变体:XStringToString1、XStringToString2、XalanXStringToString1。