- 类别: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)的核心跳板。
- 入口
tags:AmfDeserialize—— 承接 AMF(BlazeDS/Flex)反序列化入口,本 gadget 产出的对象由 AMF 反序列化流程还原。 - 衔接
nextTags:JavaNativeDeserialize—— 其后必须接一条标准的 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));
}invoke先chain.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)构造实例。revisionID与axis2Version决定MetaDataEntry的序列化格式版本:不同 Axis2 版本的MetaDataEntry.readExternal/writeExternal读写布局不同,必须与目标环境匹配,否则二次反序列化因格式错位而失败。
触发链:目标端 AMF 反序列化实例化 MetaDataEntry(Externalizable)→ 调用其 readExternal → 内部对藏好的 byte[] 执行 ObjectInputStream.readObject → 内层 Java 原生 gadget 被反序列化并触发 sink。
| 字段 | 名称 | 说明 | 默认 | 可选值 |
|---|---|---|---|---|
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),但本类无此项;axis2Version与revisionID需成对匹配(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 链。
- 下游(
nextTags=JavaNativeDeserialize):CommonsBeanutils1 等 Java 原生反序列化链头。 - 同族变体:Axis2MetaDataEntryObf——不在本类内部做序列化,改为直接接收已序列化/混淆过的
byte[]。 - 同类别其它 AMF 桥接:ReplicatedTreeGadget(JGroups 版桥接)、C3P0WrapperConnPool、HikariConfigGadget(直接产 JNDI,
END收尾)。