- 类别:javanative 别名:— 优先级:—
- 作者:—
- 依赖:
com.alibaba:fastjson:1.2.x
把内层对象塞进一个 com.alibaba.fastjson.JSONArray,利用 fastjson 1.2.x 在 JSONArray.toString() 时对数组元素做 JSON 序列化、进而遍历调用元素的所有 getter 这一行为,把一次「toString 触发点」转换成一次「getter 触发点」。是 Hessian/二次反序列化等以 toString() 为落点的场景中,衔接 TemplatesImpl、JdbcRowSetImpl 等 Getter 型 sink 的桥接构件。
- 入口
tags:ToString—— 承接上一环提供的「toString()会被调用」的触发点(如XString/BadAttributeValueExpException/Hessian 的 toString 落点)。 - 衔接
nextTags:TemplatesImplChain、LdapAttributeChain、SignedObjectChain、MapMessageChain、C3p0JndiChain、DataSourceChains、DataSourceWrapperChain—— 之后可接任意「靠 getter 触发」的 sink 子链。 excludes:无。
全类仅两个方法,逻辑极简:
public Object getObject(Object obj) throws Exception {
JSONArray jsonArray = new JSONArray();
jsonArray.add(obj); // 把内层对象作为数组元素
return jsonArray;
}
@Override
public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
Object object = chain.doCreate(context); // 取内层对象(下游 getter 载体)
context.put(ContextTag.FASTJSON_HANDLE_BYPASS_KEY, object); // 向上下文登记该对象,供 fastjson 相关处理绕过/复用
return this.getObject(object);
}invoke先chain.doCreate得到内层对象(通常是一个「暴露危险 getter」的 bean,如TemplatesImpl的getOutputProperties、JdbcRowSetImpl的getDatabaseMetaData),再用getObject把它add进JSONArray。- 触发链:当外层的
toString()被调用时 →JSONArray.toString()→JSON.toJSONString(this)→ fastjson 对数组每个元素做序列化 → 通过JavaBeanSerializer反射枚举并调用元素 bean 的每个 getter,从而点燃内层 sink。 context.put(FASTJSON_HANDLE_BYPASS_KEY, object):把内层对象登记到GadgetContext,供框架内 fastjson 相关的绕过/去重逻辑读取(与Fastjson构件协同),本身不改变触发路径。- 与直接反序列化的
Fastjson构件区别:Fastjson依赖 fastjson 自身的readObject/autoType触发,本构件不依赖 autoType,只借用toString → getter这一无害入口,因此入口标签是ToString而非反序列化。
本类无 @Param。内层对象与要触发的 getter 由下游子链决定。
- 依赖
com.alibaba:fastjson:1.2.x(利用的是JSONArray.toString()→ getter 遍历这一通用行为,几乎全 1.2.x 适用)。 - 只需要一个能被调用
toString()的落点,不要求 fastjson 开启 autoType,隐蔽性较好。 - 内层若为
TemplatesImpl走字节码 RCE,需目标 JDK 能加载TemplatesImpl(JDK < 17);若走LdapAttribute/JdbcRowSetImpl则转为 JNDI 利用。
- Hessian Fastjson 链(
[FastjsonToString1, SignedObject, JavaNativeSerialization, Fastjson, TemplatesImpl, BytecodeConvert, Exec])——作为 Hessian 侧toString触发段。
- 上游(提供
toString触发点):Hessian 反序列化落点、XStringToString*、BadAttributeValueExpExceptionToString等。 - 下游(
nextTags=getter 型 sink):TemplatesImpl、JdbcRowSetImpl、LdapAttribute、SignedObject。 - 同族:FastjsonToString2(fastjson2 版本)、Fastjson(走 autoType 反序列化而非 toString)。