奥运会网球比分规则|雪缘网网球比分直播|
欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

.NET高级代码审计(第七课) NetDataContractSerializer反序列化漏洞

来源:本站整理 作者:佚名 时间:2019-04-11 TAG: 我要投稿

NetDataContractSerializer和DataContractSerializer一样用于序列化和反序列化Windows Communication Foundation (WCF) 消息中发送的数据。两者 之间存在一个重要区别:NetDataContractSerializer 包含了CLR,通过CLR类型添加额外信息并保存引用来支持类型精确,而 DataContractSerializer 则不包含。 因此,只有在序列化和反序列化端使用相同的 CLR 类型时,才能使用 NetDataContractSerializer。若要序列化对象使用 WriteObject或者Serialize方法, 若要反序列化 XML流使用 ReadObject或者Deserialize方法。在某些场景下读取了恶意的XML流就会造成反序列化漏洞,从而实现远程RCE攻击,本文笔者从原理和代码审计的视角做了相关介绍和复现。
 
0x01 NetDataContractSerializer序列化
使用WriteObject或者Serialize可以非常方便的实现.NET对象与XML数据之间的转化,注意NetDataContractSerializer包含了程序集的名字和被序列化类型的类型。这些额外信息可以用来将XML反序列化成特殊类型,允许相同类型可以在客户端和服务?#36865;?#26102;使用。另外的信息是z:Id 属性在不同的元素上意义是不同的。这个用来处理引用类型以及当XML被反序列化时是否引用可以保留,最后的结论是这个输出相比DataContractSerializer的输出包含了更多信息。下面通过一个实例来?#24471;?#38382;题,首先定义TestClass对象

定义了三个成?#20445;?#24182;实现了一个静态方法ClassMethod启动进程。 序列化通过创建对象实例分别给成员?#25345;?br/>
笔者使用Serialize得到序列化TestClass类后的xml数据
"1" z:Type="WpfApp1.TestClass" z:Assembly="WpfApp1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" xmlns="http://schemas.datacontract.org/2004/07/WpfApp1" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/">age>18age>classname z:Id="2">360classname>name z:Id="3">Ivan1eename>TestClass>
 
0x02 NetDataContractSerializer反序列化
2.1、反序列化用法
NetDataContractSerializer类反序列过程是将XML流转换为对象,通过创建一个新对象的方式调用ReadObject多个重载方法或Serialize方法实现的,查看定义得知?#22363;?#33258;XmlObjectSerializer抽象类、IFormatter接口,

NetDataContractSerializer类实现了XmlObjectSerializer抽象类中的WriteObject、ReadObject方法,也实现了IFormatter中定义的方法。笔者通过创建新对象的方式调用Deserialize方法实现的具体实现代码可参考以下

其实在Deserialize方法内也是调用了ReadObject方法反序列化的

反序列化后得到对象的属性,打印输出当前成员Name的值。

2.2、攻击向量—MulticastDelegate
多路广播委托(MulticastDelegate)?#22363;?#33258; Delegate,其调用列表中可以拥有多个元素的委托,?#23548;?#19978;所有委托类?#25237;?#27966;生自MulticastDelegate。MulticastDelegate类的_invocationList字段在构造委托链时会引用委托数组,但为了取得对委托链更多的控制就得使用GetInvocationList方法,它是具有一个带有链接的委托列表,在对委托实例进行调用的时候,将按列表中的委托顺序进?#22411;?#27493;调用,那么如何将calc.exe添加到GetInvocationList列表方法?首先先看Comparison类,它用于位于命令空间System.Collections.Generic,定义如下

Comparison类返回委托,再使用Delegate或者MulticastDelegate类的公共静态方法Combine将委托添加到链中作为Comparison的类型比较器

使用Comparer的静态方法Create创建比较器,比较器对象在.NET集合类中使用的频?#24335;?#22810;,也具备了定制的反序列化功能,这里选择SortedSet类,在反序列化的时内部Comparer对象重构了集合的排序。

多路广播委托的调用列表GetInvocationList方法在内部构造并初始化一个数组,让它的每个元素都引用链中的一个委托,然后返回对该数组的引用,下面代码修改了私有字段_InvocationList并用泛型委托Func返回Process类。

[1] [2]  下一页

【声明】:黑吧安全网(http://www.nddver.tw)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱[email protected],我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类?#35753;?/li>
        • 最近下载
        奥运会网球比分规则