0x00 前言SoapFormatter格式化器和下节课介绍的BinaryFormatter格式化器都是.NET内部实现的序列化功能的类,SoapFormatter直接派生自System.Object…
0x00序言 下一课中介绍的SoapFormatter备份程序和BinaryFormatter备份程序是.NET中实现的所有序列化涵数类。 SoapFormatter直接派生自System.Object,坐落于命名空间System.Runtime.Serialization.Formatters.Soap中。 IRemotingFormatter和IFormatter插口用以将对象图长久化作SOAP流。
SOAP是一种简单的应用场景XML的协议书,容许手机应用程序通过.com互换信息。但是,在一些情况下,处理不安全的SOAP流会造成反序列化系统漏洞并实现远程RCE进攻。在文中中,创作者从原理和编码财务审计的视角介绍和重现。
0x01 SoapFormatter序列化 SoapFormatter类实现的IFormatter接口标准了核心Serialize方法。实现.NET对象和SOAP流之间的变换非常方便。数据可以储存为XML文件。正式提供了两个构造函数。
以下仍是一个用于说明问题的旧实例,首先定义TestClass对象
定义了三个组员,并起动静态方法ClassMethod。序列化通过创建对象案例为组员分派值
通常使用Serialize来获得序列化的SOAP流,并使用XML命名空间来保存初始程序集。
比如,下面的TestClass类的start元素使用转化成的xmlns进行限制,注意a1 名字空间。 < SOAP-ENV:包络 xmlns: xsi='.com://WWW.w3.org/2002/XMLSchema-instance' xmlns: xsd='.com://WWW.w3.org/2002/XMLSchema' xmlns: SOAP-ENC='.com://schemas.xmlsoap.org/soap/encoding/' xmlns: SOAP-ENV='.com://schemas.xmlsoap.org/soap/envelope/' xmlns: clr='.com://schemas.microsoft.Com/soap/encoding/Clr/1.3' SOAP-ENV: encodingStyle='.com://schemas.xmlsoap.org/soap/encoding/'> < SOAP-ENV: Body> < a1: TestClass Id='ref-1' xmlns: a1='.com://schemas.microsoft.Com/clr/nsassem/WpfApp1/WpfApp1%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral% 2C%20PublicKeyToken%3Dnull'> < classname Id='ref-3'> 36o</classname> < name Id='ref-4'> Ivan1ee</name> <年龄>第18版; /年龄> </a1: TestClass> </SOAP-ENV: Body> </SOAP-ENV: Envelope> 0x02 SoapFormatter反序列化 2.2,反序列化使用方法 SoapFormatter类反序列化过程将SOAP信息流变换为对象,并通过建立新对象来启用反序列化多个重载方法。该定义定义了IRemotingFormatter和IFormatter插口的实现。
请参阅IRemotingFormatter接口标准以了解IFormatter也是承继的。
创作者通过建立新对象启用Deserialize方法实现的特定实现编码可以参照以下几点。
反序列化TestClass类的组员名字的值。
3.2,进攻向量 - ActivitySurrogateSelector 在SoapFormatter类的定义中,除了构造函数之外,有一个SurrogateSelector属性,SurrogateSelector是代理商选择器。序列化代理商的优势是,如果备份程序想要反序列化目前类型的案例,它就会被代理商启用。对象自定方法。查看ISurrogateSelector插口的实现,定义如下
由于序列化代理商类型必须实现System.Runtime.Serialization.ISerializationSurrogate插口,因此ISerializationSurrogate在Framework类库中定义如下:
在序列化对象时启用图中的GetObjectData方法,目的是将值加上到SerializationInfo集合,并使用SetObjectData方法进行反序列化。启用此方法时,需要传送SerializationInfo对象引证,换句话,使用SoapFormatter类。使用Serialize方法时启用GetObjectData方法,使用Deserialize时启用SetObjectData方法。 SoapFormatter类有一个非常重要的属性SurrogateSelector,定义如下
序列化对象时,如果属性SurrogateSelector属性的数值非NULL,则将使用对象类型作为主要参数启用其GetSurrogate方法。如果此方法回到一个有效的对象ISerializationSurrogate,则此对象反序列化找到的类型,这儿是一个关键位置,我们要做的是实现重写ISerializationSurrogate启用自定编码,如下如图演试
在编码中,确定类型分析程序IsSerializable属性是否能用。如果直接基类能用,如果它无效,则获得派生类System.Workflow.ComponentModel.Serialization.ActivitySurrogateSelector的类型,随后将其传送给Activator以建立案例。 返回GetObjectData方法,为了完全控制序列化数据,需要实现Serialization.ISeralizable插口,定义如下:
有关更多介绍,请参阅《.NET高級编码财务审计第二课 Json.Net反序列化系统漏洞》以在实现自定反编码序列类时通过构造函数载入网络攻击提供的PocClass类。
图为定义了用以实现ISerializable插口的PayloadClass类,随后申明了通用性List集合以在GetObjectData方法中接受字节数类型数据。
将PocClass对象加上到List集合,申明泛型类型以使用IEnumerable集合map_type接受程序集反映的类型并回到IEnumerable类型,最后使用Activator.CreateInstance建立案例并将其储存到e3。这是枚举集合的迭代器。
图中将自变量e3添充到分页控件的数据库中,PageDataSource类的定义简单明了。
此外,System.Runtime.Remoting.Channels.AggregateDictionary回到的类型支持IDictionary,随后实例化对象DesignerVerb并随意分派它。此类主要用于配对MenuCommand类的属性值,最后用以配对哈希表中的条件。分派桶。
接下去使用集合加上数据库DataSet。 DataSet和DataTable对象承继自System.ComponentModel.MarshalByValueComponent类,此类可以序列化数据并支持ISerializable插口的远程处理。这是ADO.NET对象中唯一支持远程处理的对象。持久化二进制文件格式。
将属性DataSet.RemotingFormat更改成SerializationFormat.Binary,将属性DataSet.CaseSensitive更改成false,随后启用BinaryFormatter以序列化List集合,如下如图。
由于RemotingFormat属性被特定为Binary,因此导入了BinaryFormatter备份程序,并将属性SurrogateSelector特定为自定MySurrogateSelector类。序列化后,获得SOAP-XML,随后使用SoapFormatter对象的Deserialize方法分析载入文件内容的流数据,并成功弹出来科学计算器。
2.2,进攻向量 - PSObject 由于创作者的Windows服务器已被CVE-2017-8565(Windows PowerShell远程实行编码系统漏洞)修复,因此使用失败,因此我不想再此深层次探讨。有兴趣爱好的朋友可以自己研究一下。有关该傻瓜包的其他信息,请参阅: htpp://support.microsoft.Com/es-us/help/4025872/windows-powershell-remote-code-execution-vulnerability 0x03编码财务审计透视图 3.2,XML载入 从编码财务审计的视角搜索系统漏洞的EntryPoint,可以通过传到XML来反序列化。这种方法也很常见。你需要注意它。
LoadXml直接载入xml数据,这也可能造成XXE系统漏洞。比如这些编码: 这种污渍系统漏洞进攻成本很低,网络攻击只需控制传到的串主要参数源即可轻松实现反序列化系统漏洞进攻,弹出来科学计算器。
文件载入 此部分是手机应用程序的代码段。在财务审计时,您只需要注意DeserializeSOAP方法中传送的相对路径自变量是否可控性。
0x04引言 在实际开发设计中,SoapFormatter 类从.NET Framework 2.0开始。这个课程已慢慢落伍。开发者选择它的概率越来越小。
官方说明是用BinaryFormatter替换成它。下一段文字将介绍BinaryFormatter反编码序列。系统漏洞。最后,NET反序列化系列将同歩到htpp://github.Com/Ivan1ee/ htpp://ivan1ee.gitbook.io/ 创作者将继续发布高品质的.NET反序列化系统漏洞文章,欢迎大家继续注意,沟通,更多.NET安全和方法可以致力于试验室公共性手机号码。