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

栏目: 编程语言 · XML · 发布时间: 6年前

内容简介:NetDataContractSerializer和DataContractSerializer一样用于序列化和反序列化Windows Communication Foundation (WCF) 消息中发送的数据。两者 之间存在一个重要区别:NetDataContractSerializer 包含了CLR,通过CLR类型添加额外信息并保存引用来支持类型精确,而 DataContractSerializer 则不包含。 因此,只有在序列化和反序列化端使用相同的 CLR 类型时,才能使用 NetDataCon

0x00 前言

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反序列化成特殊类型,允许相同类型可以在客户端和服务端同时使用。另外的信息是z:Id 属性在不同的元素上意义是不同的。这个用来处理引用类型以及当XML被反序列化时是否引用可以保留,最后的结论是这个输出相比DataContractSerializer的输出包含了更多信息。下面通过一个实例来说明问题,首先定义TestClass对象

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

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

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

笔者使用Serialize得到序列化TestClass类后的xml数据

<TestClass z:Id="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>18</age><classname 
z:Id="2">360</classname><name 
z:Id="3">Ivan1ee</name></TestClass>

0x02 NetDataContractSerializer反序列化

2.1、反序列化用法

NetDataContractSerializer类反序列过程是将XML流转换为对象,通过创建一个新对象的方式调用ReadObject多个重载方法或Serialize方法实现的,查看定义得知继承自XmlObjectSerializer抽象类、IFormatter接口,

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

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

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

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

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

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

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

2.2、攻击向量—MulticastDelegate

多路广播委托(MulticastDelegate)继承自 Delegate,其调用列表中可以拥有多个元素的委托,实际上所有委托类型都派生自MulticastDelegate。MulticastDelegate类的_invocationList字段在构造委托链时会引用委托数组,但为了取得对委托链更多的控制就得使用GetInvocationList方法,它是具有一个带有链接的委托列表,在对委托实例进行调用的时候,将按列表中的委托顺序进行同步调用,那么如何将calc.exe添加到GetInvocationList列表方法?首先先看Comparison<T>类,它用于位于命令空间System.Collections.Generic,定义如下

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

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

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

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

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

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

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

最后传入攻击载荷后得到完整序列化后的poc,如下

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

0x03 代码审计视角

3.1、Deserialize

从代码审计的角度只需找到可控的Path路径就可以被反序列化,例如以下场景:

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

3.2、ReadObject

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

上面两种方式都是很常见的,需要重点关注。

0x04 案例复盘

1. 代码中实现读取本地文件内容

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

2. 传递poc xml,弹出计算器网页返回200

3.

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

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

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

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

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

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

最后配上动态图演示

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

0x05 总结

NetDataContractSerializer序列化功能输出的信息更多,因为性能等原因不及DataContractSerializer,所以在WCF开发中用的场景并不太多,但是因为它无需传入类型解析器所以相对来说更容易触发反序列化漏洞。最后.NET反序列化系列课程笔者会同步到 https://github.com/Ivan1ee/ 、https://ivan1ee.gitbook.io/ ,后续笔者将陆续推出高质量的.NET反序列化漏洞文章,欢迎大伙持续关注,交流,更多的.NET安全和技巧可关注实验室公众号。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

JavaScript DOM高级程序设计

JavaScript DOM高级程序设计

Jeffrey Sambells、Aaron Gustafson / 李松峰、李雅雯 / 人民邮电出版社 / 2008-7 / 59.00元

本书注重理论与实践的结合,全面讲述高级的DOM 脚本编程。全书分为3 个部分:第一部分“深入理解DOM 脚本编程”,涉及W3C DOM 规范的各方面,包括非标准的浏览器支持和不支持的内容;第二部分“浏览器外部通信”,以Ajax 和客户端—服务器端通信为主题;第三部分“部分高级脚本编程资源”,集中介绍了一批第三方脚本编程资源,包括库和API。同时,每部分的最后一章都为案例研究,将学到的内容应用于实践......一起来看看 《JavaScript DOM高级程序设计》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

SHA 加密
SHA 加密

SHA 加密工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具