Java反序列化基础-fastjson反序列化漏洞原理分析fastjson利用条件分析

admin 2025年1月2日10:18:10评论7 views字数 2254阅读7分30秒阅读模式

、写在前面 /

好久没更新了,后台好多私信最近都没看,有加群的和要源码的师傅的私信都没看到,以后尽力每周回复大家一次消息,入群的二维码放在了文章末尾,为了防止广告还是收费1元(只有二维码部分付费,这也是为了防止一些恶意加群的人)。代码已经重新上传到仓库了,需要源码的话群内获取。另外视频讲解地址: https://www.bilibili.com/video/BV1oFrFYMEzN/

一、FastJson 介绍 /

FastJson 是一个由阿里巴巴开发的高性能 Java 库,主要用于在 Java 对象和 JSON 之间进行快速的序列化和反序列化。它支持将 Java 对象转化为 JSON 格式,也支持将 JSON 字符串转化为 Java 对象,广泛应用于各种 Web 框架、API 服务和数据交换场景中。

1.1 FastJson 的作用

  • 性能高效:FastJson 通过高效的算法和缓存机制,比传统的 JSON 处理库(如 Jackson)在性能上有显著的提升,尤其适用于大数据量的场景。
  • 简易使用:提供了简单的 API,使得开发者能够方便地实现对象和 JSON 的相互转化,降低了开发难度。
  • 支持多种数据结构:FastJson 不仅支持基本的 JSON 对象,还支持 JSON 数组、嵌套对象、集合类等复杂数据结构的序列化与反序列化。

1.2 简单使用教程

import com.alibaba.fastjson.JSON;public class FastJsonExample {    public static void main(String[] args) {        // 创建对象        User user = new User("Alice", 25);        // 对象转JSON        String jsonString = JSON.toJSONString(user);        System.out.println(jsonString);  // {"name":"Alice","age":25}        // JSON转对象        User parsedUser = JSON.parseObject(jsonString, User.class);        System.out.println(parsedUser.getName());  // Alice    }}class User {    private String name;    private int age;    // Constructor, getters, and setters}

二、FastJson 反序列化漏洞出现的原因 /

FastJson 的反序列化过程存在一定的安全隐患,主要是因为它支持通过@type 字段进行多态反序列化。这一功能虽然在处理复杂对象和嵌套结构时非常方便,但也为攻击者提供了潜在的漏洞利用点。

2.1 多态反序列化(Polymorphic Deserialization)

在 FastJson 中,@type 字段用于指定具体的类类型,使得 FastJson 能够根据这个类型反序列化 JSON 字符串。如果 JSON 中包含@type 字段,FastJson 会根据该字段的值来确定实例化的类类型。然而,这一机制可能被恶意利用。

2.2 漏洞出现的主要原因

  1. 类型白名单缺失:FastJson 默认允许反序列化所有类型的类。如果攻击者能够控制传入的 JSON 数据中的@type 字段,可能会导致不安全的类被实例化,进而执行恶意代码。
  2. 反序列化时缺乏安全限制:在某些情况下,FastJson 的反序列化功能没有足够的安全检查。例如,在处理反序列化过程时,没有严格限制哪些类是允许反序列化的类,这使得攻击者可以通过构造特定的@type 字段,触发不安全的类加载。

三、FastJson 反序列化漏洞利用的条件 /

要成功利用 FastJson 的反序列化漏洞,攻击者需要满足一定的条件。漏洞的利用并不是随机发生的,而是依赖于具体的对象类型、反序列化方式以及 FastJson 配置的特性。

3.1 反序列化时的那些字段可以被利用

3.1.1 getter 方法调用条件

源码中执行逻辑:

Java反序列化基础-fastjson反序列化漏洞原理分析fastjson利用条件分析
  • 方法名长度大于 4
  • 非静态方法
  • 以 get 开头且第四个字母为大写
  • 无参数传入
  • 返回值类型继承自 Collection、Map、AtomicBoolean、AtomicInteger、AtomicLong 等

3.1.2 setter 方法调用条件

源码中执行逻辑:

Java反序列化基础-fastjson反序列化漏洞原理分析fastjson利用条件分析
  • 方法名长度大于 4
  • 非静态方法
  • 返回值为 void 或当前类
  • 以 set 开头且第四个字母为大写
  • 参数个数为 1 个

3.2 类的构造函数和字段设置

在 FastJson 反序列化时,如果目标类没有 setter 方法或字段是私有的,FastJson 仍然可以通过其他机制(如Feature.SupportNonPublicField)进行赋值。因此,攻击者可以通过精心构造的 JSON 数据,利用这些特性绕过安全限制,执行恶意操作。

3.3 防御措施

为了避免 FastJson 反序列化漏洞的发生,建议开发者在使用 FastJson 时遵循以下几点:

  1. 使用白名单限制类类型:明确指定哪些类可以进行反序列化,避免恶意类被实例化。
  2. 避免使用不安全的反序列化方法:尽量避免使用 FastJson 的parseObject方法,改用更加安全的方式进行 JSON 的解析。
  3. 加强 getter/setter 方法的安全性:确保目标类中不包含不必要的 getter/setter 方法,尤其是那些可能被恶意利用的。

原文始发于微信公众号(安全随心录):第二十课-系统学习代码审计:Java反序列化基础-fastjson反序列化漏洞原理分析fastjson利用条件分析

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年1月2日10:18:10
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Java反序列化基础-fastjson反序列化漏洞原理分析fastjson利用条件分析https://cn-sec.com/archives/3581838.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息