Skip to content

Latest commit

 

History

History
52 lines (41 loc) · 3.46 KB

File metadata and controls

52 lines (41 loc) · 3.46 KB

服务器延迟(XMLSleep)

  • 类别:xml 别名:— 优先级:—
  • 作者:—
  • 依赖jdk

作用

生成一段 XMLDecoder 可解析的 XML,令解析线程调用 Thread.sleep 阻塞指定秒数。用于无回显盲探测:通过响应时间差判断目标是否真的把输入交给了 java.beans.XMLDecoder 反序列化,是 XMLDecoder 系列的延迟探测 sink。

链接标签

  • 入口 tagsXMLDecoderPayloadEND —— 承接 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):无需内层字节码或对象。
  • getObjectsleep(秒,字符串)parseInt 后乘 1000 转为毫秒,填入模板的 %s
  • XML 语义:<object class="java.lang.Thread">XMLDecodernew Thread(),随后 <void method="sleep"><long>...</long></void> 在该实例上反射调用 sleep(long)。虽然 Thread.sleep 是静态方法,但 XMLDecoder 通过实例反射调用同样成立,效果是解析当前请求的线程原地阻塞,从而拉长服务器响应时间。
  • 因为只是让线程 sleep、不加载任何字节码或命令,探测过程无副作用、相对安全,适合先确认漏洞点存在再上重载荷。

参数(@Param)

字段 名称 说明 默认 可选值
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 单独使用。

关联