- 类别:javanative 别名:— 优先级:—
- 作者:—
- 依赖:
spring-aop:org.springframework.aop.target.HotSwappableTargetSource、xalan:xalan:2.6.0
XString1 的 Xalan 独立包变体:把载体从 JDK 内置 com.sun.org.apache.xpath.internal.objects.XString 换成 Xalan 发行包中的 org.apache.xpath.objects.XString(xalan:xalan:2.6.0)。触发链完全相同——HashMap 碰撞 → HotSwappableTargetSource.equals → XString.equals → 对内层对象调用任意 toString()。用于 JDK 高版本已封装/移除 com.sun.org.apache.xpath.internal.*、但目标 classpath 存在 xalan 时的替代方案。
- 入口
tags:JavaNativeDeserialize、HessianDeserialize—— 承接 Java 原生反序列化 / Hessian 反序列化入口。 - 衔接
nextTags:ToString—— 之后接一个「入口为toString()」的 gadget。 excludes:(无)
import org.apache.xpath.objects.XString; // 注意:xalan 独立包,非 com.sun.* 内置
public Object getObject(Object object) throws Exception {
XString xString = new XString("");
HotSwappableTargetSource h1 = new HotSwappableTargetSource(object);
HotSwappableTargetSource h2 = new HotSwappableTargetSource((Object)xString);
HashMap map = PayloadHelper.makeMap(h1, h2);
return map;
}
@Override
public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
Object object = chain.doCreate(context);
Object getterObject = context.get(ContextTag.FASTJSON_HANDLE_BYPASS_KEY);
Object resultObject = this.getObject(object);
if (getterObject != null) {
return CommonMethod.listWrap(getterObject, resultObject);
}
return resultObject;
}与 XString1 的唯一实质差异:import 的 XString 来自 org.apache.xpath.objects.XString(Xalan 2.6.0),而非 JDK 内置的 com.sun.org.apache.xpath.internal.objects.XString。两者代码逻辑同源(JDK 内置版本正是从 Xalan fork 而来),equals(Object obj2) 均执行 this.str().equals(obj2.toString()),因此 getObject 的构造与触发路径与 XString1 一字不差:
PayloadHelper.makeMap(h1, h2)令两个HotSwappableTargetSource哈希碰撞入同桶;HashMap.readObject→putVal→HotSwappableTargetSource.equals比较各自target;xString.equals(object)→object.toString()被调用,展开下游ToStringgadget。
FASTJSON_HANDLE_BYPASS_KEY 处理逻辑同 XString1。
本类无 @Param,无用户可配字段;内层对象与上下文由链自动注入。
- 依赖
xalan:xalan:2.6.0独立包,不依赖 JDK 内置 xpath。在 JDK 9+ 模块化后com.sun.org.apache.xpath.internal.*被封装/不可访问、导致 XString1 系列失效时,若目标业务引入了 xalan,则本变体仍可用——这是它存在的核心价值。 - 类名
org.apache.xpath.objects.XString与com.sun.*版本不同,也可绕过仅针对内置类名的黑名单。 - 仍需
spring-aop的HotSwappableTargetSource。
自由构件,未直接出现在 51 条预设链中(usedInChains 为空)。
- 下游(
nextTags=ToString):JacksonToString、FastjsonToString1、FastjsonToString2、XBeanToString、RomeToStringBean1/2、SpringAopAspectjweaver。 - 同族变体(JDK 内置载体):XString1、XString2、XString3。
- Xalan 家族另有
XalanXString2/XalanXString3(见 bid 78 批次),分别对应XStringForChars/XStringForFSB的 xalan 版本。