Skip to content

Latest commit

 

History

History
49 lines (40 loc) · 3.32 KB

File metadata and controls

49 lines (40 loc) · 3.32 KB

需要toString链触发的Fastjson2反序列化链(FastjsonToString2)

  • 类别:javanative 别名:— 优先级:—
  • 作者:—
  • 依赖com.alibaba:fastjson <= 2.0.26

作用

FastjsonToString1 的 fastjson2 版本:把内层对象放入 com.alibaba.fastjson2.JSONArray,利用 JSONArray.toString() 触发时对元素做 JSON 序列化、进而遍历调用元素 getter 的行为,把「toString 触发点」转成「getter 触发点」,衔接 Getter 型 sink 子链。

链接标签

  • 入口 tagsToString —— 承接上一环提供的「toString() 会被调用」的触发点。
  • 衔接 nextTagsTemplatesImplChainLdapAttributeChainSignedObjectChainMapMessageChainC3p0JndiChainDataSourceChainsDataSourceWrapperChain —— 之后可接任意 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)

本类无 @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 时替换使用。

关联