欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

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

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

DataContractSerializer类用于序列化和反序列化Windows Communication Foundation (WCF) 消息中发送的数据,用于把CLR数据类型序列化成XML流,它位于命名空间System.Runtime.Serialization,继承于System.Runtime.Serialization.XmlObjectSerializer,在某些场景下开发者使用DataContractSerializer.ReadObject读取了恶意的XML数据就会造成反序列化漏洞,从而实现远程RCE攻击,本文笔者从原理和代码审计的视角做了相关介绍和复现。
 
0X01 DataContractSerializer序列化
类名使用DataContractAttribute 标记,类成员使用DataMemberAttribute 标记,可指定要序列化的属性和字段,下面先来看这个系列课程中经典的一段代码

TestClass对象定义了三个成员,并实现了一个静态方法ClassMethod启动进程。 序列化通过创建对象实例分别给成员赋值

使用DataContractSerializer.WriteObject非常方便的实现.NET对象与XML数据之间的转化,笔者定义TestClass对象,常规下使用WriteObject得到序列化后的XML数据
"http://schemas.datacontract.org/2004/07/WpfApp1" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">Age>18Age>Classname>360Classname>Name>Ivan1eeName>TestClass>
 
0x02 DataContractSerializer反序列化
2.1、反序列化原理和用法
反序列过程是将XML流或者数据转换为对象,在DataContractSerializer类中创建对象然后调用ReadObject方法实现的

首先看DataContractSerializer类的定义,创建实例的时候会带入类型解析器

然后在初始化方法 Initialize里将Type类型解析器赋值给成员rootType

反序列化过程中使用ReadObject方法调用了ReadObjectHandleExceptions方法,省略一些非核心代码,进入InternalReadObject方法体内

ReadDataContractValue方法体内返回用ReadXmlValue处理后的数据,

从下图可以看出这是一个C#里的虚方法,在用System.Runtime.Serialization.DiagnosticUtility类处理数据的时候通过DataContract.GetClrTypeFullName得到CLR数据类型的全限定名。

下图Demo展示了序列化和反序列化前后的效果

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

2.2、攻击向量—ObjectDataProvider
漏洞的触发点是在于初始化DataContractSerializer类实例时,参数类型解析器type是否可控,也就是说攻击者需要控制重构对象的类型,若可控的情况下并且反序列化了恶意的Xml数据就可以触发反序列化漏洞。笔者继续选择ObjectDataProvider类方便调用任意被引用类中的方法,具体有关此类的用法可以看一下《.NET高级代码审计(第一课) XmlSerializer反序列化漏洞》,因为Process.Start之前需要配置ProcessStartInfo类相关的属性,例如指定文件名、指定启动参数,所以首先考虑序列化ProcessStartInfo再来序列化Process类调用StartInfo启动程序,然后需要对其做减法,去掉无关的System.RuntimeType、System.IntPtr窗口句柄数据,下面是国外研究者提供的反序列化Payload
xml version=""1.0""?>
root xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" type=""System.Data.Services.Internal.ExpandedWrapper`2[[System.Diagnostics.Process, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Windows.Data.ObjectDataProvider, PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]], System.Data.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"">
    ExpandedWrapperOfProcessObjectDataProviderpaO_SOqJL xmlns=""http://schemas.datacontract.org/2004/07/System.Data.Services.Internal""                                                     xmlns:i=""http://www.w3.org/2001/XMLSchema-instance""                                                      xmlns:z=""http://schemas.microsoft.com/2003/10/Serialization/"">

[1] [2] [3]  下一页

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