Fastjson 1.83漏洞利用猜想

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Fastjson 1.83漏洞利用猜想相关的知识,希望对你有一定的参考价值。

参考技术A 在不久前fastjson<1.2.83又爆出来了新的问题,详细内容可以参考 https://github.com/alibaba/fastjson/wiki/security_update_20220523 ,这篇文章主要是抛转引玉,写一种可能的利用思路,详细的利用链可能要等大佬们来给出了。

文内如有不妥之处,还请批评指正。

特定依赖存在下影响 ≤1.2.80

首先看白名单对比:

这里参考之前git上的白名单列表 https://github.com/LeadroyaL/fastjson-blacklist

像org.springframework中的基本全部从白名单中剔除了。

并且更改了判断方式,if (typeName.endsWith("Exception") || typeName.endsWith("Error"))

那么这里就可以猜测本次影响的方式,就是和被剔除的内容相关。这里用org.springframework.dao.CannotAcquireLockException进行测试,可以发现实际上最终调用的类是Throwable。

那么如果是要找gadget的话,就需要从黑名单下手了。本文不做分析和介绍,有兴趣找gadget的话可以去研究研究。

需要使用1.2.80和1.2.83的fastjson jar包进行测试。

maven

demo:

上重点从checkAutoType开始,简单的说一下判断过程。

首先是判断safeModeMask,通常默认是不会开的。

检测黑名单

通过黑白名单的检测,就会尝试从Mapping中获取类

走到这里如果是白名单里的内容会尝试进行加载。

并且会直接拿到对应的类,不会再进行接下来的校验。

由于存在继承调用关系,所以在进行加载的时候就会加载f1283,并且会重新进行checkAutoType的判定。

检测过程中会先将expectClassFlag置为true。

接着检测黑名单内容,Mapping获取以及白名单检测无果之后会对clazz的类型进行校验。

接着会进行新一轮的检测。

检测通过之后,会进行类继承关系判断,实际上只要继承关系正确,就会直接进行反序列化。

最后的结果

如果直接使用java.lang.Throwable会直接抛出异常。

我们来跟一下可以很清楚的看到,Throwable既不是黑名单,也不是白名单,也不是mapping中的内容。

那么在流程中就会将这个类当做一个普通的类来进行处理,通过判断autoTypeSupport为未开启的状态,从而进行抛出处理。

FastJson常见问题

1. 怎么获得fastjson?

你可以通过如下地方下载fastjson:

<dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>fastjson</artifactId>
     <version>1.2.21</version>
</dependency>

android版本

<dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>fastjson</artifactId>
     <version>1.1.55.android</version>
</dependency>

2. fastjson主要的API哪些?

fastjson入口类是com.alibaba.fastjson.JSON,主要的API是JSON.toJSONString,和parseObject。

package com.alibaba.fastjson;
public abstract class JSON {
      public static final String toJSONString(Object object);
      public static final <T> T parseObject(String text, Class<T> clazz, Feature... features);
}

序列化:

String jsonString = JSON.toJSONString(obj);

反序列化:

VO vo = JSON.parseObject("...", VO.class);

泛型反序列化:

import com.alibaba.fastjson.TypeReference;

List<VO> list = JSON.parseObject("...", new TypeReference<List<VO>>() {});

3. 哪里找fastjson的使用例子

fastjson的使用例子看这里:https://github.com/alibaba/fastjson/wiki/Samples-DataBind

4. fastjson的性能如何?

fastjson是目前java语言中最快的json库,比自称最快的jackson速度要快,第三方独立测试结果看这里:https://github.com/eishay/jvm-serializers/wiki/Staging-Results 。

自行做性能测试时,关闭循环引用检测的功能。

JSON.toJSONString(obj, SerializerFeature.DisableCircularReferenceDetect)
VO vo = JSON.parseObject("...", VO.class, Feature.DisableCircularReferenceDetect)

这里有jackson作者cowtowncoder等人对fastjson的性能评价:https://groups.google.com/forum/#!topic/java-serialization-benchmarking/8eS1KOquAhw

5. fastjson性能比gson怎样?

fastjson比gson快大约6倍,测试结果上这里:https://github.com/eishay/jvm-serializers/wiki/Staging-Results 。

6. fastjson可以运行在android上么?

fastjson有专门的for android版本,去掉不常用的功能。jar占的字节数更小。git branch地址是:https://github.com/alibaba/fastjson/tree/android 。

7. fastjson序列化的需要像json-lib一样配置java bean的序列化么?

不需要,fastjson的序列化和反序列化都不需要做特别配置,唯一的要求是,你序列化的类符合java bean规范。

8. fastjson如何处理日期

fastjson处理日期的API很简单,例如:

JSON.toJSONStringWithDateFormat(date, "yyyy-MM-dd HH:mm:ss.SSS")

使用ISO-8601日期格式

JSON.toJSONString(obj, SerializerFeature.UseISO8601DateFormat);

全局修改日期格式

JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd";
JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);

反序列化能够自动识别如下日期格式:

  • ISO-8601日期格式
  • yyyy-MM-dd
  • yyyy-MM-dd HH:mm:ss
  • yyyy-MM-dd HH:mm:ss.SSS
  • 毫秒数字
  • 毫秒数字字符串
  • .NET JSON日期格式
  • new Date(198293238)

9. 如何定制序列化?

你可以使用SimplePrePropertyFilter过滤字段,详细看这里:https://github.com/alibaba/fastjson/wiki/%E4%BD%BF%E7%94%A8SimplePropertyPreFilter%E8%BF%87%E6%BB%A4%E5%B1%9E%E6%80%A7

关于定制序列化,详细的介绍看这里:https://github.com/alibaba/fastjson/wiki/%E5%AE%9A%E5%88%B6%E5%BA%8F%E5%88%97%E5%8C%96

10. 当对象存在引用时,序列化后的结果浏览器不支持,怎么办?

使用SerializerFeature.DisableCircularReferenceDetect特性关闭引用检测和生成。例如:

String  jsonString = JSON.toJSONString(obj, SerializerFeature.DisableCircularReferenceDetect);

11. IE 6不支持JSON带中文字符串,要怎么处理?

fastjson提供了BrowserCompatible这个配置,打开之后,所有的中文都会序列化为\uXXXX这种格式,字节数会多一些,但是能兼容IE 6。

String  jsonString = JSON.toJSONString(obj, SerializerFeature.BrowserCompatible);

12. fastjson 如何处理超大对象和超大JSON文本

fastjson提供了Stream API,详细看这里 https://github.com/alibaba/fastjson/wiki/Stream-api

13. 使用@JSONField定制序列化

fastjson提供了使用Annotation定制序列化和反序列化的功能。https://github.com/alibaba/fastjson/wiki/JSONField

14. 将对象中的空值输出

缺省情况下fastjson不输出对象的空值的,如果你需要输出空值,看这里 https://github.com/alibaba/fastjson/wiki/WriteNull_cn

以上是关于Fastjson 1.83漏洞利用猜想的主要内容,如果未能解决你的问题,请参考以下文章

fastjson反序列化漏洞原理及利用

Fastjson 的 3 种漏洞利用链,一起来看看

fastjson反序列化漏洞原理及利用

Fastjson小于1.2.68全漏洞RCE利用exp

有没有啥Fastjson 漏洞的缓解策略?

从0开始fastjson漏洞分析3