0X00序言 .NET Framework中的XmlSerializer类是将高宽比结构型的XML统计数据投射到.NET另一半的极佳专用工具。
XmlSerializer类根据程序流程中的单独接口文档启用实行XML文本文档和另一半中间的变换。变换投射标准由元数据特性在.NET类中表达。假如开发者应用Type类的静态方法来获得外界统计数据,并启用Deserialize来反序列化xml统计数据,则会开启反序列化系统漏洞进攻(比如DotNetNuke随意)。代码执行系统漏洞CVE-2018-9822),创作者从基本原理和编码财务审计的视角对有关的脑图开展了详细介绍和发作。
0X01 XmlSerializer序列化 .NET Framework中System.Xml.Serialization命名空间中的XmlSerializer类可以将XML文本文档关联到.NET类的案例。必须留意的一点儿是,它只有将另一半的公共性和公共性字段名变换为XML原素或特性。而且由2个方式构成:Serialize()用以从另一半案例转化成XML; Deserialize()用以将XML文本文档分析为对象图,序列化统计数据可以是统计数据,字段名,数组,XmlElement和XmlAttribute另一半文件格式。内嵌式XML。实际看下边的演试
XmlElement特定将特性序列化为原素,XmlAttribute特定将特性序列化为特性,XmlRoot特性特定将类序列化为根原素,而且特性种类的特性危害要转化成的名字,名字室内空间和种类。建立TestClass类的案例以将其特性添充到文档中。 XmlSerializer.Serialize方法重载可以接纳Stream,TextWrite和XmlWrite类。转化成的XML文档列举了TestClass原素,Classname特性及其作为原素储存的别的特性。
0x02 XmlSerialize反序列化 反名单中全过程:根据建立新另一半启用XmlSerializer.Deserialize方式来进行将xml文件转换为另一半。序列化最重要的一部分是在新的XmlSerializer构造函数中传送的主要参数。此参数来源于系统软件。Type类,容许浏览相关一切数据类型的信息内容。有几种方式可以偏向一切给出种类的Type引证。
2.2、typeof 实例化XmlSerializer传送的typeof(TestClass)以获得TestClass类的Type。 typeof是C#中的运算符。传送的主要参数只有是种类的名字,而并不是实例化的另一半,如下边的Demo如图。 照片11.png 获得Typeof后,您可以获得课程内容中的全部方式,组员和更多信息。时下图运作Debug时,弹出来信息提示框显示信息当今组员Name的值。 照片4.png 3.2、object.Type .NET中的全部类最后都是以System.Object派生的。 Object类中界定了很多公共性和受维护的组员方式。这种方式可以在自身界定的全部别的类中应用。 GetType方式就是说在其中之四。该方式回到从System.Type派生的类的案例,由于它可以出示相关另一半组员隶属的类的信息内容,包含基础种类,方式,特性等。在上边的事例中,TestClass被实例化,而且随后获得当今案例的Type,如下边的Demo如图。 照片6.png 2.2、Type.GetType 三种方式是Type类的静态方法GetType。此方式容许外界全球传到字符串。它是1个挺大的优点。您只需传送彻底限制名字只能启用类中的方式,特性等。 照片11.png Type.GetType中传送的主要参数都是反序列化造成的环境污染点。下一阶段是寻找可用以进攻的类。 0X03搭建进攻链 最先把进攻链建立取得成功后进行演试,这一演试可以在一切地区同用(不涉及到.NET Core,MVC),如图所示
要是XmlSerializer具备反序列化系统漏洞,就可以应用下列Demo的內容,涉及到3个关键技术性关键点。下列标准各自详细介绍。
3.2、ObjectDataProvider ObjectDataProvider类,坐落于System.Windows.Data命名空间中,可以启用引证类中的一切方式,为组员ObjectInstance出示相近的实例化类,组员MethodName 启用特定种类的方式的名字,组员MethodParameters表达传送给方式的主要参数,请参照图为