ag区块链百家乐

filecoin行情(www.ipfs8.vip):dotnet serialize 101

Allbet登录网址 2022年11月03日 科技 217 2

dotnet-serialize-101

java太卷了,找点新的学习偏向,从0到1学习dotnet的一些反序列化破绽。

简述dotnet序列化和反序列化

同java类比,dotnet也需要对某个工具举行持久化处置,从而在任何时间都能够恢复这个工具。为什么要使用序列化?由于我们需要将主要的工具存入到媒体,这个媒体可能是数据库或者是文件,或者我们需要将工具举行网络传输转到达另一个服务上,而这个工具转媒体(数据库、文件、网络传输流)的历程就是序列化的历程,反序列化则正好相反。

一个简朴序列化的例子

微软官方文档给出了内置库中可以序列化的类型列表,见这里。先来声明一个实体类。在java中,序列化和反序列化需要实现Serializable接口,在dotnet中则是使用特征的方式举行符号Serializable。

[Serializable]  
public class MyObject
{  
  public int n1;  
  [NonSerialized] public int n2;  
  public String str;  
}

你也可以指定[NonSerialized]示意不能被序列化的字段。接下来我们构建一个MyObject工具并对其序列化和反序列化。

using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

namespace NetSerializer
{
    [Serializable]
    public class MyObject
    {
        public int n1;
        [NonSerialized] public int n2;
        public String str;
    }

    class Program
    {
        public static void BinaryFormatterSerialize(string file, object o)
        {
            BinaryFormatter binaryFormatter = new BinaryFormatter();
            FileStream fileStream = new FileStream(file, FileMode.Create, FileAccess.Write, FileShare.None);
            binaryFormatter.Serialize(fileStream, o);
            fileStream.Close();
            Console.WriteLine($"serialize object {o} to file {file}.");
        }

        public static object BinaryFormatterDeserialFromFile(string file)
        {
            IFormatter formatter = new BinaryFormatter();
            Stream stream = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.Read);
            object o = formatter.Deserialize(stream);
            stream.Close();
            return o;
        }

        static void Main(string[] args)
        {
            try
            {
                MyObject myObject = new MyObject();
                myObject.n1 = 1;
                myObject.n2 = 2;
                myObject.str = "jack";

                BinaryFormatterSerialize("1.bin", myObject);
                MyObject myObject1 = (MyObject)BinaryFormatterDeserialFromFile("1.bin");

                Console.WriteLine($"n1:{myObject1.n1}");
                Console.WriteLine($"NonSerialized n2:{myObject1.n2}");
                Console.WriteLine($"str:{myObject1.str}");
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
            Console.ReadKey();
        }
    }
}

输出效果为:

serialize object NetSerializer.MyObject to file 1.bin.
n1:1
NonSerialized n2:0
str:jack

可以看到工具除了被符号不能被序列化的字段以外所有恢复到了原来的值。查看天生的bin文件,发现序列化之后的数据接纳0001 0000开头

Formatter

在序列化的时刻我们引入了一个BinaryFormatter类,这个类示意使用二进制的形式举行序列化,而在dotnet中有许多其他的formatter类,每一个formatter都对应了一种序列化的花样,枚举几个:

  1. BinaryFormatter 用于二进制花样
  2. SoapFormatter 用于序列化soap花样
  3. LosFormatter 用于序列化 Web 窗体页的视图状态
  4. ObjectStateFormatter 用于序列化状态工具图

固然另有一些其他花样的序列化类,好比XmlSerializer、JsonSerializer等用于天生xml、json花样的数据,这个以后再说。

这些formatter类都实现了名为IFormatter、IRemotingFormatter的接口,其中IRemotingFormatter是用来远程挪用的RPC接口,它也实现了IFormatter,以是重点看IFormatter接口。

IFormatter界说了序列化和反序列化的两个方式,以及三个字段,其中每个字段寄义如下:

类 字段名 寄义用途
ISurrogateSelector SurrogateSelector 序列化署理选择器 接受formatter的序列化或反序列化处置
SerializationBinder Binder 用于控制在序列化和反序列化时代使用的现实类型
StreamingContext Context 序列化流上下文 其中states字段包罗了序列化的泉源和目的地

通过这三个字段,我们可以控制序列化和反序列化时数据的类型、值以及其他信息。

BinaryFormatter序列化的生命周期和事宜

