- 类别:common 别名:— 优先级:—
- 作者:—
- 依赖:
jdk:javax.sound.sampled.AudioFormat$Encoding(纯 JDK 内置类,无第三方依赖)
利用 JDK 内置类 javax.sound.sampled.AudioFormat$Encoding 的 equals() 会调用参数对象 toString() 这一特性,把「一次 equals 比较」转换为「一次任意对象的 toString 调用」。功能与 AudioFileFormat 完全等价,只是换用另一个 JDK 类作为 equals→toString 的桥接载体,便于绕过针对具体类名的黑名单。
- 入口
tags:Equals、NotForJavaSerializableEquals—— 需要上游一个触发equals()的容器 gadget(HashMapEquals等)来对本 gadget 产出的配对元素调用a.equals(b)。NotForJavaSerializable—— 产物含未初始化实例与Object[]载体,不适用于 Java 原生序列化,仅用于按字段重建的协议(Hessian/JSON)。
- 衔接
nextTags:ToString—— 之后接一个暴露危险toString()的 gadget(如JacksonToString、XBeanToString)。 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 可配参数。
- 仅依赖 JDK 内置
javax.sound.sampled.AudioFormat$Encoding,无第三方库要求。 - 依赖 JDK
equals()→toString()语义,各主流版本稳定可用。 NotForJavaSerializable限定用于 Hessian/Fastjson/Jackson 等非原生序列化入口。- 与 AudioFileFormat 互为等价替换,选用哪一个通常取决于目标环境的类黑名单。
自由构件,未直接出现在 51 条预设链中(usedInChains 为空)。典型手工组合:HashMapEquals → AudioFormat → JacksonToString → …。
- 上游(
nextTags=Equals):HashMapEquals、HashTableEquals、ConcurrentHashMapEquals、HotSTSourceEquals、Rdn - 下游(
tags=ToString):JacksonToString、XBeanToString、FastjsonToString1/FastjsonToString2、RomeToStringBean1/2 - 同族:AudioFileFormat(
AudioFileFormat$Type版本,等价替换)