黑客发现NetDataContractSerializer反序列化漏洞

0x00 前言NetDataContractSerializer和DataContractSerializer一样用于序列化和反序列化Windows Communication Foundation …

0x00序言 NetDataContractSerializer与DataContractSerializer一样,用于序列化和反序列化Windows Communication Foundation(WCF)信息中上传的数据。

两个 之间存在重要差异:NetDataContractSerializer包括CLR,它加上了附加信息并保存了对CLR类型的引证以支持类型精密度,而DataContractSerializer则没有。

因此,只有在序列化和反序列化方面使用相同的CLR类型时,才能使用NetDataContractSerializer。

要使用WriteObject或Serialize方法序列化对象,请使用ReadObject或Deserialize方法对XML流进行反序列化。

在一些情况下,载入故意XML流会造成反序列化系统漏洞,从而实现远程RCE进攻。在文中中,创作者从原理和编码财务审计的角度介绍和重现。  

0x01 NetDataContractSerializer序列化 使用WriteObject或Serialize可以非常方便地在.NET对象和XML数据之间进行变换。温馨提醒,NetDataContractSerializer包括程序集的名字和序列化类型的类型。这些附加信息可用于将XML反序列化为专项计划,允许在手机客户端和服务端同时使用相同类型。附加信息是z: Id属性在不同元素上具有不同的含意。

这用于处理引用类型以及在反序列化XML时是否可以保存引证。

最后的依据是,此輸出包括的信息超过DataContractSerializer的輸出。

以下是一个说明问题的实例,首先定义TestClass对象

定义了三个组员,并起动静态方法ClassMethod。序列化通过创建对象案例为组员分配值在序列化TestClass类之后,我使用Serialize来获得xml数据。

&lt; TestClass  z: Id='1'  z: Type='WpfApp1.TestClass'  z: Assembly='WpfApp1,  Version=1.0.0.0,  Culture=neutral,  PublicKeyToken=null'  Xmlns='.com://schemas.datacontract.org/2004/06/WpfApp1'  Xmlns: i='.com://WWW.w3.org/2002/XMLSchema-instance' Xmlns: z='.com://schemas.microsoft.Com/2007/10/Serialization/'><age>18" data-word='age' class="" >age>Id='2'&gt; 36o&lt;/classname&gt;&lt; name  z: Id='3'&gt; Ivan1ee&lt;/name&gt;&lt;/TestClass&gt; 0x02 NetDataContractSerializer反序列化 2.2,反序列化使用方法 NetDataContractSerializer类反名单中系统进程将XML流变换为对象,并通过建立新对象来启用ReadObject的多个重载方法或Serialize方法。视图定义是以XmlObjectSerializer抽象类和IFormatter插口中学习的。

NetDataContractSerializer类在XmlObjectSerializer抽象类中实现WriteObject和ReadObject方法,并实现IFormatter中定义的方法。创作者通过建立新对象启用Deserialize方法实现的特定实现编码可以参照以下几点。

事实上,在Deserialize方法中,还启用ReadObject方法来反序列化。  

反序列化后,获得对象的属性,并打印出当前组员名字的值。

3.2,进攻向量 - MulticastDelegate MulticastDelegate承继自Delegate,它启用可在目录中包括多个元素的授权委托。事实上,所有授权委托类型都是以MulticastDelegate派生的。 MulticastDelegate类的_invocationList字段名在结构授权委托链时引证授权委托数组,但为了获得对授权委托链的更多控制,必须使用GetInvocationList方法,该方法具有带连接的授权委托目录,该方法在授权委托案例。同时,将按目录中的代理顺序进行同歩启用。如何把calc.exe加上到GetInvocationList目录方法?首先看比较&T; T&gt; class,在指令空间System.Collections.Generic中使用,定义如下

Comparison类回到授权委托,随后使用Delega