凭证微软的文档,当formatter挪用Serialize方式的时刻,会有以下的生命周期。

  1. 首先确定formatter是否有署理选择器,若是有则检查署理选择器要处置的工具类型是否和给定的工具类型一致,若是一致,署理选择器会挪用ISerializable.GetObjectData()
  2. 若是没有署理选择器,或者署理选择器不处置该工具类型,则检查工具是否有[Serializable]特征。若是不能序列化则抛出异常。
  3. 检查该工具是否实现ISerializable接口,若是实现就挪用其GetObjectData方式。
  4. 若是没实现ISerializable接口就使用默认的序列化战略,序列化以是没符号[NonSerialized]的字段。

而在序列化和反序列化的历程中另有四个回调事宜

特征 挪用关联的方式时 典型用法
OnDeserializingAttribute 反序列化之前 初始化可选字段的默认值。
OnDeserializedAttribute 反序列化之后 凭证其他字段的内容修改可选字段值。
OnSerializingAttribute 序列化之前 准备序列化。 例如,确立可选数据结构。
OnSerializedAttribute 序列化之后 纪录序列化事宜。

可以凭证几个详细的案例来看序列化和反序列化的生命周期

,

USDT场外交易平台

U交所(www.9cx.net),全球頂尖的USDT場外擔保交易平臺。

,
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Security.Permissions;

namespace NetSerializer
{
    [Serializable]
    public class MyObject : ISerializable
    {
        public string str { get; set; }
        public MyObject()
        {
        }
        //实现了ISerializable接口的类必须包罗有序列化组织函数,否则会失足。
        protected MyObject(SerializationInfo info, StreamingContext context)
        {
            Console.WriteLine("MyObject(SerializationInfo info, StreamingContext context)");
            str = info.GetString("str");
        }

        [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.SerializationFormatter)]
        public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            Console.WriteLine("GetObjectData of MyObject.class");
            info.AddValue("str", str, typeof(string));
        }

        [OnDeserializing]
        private void TestOnDeserializing(StreamingContext sc)
        {
            Console.WriteLine("TestOnDeserializing");

        }
        [OnDeserialized]
        private void TestOnDeserialized(StreamingContext sc)
        {
            Console.WriteLine("TestOnDeserialized");
        }
        [OnSerializing]
        private void TestOnSerializing(StreamingContext sc)
        {
            Console.WriteLine("TestOnSerializing");
        }
        [OnSerialized]
        private void TestOnSerialized(StreamingContext sc)
        {
            Console.WriteLine("TestOnSerialized");
        }
    }
    class MySerializationSurrogate : ISerializationSurrogate
    {
        public void GetObjectData(object obj, SerializationInfo info, StreamingContext context)
        {
            Console.WriteLine("GetObjectData of ISerializationSurrogate");
            info.AddValue("str", ((MyObject)obj).str);
        }

        public object SetObjectData(object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector)
        {
            Console.WriteLine("SetObjectData of ISerializationSurrogate");
            MyObject m = new MyObject();
            m.str = (string)info.GetValue("str", typeof(string));
            return m;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                MyObject myObject = new MyObject();
                myObject.str = "hello";

                using (MemoryStream memoryStream = new MemoryStream())
                {
                    // 构建formatter
                    BinaryFormatter binaryFormatter = new BinaryFormatter();

                    // 设置序列化署理选择器
                    SurrogateSelector ss = new SurrogateSelector();
                    ss.AddSurrogate(typeof(MyObject), binaryFormatter.Context, new MySerializationSurrogate());
                    // 赋值给formatter 这里是否设置署理选择器决议了序列化的生命周期
                    binaryFormatter.SurrogateSelector = ss;
                    // 序列化
                    binaryFormatter.Serialize(memoryStream, myObject);
                    // 重置stream
                    memoryStream.Position = 0;
                    myObject = null;
                    // 反序列化
                    myObject = (MyObject)binaryFormatter.Deserialize(memoryStream);
                    Console.WriteLine(myObject.str);    // hello
                }

            }
            catch (Exception e)
            {
                Console.WriteLine(e.StackTrace);
            }
            Console.ReadKey();
        }
    }
}

这是一个使用了SurrogateSelector署理选择器的序列化例子,输出如下

TestOnSerializing
GetObjectData of ISerializationSurrogate
TestOnSerialized
TestOnDeserializing
SetObjectData of ISerializationSurrogate
TestOnDeserialized
hello

可以看到四个回调事宜是只要举行声明就会执行。其中我们自己的署理选择器MySerializationSurrogate实现ISerializationSurrogate接口的两个方式。当我们设置了署理选择器时,它的生命周期就像打印的顺序一样。

当注释掉设置署理选择器的那行代码

//binaryFormatter.SurrogateSelector = ss;

其输出是这样的

