Skip to content

Latest commit

 

History

History
50 lines (41 loc) · 3.97 KB

File metadata and controls

50 lines (41 loc) · 3.97 KB

需要toString链触发的Fastjson反序列化链(FastjsonToString1)

  • 类别:javanative 别名:— 优先级:—
  • 作者:—
  • 依赖com.alibaba:fastjson:1.2.x

作用

把内层对象塞进一个 com.alibaba.fastjson.JSONArray,利用 fastjson 1.2.x 在 JSONArray.toString() 时对数组元素做 JSON 序列化、进而遍历调用元素的所有 getter 这一行为,把一次「toString 触发点」转换成一次「getter 触发点」。是 Hessian/二次反序列化等以 toString() 为落点的场景中,衔接 TemplatesImplJdbcRowSetImpl 等 Getter 型 sink 的桥接构件。

链接标签

  • 入口 tagsToString —— 承接上一环提供的「toString() 会被调用」的触发点(如 XString/BadAttributeValueExpException/Hessian 的 toString 落点)。
  • 衔接 nextTagsTemplatesImplChainLdapAttributeChainSignedObjectChainMapMessageChainC3p0JndiChainDataSourceChainsDataSourceWrapperChain —— 之后可接任意「靠 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);
}
  • invokechain.doCreate 得到内层对象(通常是一个「暴露危险 getter」的 bean,如 TemplatesImplgetOutputPropertiesJdbcRowSetImplgetDatabaseMetaData),再用 getObject 把它 addJSONArray
  • 触发链:当外层的 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)

本类无 @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 触发段。

关联