.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安全和技巧可关注实验室公众号。


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

查看所有标签

猜你喜欢:

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

C++ Primer Plus

C++ Primer Plus

Stephen Prata / 张海龙、袁国忠 / 人民邮电出版社 / 2012-6-19 / 99.00元

C++是在C语言基础上开发的一种集面向对象编程、通用编程和传统的过程化编程于一体的编程语言,是C语言的超集。本书是根据2003年的ISO/ANSI C++标准编写的。通过大量短小精悍的程序详细而全面地阐述了C++的基本概念和技术。全书分为18章和10个附录,分别介绍了C++程序的运行方式、基本数据类型、复合数据类型、循环和关系表达式、分支语句和逻辑操作符、函数重载和函数模板、内存模型和名称空间、类......一起来看看 《C++ Primer Plus》 这本书的介绍吧!

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

在线压缩/解压 HTML 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码