TestOnSerializing
GetObjectData of MyObject.class
TestOnSerialized
TestOnDeserializing
MyObject(SerializationInfo info, StreamingContext context)
TestOnDeserialized
hello

当工具其不实现ISerializable接口时,他的生命周期仅限于回调函数(使用dotnet默认序列化战略),输出如下:

TestOnSerializing
TestOnSerialized
TestOnDeserializing
TestOnDeserialized
hello

单独来看一下MyObject类的序列化组织函数

//实现了ISerializable接口的类必须包罗有序列化组织函数,否则会失足。
protected MyObject(SerializationInfo info, StreamingContext context)
{
    Console.WriteLine("MyObject(SerializationInfo info, StreamingContext context)");
    str = info.GetString("str");
}

SerializationInfo info变量中示意序列化流的信息,工具的类型和值都存储在其中,查看类界说

可见其存储了工具类型、成员个数、程序集名称、类型名称等,另有一些AddValue的重载用于添加类实例字段变量键值对。实在这个序列化组织函数在署理选择器中显示的加倍显著:

class MySerializationSurrogate : ISerializationSurrogate
{
    public void GetObjectData(object obj, SerializationInfo info, StreamingContext context)
    {
        Console.WriteLine("GetObjectData of ISerializationSurrogate");
        info.AddValue("str", ((MyObject)obj).str);
    }

    public object SetObjectData(object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector)
    {
        Console.WriteLine("SetObjectData of ISerializationSurrogate");
        MyObject m = new MyObject();
        m.str = (string)info.GetValue("str", typeof(string));
        return m;
    }
}

一个get一个set示意工具的序列化形式和反序列化重构时的处置方式。而非署理选择器只实现ISerializable接口的类只有GetObjectData,其类自身的序列化组织函数等同于署理选择器的SetObjectData。

此时用一张图示意序列化及反序列化完整的生命周期:

ysoserial.net

对于dotnet反序列化破绽来讲,ysoserial.net是一个绕不外去的工具,而其使用的方式及其设计架构都是值得我们学习的器械。

ysoserial.net主要分为formatter、gadget、plugin三个功效。

== GADGETS ==
        (*) ActivitySurrogateDisableTypeCheck [Disables 4.8+ type protections for ActivitySurrogateSelector, command is ignored]
                Formatters: BinaryFormatter , LosFormatter , NetDataContractSerializer , SoapFormatter
        (*) ActivitySurrogateSelector [This gadget ignores the command parameter and executes the constructor of ExploitClass class] (supports extra options: use the '--fullhelp' argument to view)
                Formatters: BinaryFormatter (2) , LosFormatter , SoapFormatter
        (*) ActivitySurrogateSelectorFromFile [Another variant of the ActivitySurrogateSelector gadget. This gadget interprets the command parameter as path to the .cs file that should be compiled as exploit class. Use semicolon to separate the file from additionally required assemblies, e. g., '-c ExploitClass.cs;System.Windows.Forms.dll'] (supports extra options: use the '--fullhelp' argument to view)
                Formatters: BinaryFormatter (2) , LosFormatter , SoapFormatter
        (*) AxHostState
                Formatters: BinaryFormatter , LosFormatter , NetDataContractSerializer , SoapFormatter
        (*) ClaimsIdentity
                Formatters: BinaryFormatter , LosFormatter , SoapFormatter
        (*) DataSet
                Formatters: BinaryFormatter , LosFormatter , SoapFormatter
        (*) ObjectDataProvider (supports extra options: use the '--fullhelp' argument to view)
                Formatters: DataContractSerializer (2) , FastJson , FsPickler , JavaScriptSerializer , Json.Net , SharpSerializerBinary , SharpSerializerXml , Xaml (4) , XmlSerializer (2) , YamlDotNet < 5.0.0
        (*) PSObject [Target must run a system not patched for CVE-2017-8565 (Published: 07/11/2017)]
                Formatters: BinaryFormatter , LosFormatter , NetDataContractSerializer , SoapFormatter
        (*) RolePrincipal
                Formatters: BinaryFormatter , DataContractSerializer , Json.Net , LosFormatter , NetDataContractSerializer , SoapFormatter
        (*) SessionSecurityToken
                Formatters: BinaryFormatter , DataContractSerializer , Json.Net , LosFormatter , NetDataContractSerializer , SoapFormatter
        (*) SessionViewStateHistoryItem
                Formatters: BinaryFormatter , DataContractSerializer , Json.Net , LosFormatter , NetDataContractSerializer , SoapFormatter
        (*) TextFormattingRunProperties [This normally generates the shortest payload] (supports extra options: use the '--fullhelp' argument to view)
                Formatters: BinaryFormatter , DataContractSerializer , LosFormatter , NetDataContractSerializer , SoapFormatter
        (*) ToolboxItemContainer
                Formatters: BinaryFormatter , LosFormatter , SoapFormatter
        (*) TypeConfuseDelegate
                Formatters: BinaryFormatter , LosFormatter , NetDataContractSerializer
        (*) TypeConfuseDelegateMono [Tweaked TypeConfuseDelegate gadget to work with Mono]
                Formatters: BinaryFormatter , LosFormatter , NetDataContractSerializer
        (*) WindowsClaimsIdentity [Requires Microsoft.IdentityModel.Claims namespace (not default GAC)] (supports extra options: use the '--fullhelp' argument to view)
                Formatters: BinaryFormatter (3) , DataContractSerializer (2) , Json.Net (2) , LosFormatter (3) , NetDataContractSerializer (3) , SoapFormatter (2)
        (*) WindowsIdentity
                Formatters: BinaryFormatter , DataContractSerializer , Json.Net , LosFormatter , NetDataContractSerializer , SoapFormatter
        (*) WindowsPrincipal
                Formatters: BinaryFormatter , DataContractJsonSerializer , DataContractSerializer , Json.Net , LosFormatter , NetDataContractSerializer , SoapFormatter

