fastjson漏洞分析-历史漏洞(图解)

一 fastjson1.2.24

修复方式: 添加黑白名单校验

二 Templateslmpl利用链

条件: 开启autoTypeSuppose

三 fastjson1.2.41

条件: 开启autoTypeSuppose
利用方式: "L;" 绕过

修复方式: 过滤一次"L;"

四 fastjson1.2.41中checkAutoType逻辑

简单来说

不管开不开autoTypeSuppose,都会经过黑白名单,最后开启autoTypeSuppose才会返回类,否则即使是业务类、测试的User/Cat都不会通过。

后续的47/68 绕过则围绕着mapping和期望类入手

四 fastjson1.2.42

条件: 开启autoTypeSuppose
利用方式: 双写"L;"

修复方式: 校验LL

五 fastjson1.2.43

条件: 开启autoTypeSuppose
利用方式: [开头的绕过方式还没有去除

六 fastjson1.2.47 mappings绕过

利用方式: mappings写入

修复方式:
1 safeModeclass
2 class的val无法将类写入mapping

七 fastjson1.2.68 safeMode

开启safeMode后,不解析autoType,除非自定义的

八 fastjson1.2.68 autoCloseable 期望类绕过

1 期望类需求:

2 期望类实现:checkAutoType中设计一个参数(期望类),如果加载类是期望类子类,可直接加载。再设置一些常规类的解析器可直接调。
3 期望类失误:某些期望类的子类存在利用链。
4 修复:不能直接从mappings去除,AutoCloseable有用。期望类功能也有用。只是因AutoCloseable派生类有问题,不让其用期望类功能了。

总结:期望类是一些基础的类,派生类相对安全,fastjson本意想要其派生类也可直接加载而不需要开启SupportAutoType。第一层为期望类时,第二层期望类的派生类在没开启autoType Support时也可以直接加载。

简图

全图

九 fastjson 1.2.80 java.lang.Exception 期望类绕过

autoCloseable中说到,期望类功能不想去除,所以修复的时候只是在checkAutoType函数里把autoCloseable给加到黑名单里,即允许直接加载,但不允许加载嵌套的派生类。
而1.2.68时,还有另一个反序列化器会调用派生类,ThrowableDeserializer(java.lang.Throwable的派生类会走该序列化器,Throwable也将被当做期望类),只是当时没找到利用链。

1.2.80 payload 就是在这之下找到的链。
payload: {"@type":"java.lang.Exception","@type":"org.python.antlr.ParseException",}
Throwable本身是可信的。
其派生类Exception 异常类也被当做可信的,会选择"异常抛出Throwable"的反序列化器,反序列化器将Throwable作为期望类,并允许其后的jython pgsql 直接加载。

简图

转标表明:https://www.cnblogs.com/huim/p/16566911.html

参考
fastjson24-47: https://www.cnblogs.com/nishoushun/p/16074640.html
TemplatesImpl链: http://www.red3691.top/2021/12/20/Fastjson-TemplatesImpl链-反序列化漏洞分析/
fastjson用法: http://www.lmxspace.com/2019/06/29/FastJson-反序列化学习/
反射: https://blog.csdn.net/Eve_perfect/article/details/125675719
fastjson1.2.68分析: https://y4er.com/posts/fastjson-bypass-autotype-1268/#分析

posted @ 2022-08-09 17:29  huim  阅读(569)  评论(0编辑  收藏  举报