0x00序言 BinaryFormatter和SoapFormatter类之间的区别在于数据流的文件格式不同。其他功能类似。 BinaryFormatter坐落于命名空间 中。 System.Runtime.Serialization.Formatters.Binary它以二进制模式直接序列化对象。优势是它在.NET平台的不同版本号中迅速且适配。但是,使用没受信赖的二进制文件的反序列化可致反序列化系统漏洞和远程RCE进攻。在文中中,创作者从原理和编码财务审计的视角介绍和重现。 0x01 BinaryFormatter序列化 在使用BinaryFormatter类进行序列化的过程中,可以序列化使用[Serializable]申明的类。当然,一些不希望序列化的元素可以通过[NoSerialized]属性来避开。以下是一个说明问题的实例,首先定义TestClass对象
定义了三个组员,并起动静态方法ClassMethod。序列化通过创建对象案例为组员分派值
通常,使用Serialize获得序列化二进制文件内容,打开后显示的数据格式如下
0x02 BinaryFormatter反序列化 2.2,反序列化使用方法
反编码序列过程是将二进制数据转换为对象,并通过建立新对象来启用反序列化多个重载方法。可以看视图定义与SoapFormatter备份程序相同。 IRemotingFormatter和IFormatter插口由系统提供。几种不同的反编码序列方法是Deserialize,DeserializeMethodResponse,UnsafeDeserialize,UnsafeDeserializeMethodResponse。创作者通过建立新对象启用Deserialize方法实现的特定实现编码可以参照以下几点。
反序列化TestClass类的组员名字的值。
3.2,进攻向量 - ActivitySurrogateSelector 由于系统漏洞原则已在前一段文字中介绍过,因此文中不再沉余。对于并未阅读文章的人,请参阅《.NET高級编码财务审计(第八课) SoapFormatter反序列化系统漏洞》。彼此之间的唯一区别是BinaryFormatter类用以序列化数据。除此之外,通过启用ISerializationSurrogate来启用自定编码,我依然使用科学计算器在这里进行演试。转化成的二进制文件打开,如下如图。
像以往一样通过BinaryFormatter类的Deserialize方法反序列化
科学计算器会弹出来,但它也会抛出去异常,在web服务的情况下能回到500错误。
2.2,进攻向量--WindowsIdentity 对于那些没有见到WindowsIdentity原理的人,请参照《.NET高級编码财务审计(第二课) Json.Net反序列化系统漏洞》,因为WindowsIdentity最后分析Base64编码数据,所以这儿序列化器被反序列化并弹出来科学计算器。