CVE-2022-25845 FastJson 代码执行漏洞分析
漏洞分析
这是浅蓝师傅在KCon黑客大会演讲之前我分析的,分析的比较浅显,详细的可以看一下浅蓝师傅的视频。
浅蓝师傅发现并向阿里巴巴报告fastjson 1.2.80
autotype
绕过反系列化漏洞,特定依赖存在下影响fastjson <= 1.2.80
网传poc
如下:
1 | public class fastjson_1_2_80 { |
总的来说就是利用Exception
类绕过checkAutoType
。然后利用ThrowableDeserializer.java
中的特性,将第二次进入checkAutoType
方法的参数typeName
赋值com.alter.test.Poc
,将为exceptClass
赋值为Throwable.class
。这样利用exceptClass
绕过检查,直接返回poc
类,后面就是实例化,自动调用setter
。
注意:poc
类要extends Exception
;
漏洞修复与绕过尝试
可以看到官方补丁在checkAutoType
中增加了两个判断(第二个图是在commit 8f3410f
中增加的)
expectClass == null && clazz != null && Throwable.class.isAssignableFrom(clazz) && !autoTypeSupport
- 在没开启
autoTypeSupport
的情况下,如果typename
以Exception
或Error
结尾就返回null,否则抛出异常;
第二个判断更绝了,在没开启autoTypeSupport
的情况下,如果typeName
以Exception
或Error
结尾,那就返回null
;否则抛出异常。全封死了。但只要绕过第一个判断并且能在第二个判断前返回就还有机会
尝试绕过一下。首先第一个判断,clazz
是在这里赋值的
这里就涉及了1.2.47
漏洞的原因(由于1.2.48
版本修复了,这里也没办法提前缓存其他类),只能用已有的类
这也意味着要想绕过补丁中的第一个判断,就要从mappings
中得到类。这个类还不能是
或继承
或实现
Throwable类
。
找到一个java.util.concurrent.atomic.AtomicLong
类。但是报错了,因为token
的原因。
又找到了java.util.TreeMap
。虽然绕过了第一道验证,但expectClass
还被设为了空
假设这部分绕过了,变成了有expectClass
,但expectClass
还不能是java.io.Serializable
、java.lang.Cloneable
、java.io.Closeable
、java.lang.AutoCloseable
、java.lang.Readable
、java.lang.Runnable
、java.util.EventListener
、java.lang.Iterable
、java.util.Collection
、java.lang.Object
类。
后面想到了一个办法,直接去源码里找哪里调用了checkAutoType
并且expectClass
不为空不就得了。结果只找到两处
1 | // src/main/java/com/alibaba/fastjson/parser/deserializer/ThrowableDeserializer.java |
第一处肯定不行了,第二处的类不在mapping
中,也不行。这样的话这次补丁应该是绕不过去了。
2023.4.10更新
poc详解
参考:
https://hpdoger.cn/2022/10/13/title:%20FastJson1.2.80%E6%BC%8F%E6%B4%9E%E6%B5%85%E6%9E%90/)
本地连接:
https://github.com/altEr1125/altEr1125.github.io/blob/master/file/CVE-2022-25845%20FastJson%20%E4%BB%A3%E7%A0%81%E6%89%A7%E8%A1%8C%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90/FastJson1.2.80%E6%BC%8F%E6%B4%9E%E6%B5%85%E6%9E%90.html