- 类别:javanative 别名:— 优先级:—
- 作者:—
- 依赖:
com.alibaba:fastjson <= 2.0.26
FastjsonToString1 的 fastjson2 版本:把内层对象放入 com.alibaba.fastjson2.JSONArray,利用 JSONArray.toString() 触发时对元素做 JSON 序列化、进而遍历调用元素 getter 的行为,把「toString 触发点」转成「getter 触发点」,衔接 Getter 型 sink 子链。
- 入口
tags:ToString—— 承接上一环提供的「toString()会被调用」的触发点。 - 衔接
nextTags:TemplatesImplChain、LdapAttributeChain、SignedObjectChain、MapMessageChain、C3p0JndiChain、DataSourceChains、DataSourceWrapperChain—— 之后可接任意 getter 驱动的 sink。 excludes:无。
除 import 的是 fastjson2 的 JSONArray 外,代码与 FastjsonToString1 完全一致:
public Object getObject(Object obj) throws Exception {
JSONArray jsonArray = new JSONArray(); // 注意:com.alibaba.fastjson2.JSONArray
jsonArray.add(obj);
return jsonArray;
}
@Override
public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
Object object = chain.doCreate(context);
context.put(ContextTag.FASTJSON_HANDLE_BYPASS_KEY, object);
return this.getObject(object);
}- 触发链:外层
toString()→com.alibaba.fastjson2.JSONArray.toString()→JSON.toJSONString→ fastjson2 的ObjectWriter/bean 序列化器 反射调用元素 bean 的每个 getter,从而点燃内层 sink。 - fastjson2 的序列化机制与 1.2.x 不同(
ObjectWriter体系、字段/方法探测规则有变),因此对 fastjson2 版本敏感:官方标注仅在<= 2.0.26上验证可用,更高版本可能因 getter 探测/白名单调整而失效。 context.put(FASTJSON_HANDLE_BYPASS_KEY, object)同 FastjsonToString1,用于与框架内 fastjson2 相关处理协同,不改变触发路径。
本类无 @Param。内层对象与目标 getter 由下游子链决定。
- 依赖
com.alibaba:fastjson <= 2.0.26(版本上限是关键差异点,高于此可能失效)。 - 与 FastjsonToString1 同为「toString → getter」桥接,区别仅在于所用 JSONArray 属于 fastjson2 而非 fastjson1,二者依据目标环境实际存在的 fastjson 大版本二选一。
- 内层走
TemplatesImpl需 JDK < 17;走 JNDI(LdapAttribute/JdbcRowSetImpl)则转 JNDI 利用。
- 自由构件,未直接出现在预设链(
usedInChains为空)。可类比 Hessian Fastjson 链 中FastjsonToString1的位置,在目标使用 fastjson2 时替换使用。
- 上游(提供
toString触发点):Hessian 反序列化落点、XStringToString*、BadAttributeValueExpExceptionToString等。 - 下游(
nextTags=getter 型 sink):TemplatesImpl、JdbcRowSetImpl、LdapAttribute、SignedObject。 - 同族:FastjsonToString1(fastjson 1.2.x 版本)、Fastjson2(走反序列化而非 toString)。