== PLUGINS ==
        (*) ActivatorUrl (Sends a generated payload to an activated, presumably remote, object)
        (*) Altserialization (Generates payload for HttpStaticObjectsCollection or SessionStateItemCollection)
        (*) ApplicationTrust (Generates XML payload for the ApplicationTrust class)
        (*) Clipboard (Generates payload for DataObject and copy it into the clipboard - ready to be pasted in affected apps)
        (*) DotNetNuke (Generates payload for DotNetNuke CVE-2017-9822)
        (*) Resx (Generates RESX and .RESOURCES files)
        (*) SessionSecurityTokenHandler (Generates XML payload for the SessionSecurityTokenHandler class)
        (*) SharePoint (Generates poayloads for the following SharePoint CVEs: CVE-2020-1147, CVE-2019-0604, CVE-2018-8421)
        (*) TransactionManagerReenlist (Generates payload for the TransactionManager.Reenlist method)
        (*) ViewState (Generates a ViewState using known MachineKey parameters)

查看其使用说明,可见众多gadget即gadget所支持的formatter。抽象一点说,formatter标志为反序列化入口,gadget是链条,而plugin是针对其他应用如SharePoint对于反序列化数据的加密解密做一个实现。

后文

本系列其他文章将会划剖析说各个formatter,并在其中穿插gadget的详细原理,未涉及的gadget则会单独拿出来举行解说。

Max pool官网

Max pool官网(www.ipfs8.vip)是FiLecoin致力服务于使用FiLecoin存储和检索数据的官方权威平台。IPFS官网实时更新FiLecoin(FIL)行情、当前FiLecoin(FIL)矿池、FiLecoin(FIL)收益数据、各类FiLecoin(FIL)矿机出售信息。并开放FiLecoin(FIL)交易所、IPFS云矿机、IPFS矿机出售、租用、招商等业务。

ag区块链百家乐声明:该文看法仅代表作者自己,与www.allbetgame.us无关。转载请注明:filecoin行情(www.ipfs8.vip):dotnet serialize 101
发布评论

分享到:

电银付官网(dianyinzhifu.com):上交所对东方金钰、中国蓝田予以纪律处分
2 条回复
  1. 皇冠正网开户(www.hg108.vip)
    皇冠正网开户(www.hg108.vip)
    (2022-10-10 00:15:45) 1#

    OPEC's report showed OPEC output bucked that trend in June, rising by 234,000 bpd to 28.72 million bpd with increases led by Saudi Arabia and the United Arab Emirates.懒人宅家看文,安逸~

  2. 精彩足球推荐分析(www.99cx.vip)
    精彩足球推荐分析(www.99cx.vip)
    (2022-11-03 00:07:37) 2#

    Telegram获取用户IDwww.tel8.vip)是一个Telegram群组分享平台。Telegram获取用户ID导出包括Telegram获取用户ID、telegram群组索引、Telegram群组导航、新加坡telegram群组、telegram中文群组、telegram群组(其他)、Telegram 美国 群组、telegram群组爬虫、电报群 科学上网、小飞机 怎么 加 群、tg群等内容。Telegram获取用户ID为广大电报用户提供各种电报群组/电报频道/电报机器人导航服务。
    夸夸你~

发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。