Skip to content

Latest commit

 

History

History
56 lines (46 loc) · 3.84 KB

File metadata and controls

56 lines (46 loc) · 3.84 KB

AudioFormat$Encoding 调用toString(AudioFormat)

  • 类别:common 别名:— 优先级:—
  • 作者:—
  • 依赖jdk:javax.sound.sampled.AudioFormat$Encoding(纯 JDK 内置类,无第三方依赖)

作用

利用 JDK 内置类 javax.sound.sampled.AudioFormat$Encodingequals() 会调用参数对象 toString() 这一特性,把「一次 equals 比较」转换为「一次任意对象的 toString 调用」。功能与 AudioFileFormat 完全等价,只是换用另一个 JDK 类作为 equals→toString 的桥接载体,便于绕过针对具体类名的黑名单。

链接标签

  • 入口 tagsEqualsNotForJavaSerializable
    • Equals —— 需要上游一个触发 equals() 的容器 gadget(HashMapEquals 等)来对本 gadget 产出的配对元素调用 a.equals(b)
    • NotForJavaSerializable —— 产物含未初始化实例与 Object[] 载体,不适用于 Java 原生序列化,仅用于按字段重建的协议(Hessian/JSON)。
  • 衔接 nextTagsToString —— 之后接一个暴露危险 toString() 的 gadget(如 JacksonToStringXBeanToString)。
  • excludes:无。

源码剖析

@GadgetTags(tags={"Equals", "NotForJavaSerializable"}, nextTags={"ToString"})
public class AudioFormat$EncodingToString implements Gadget {
    public Object getObject() throws Exception {
        Object obj1 = Reflections.createWithoutConstructor("javax.sound.sampled.AudioFormat$Encoding");
        return obj1;
    }

    @Override
    public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
        Object obj2 = chain.doCreate(context);          // 内层:toString 型 gadget 产物
        Object obj1 = this.getObject();                 // 未初始化的 Encoding 实例
        Object[] objects = new Object[]{obj1, obj2};    // 配对返回
        return objects;
    }
}
  • getObject()Reflections.createWithoutConstructor(...) 跳过构造器创建 AudioFormat$Encoding,使其内部 name 字段保持 null
  • AudioFormat$Encoding.equals() 的 JDK 实现等价于 toString().equals(that.toString());当自身 toString()null 时会转而调用参数对象的 toString(),从而把执行流交给下游 toString sink。
  • invoke 先取内层对象 obj2,与 Encoding 实例 obj1 组成 Object[]{obj1, obj2}。上游 Equals 容器 gadget 反序列化时触发 obj1.equals(obj2)obj2.toString()

关键点:与 AudioFileFormat 同构——本 gadget 只提供「equals 会回调 toString 的载体 + 配对目标」,比较动作交由上游容器完成,命令执行交由下游 toString gadget 完成。

参数(@Param)

本类无 @Param 可配参数。

适用版本与原理要点

  • 仅依赖 JDK 内置 javax.sound.sampled.AudioFormat$Encoding,无第三方库要求。
  • 依赖 JDK equals()→toString() 语义,各主流版本稳定可用。
  • NotForJavaSerializable 限定用于 Hessian/Fastjson/Jackson 等非原生序列化入口。
  • AudioFileFormat 互为等价替换,选用哪一个通常取决于目标环境的类黑名单。

所属预设链

自由构件,未直接出现在 51 条预设链中(usedInChains 为空)。典型手工组合:HashMapEquals → AudioFormat → JacksonToString → …

关联