0

0

SoapFormatter反序列化漏洞示例分析

WBOY

WBOY

发布时间:2023-05-14 09:07:05

|

2100人浏览过

|

来源于亿速云

转载

一、前言

netdatacontractserializer和datacontractserializer一样用于序列化和反序列化windows communication foundation (wcf) 消息中发送的数据。两者之间存在一个重要区别:netdatacontractserializer 包含了clr,通过clr类型添加额外信息并保存引用来支持类型精确,而datacontractserializer 则不包含。 因此,只有在序列化和反序列化端使用相同的 clr 类型时,才能使用 netdatacontractserializer。若要序列化对象使用 writeobject或者serialize方法, 若要反序列化 xml流使用 readobject或者deserialize方法。在某些场景下读取了恶意的xml流就会造成反序列化漏洞,从而实现远程rce攻击,本文笔者从原理和代码审计的视角做了相关介绍和复现。    

二、SoapFormatter序列化

SoapFormatter类实现的IFormatter接口中定义了核心的Serialize方法可以非常方便的实现.NET对象与SOAP流之间的转换,可以将数据保存为XML文件,官方提供了两个构造方法。    

SoapFormatter反序列化漏洞示例分析

下面还是用老案例来说明问题,首先定义TestClass对象    

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

SoapFormatter反序列化漏洞示例分析

常规下使用Serialize得到序列化后的SOAP流,通过使用XML命名空间来持久化原始程序集,例如下图TestClass类的开始元素使用生成的xmlns进行限定,关注a1 命名空间







360

Ivan1ee

18






三、SoapFormatter反序列化

3.1 反序列化原理和用法

SoapFormatter类反序列化过程是将SOAP消息流转换为对象,通过创建一个新对象的方式调用Deserialize多个重载方法实现的,查看定义得知实现了IRemotingFormatter、IFormatter接口,

SoapFormatter反序列化漏洞示例分析

查看IRemotingFormatter接口定义得知也是继承了IFormatter    

SoapFormatter反序列化漏洞示例分析

笔者通过创建新对象的方式调用Deserialize方法实现的具体实现代码可参考以下

SoapFormatter反序列化漏洞示例分析

反序列化后得到TestClass类的成员Name的值。

SoapFormatter反序列化漏洞示例分析

3.2 攻击向量—ActivitySurrogateSelector

在SoapFormatter类的定义中除了构造函数外,还有一个SurrogateSelector属性,SurrogateSelector便是代理选择器,序列化代理的好处在于一旦格式化器要对现有类型的实例进行反序列化,就调用由代理对象自定义的方法。查看得知实现了ISurrogateSelector接口,定义如下    

SoapFormatter反序列化漏洞示例分析

因为序列化代理类型必须实现System.Runtime.Serialization.ISerializationSurrogate接口,ISerializationSurrogate在Framework ClassLibrary里的定义如下:    

SoapFormatter反序列化漏洞示例分析

SoapFormatter反序列化漏洞示例分析

SoapFormatter反序列化漏洞示例分析

代码中判断类型解析器IsSerializable属性是否可用,如果可用直接基类返回,如果不可用就获取派生类System.Workflow.ComponentModel.Serialization.ActivitySurrogateSelector的类型,然后交给Activator创建实例,再回到GetObjectData方法体内,另外为了对序列化数据进行完全控制,就需要实现Serialization.ISeralizable接口,定义如下:

SoapFormatter反序列化漏洞示例分析

有关更多的介绍请参考《.NET高级代码审计第二课 Json.Net反序列化漏洞》,在实现自定义反序列类的时通过构造方法读取攻击者提供的PocClass类    

酷表ChatExcel
酷表ChatExcel

北大团队开发的通过聊天来操作Excel表格的AI工具

下载

SoapFormatter反序列化漏洞示例分析

下图定义了PayloadClass类实现ISerializable接口,然后在GetObjectData方法里又声明泛型List集合接收byte类型的数据    

SoapFormatter反序列化漏洞示例分析

将PocClass对象添加到List集合,声明泛型使用IEnumerable集合map_type接收程序集反射得到的Type并返回IEnumerable类型,最后用Activator.CreateInstance创建实例保存到e3此时是一个枚举集合的迭代器。    

SoapFormatter反序列化漏洞示例分析上图将变量e3填充到了分页控件数据源,查看PageDataSource类定义一目了然,    

SoapFormatter反序列化漏洞示例分析

除此之外System.Runtime.Remoting.Channels.AggregateDictionary返回的类型支持IDictionary,然后实例化对象DesignerVerb并随意赋值,此类主要为了配合填充MenuCommand类properties属性的值,最后为哈希表中的符合条件的buckets赋值。     
   

SoapFormatter反序列化漏洞示例分析

接下来用集合添加数据源DataSet,DataSet和DataTable对象继承自System.ComponentModel.MarshalByValueComponent类,可序列化数据并支持远程处理ISerializable接口,这是ADO.NET对象中仅有支持远程处理的对象,并以二进制格式进行持久化。

SoapFormatter反序列化漏洞示例分析

更改属性DataSet.RemotingFormat值为SerializationFormat.Binary,更改属性DataSet.CaseSensitive为false等,再调用BinaryFormatter序列化List集合,如下图。

SoapFormatter反序列化漏洞示例分析

因为指定了RemotingFormat属性为Binary,所以引入了BinaryFormatter格式化器并指定属性SurrogateSelector代理器为自定义的MySurrogateSelector类。序列化后得到SOAP-XML,再利用SoapFormatter对象的Deserialize方法解析读取文件内容的流数据,成功弹出计算器

SoapFormatter反序列化漏洞示例分析

SoapFormatter反序列化漏洞示例分析SoapFormatter反序列化漏洞示例分析

3.3 攻击向量—PSObject

由于笔者的Windows主机打过了CVE-2017-8565(Windows PowerShell远程代码执行漏洞)的补丁,利用不成功,所以在这里不做深入探讨,有兴趣的朋友可以自行研究。有关于补丁的详细信息参考:https://support.microsoft.com/zh-cn/help/4025872/windows-powershell-remote-code-execution-vulnerability

四、代码审计

4.1 XML载入

从代码审计的角度找到漏洞的EntryPoint,传入XML,就可以被反序列化,这种方式也是很常见的,需要关注一下,LoadXml直接载入xml数据,这个点也可以造成XXE漏洞。例如这段代码:    

SoapFormatter反序列化漏洞示例分析

这种污染点漏洞攻击成本很低,攻击者只需要控制传入字符串参数source便可轻松实现反序列化漏洞攻击,弹出计算器。

SoapFormatter反序列化漏洞示例分析

4.2 File读取

SoapFormatter反序列化漏洞示例分析

这段是摘自某个应用的代码片段,在审计的时候只需要关注DeserializeSOAP方法中传入的path变量是否可控。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

411

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

533

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

309

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

74

2025.09.10

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1879

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2085

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

1004

2024.11.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

257

2023.08.03

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

2

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号