Skip to content

Latest commit

 

History

History
57 lines (44 loc) · 4.7 KB

File metadata and controls

57 lines (44 loc) · 4.7 KB

Axis2链(Axis2MetaDataEntry)

  • 类别:amf 别名:— 优先级:—
  • 作者:codewhitesec、Ar3h
  • 依赖axis(Apache Axis2,需 org.apache.axis2.util.MetaDataEntry

作用

把内层 Java 对象序列化成字节数组后塞进 Apache Axis2 的 org.apache.axis2.util.MetaDataEntry。该类是 Externalizable,在 AMF 反序列化被还原时其 readExternal 会对内嵌字节流再次执行 Java 原生反序列化,从而把 AMF 反序列化入口「桥接」到任意 Java 原生反序列化链。是 CVE-2017-3066(Adobe ColdFusion 11/12 BlazeDS AMF RCE)的核心跳板。

链接标签

  • 入口 tagsAmfDeserialize —— 承接 AMF(BlazeDS/Flex)反序列化入口,本 gadget 产出的对象由 AMF 反序列化流程还原。
  • 衔接 nextTagsJavaNativeDeserialize —— 其后必须接一条标准的 Java 原生反序列化链(如 CommonsBeanutils1、CommonsCollections 系列),因为内层对象会被序列化为字节、在目标端二次反序列化。
  • excludes:无。

源码剖析

核心只有两个方法:

public Object getObject(Object object) throws Exception {
    return new MetaDataEntry(CommonMethod.handleSerialized(object),
                             Integer.parseInt(this.revisionID),
                             this.axis2Version);
}

@Override
public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
    return this.getObject(chain.doCreate(context));
}
  • invokechain.doCreate(context) 取得内层对象——即链中下一环(nextTags=JavaNativeDeserialize)产出的 Java 原生 gadget(例如一条 CB1 → TemplatesImpl → Exec 链的最外层对象)。
  • getObject 把该内层对象交给 CommonMethod.handleSerialized(object)。该辅助方法用 Java 原生序列化(ObjectOutputStream)把对象写成 byte[]。这一步很关键:AMF 层只负责把 MetaDataEntry 还原出来,真正的 Java gadget 以字节数组形态藏在其字段里,等待 MetaDataEntry 内部的二次反序列化来触发。
  • 随后用 new MetaDataEntry(byte[], int revisionID, String version) 构造实例。revisionIDaxis2Version 决定 MetaDataEntry 的序列化格式版本:不同 Axis2 版本的 MetaDataEntry.readExternal/writeExternal 读写布局不同,必须与目标环境匹配,否则二次反序列化因格式错位而失败。

触发链:目标端 AMF 反序列化实例化 MetaDataEntryExternalizable)→ 调用其 readExternal → 内部对藏好的 byte[] 执行 ObjectInputStream.readObject → 内层 Java 原生 gadget 被反序列化并触发 sink。

参数(@Param)

字段 名称 说明 默认 可选值
axis2Version MetaDataEntry 版本 1.3 对应 revisionID 为 1;1.8 对应 revisionID 为 2,适用 Adobe ColdFusion 1.8 1.3 / 1.8
revisionID MetaDataEntry revisionID 号 axis2Version 配套的序列化修订号 2 1 / 2

注意:源码字段还有一个 className(见同族的 C3P0WrapperConnPool),但本类无此项;axis2VersionrevisionID 需成对匹配(1.3↔1、1.8↔2),否则 MetaDataEntry 的外部化读写格式不一致。

适用版本与原理要点

  • 目标须存在 Apache Axis2(提供 org.apache.axis2.util.MetaDataEntry),常见于集成了 Axis2 的 Adobe ColdFusion 11/12。
  • 面向 CVE-2017-3066:ColdFusion 的 BlazeDS 端点接受 AMF(AMFX)序列化数据,攻击者通过 AMF 引导对象图实例化 MetaDataEntry,借其 Externalizable 特性完成 AMF→Java 原生反序列化的桥接。
  • 属于「二次反序列化」思路:AMF 层与 Java 层解耦,内层链可任意替换成目标依赖具备的原生链,故 nextTags 是通用的 JavaNativeDeserialize
  • 版本号选择需贴合目标 Axis2 大版本,默认 1.8/2 面向 ColdFusion 场景。

所属预设链

  • Axis2链[Axis2MetaDataEntry, CommonsBeanutils1, TemplatesImpl, BytecodeConvert, Exec])——外层 AMF 桥接由本 gadget 承担,内层为经典 CB1 RCE 链。

关联