Basic .Net deserialization (ObjectDataProvider gadget, ExpandedWrapper, and Json.Net)

chevron-right从零开始学习 AWS 黑客技术,成为专家 htARTE(HackTricks AWS 红队专家)arrow-up-righthashtag

本文致力于理解如何利用 ObjectDataProvider gadget 来获取 RCE,以及如何使用 Serialization 库 Json.Net 和 xmlSerializer 来滥用 该 gadget。

ObjectDataProvider Gadget

根据文档:ObjectDataProvider 类包装并创建一个可用作绑定源的对象。 是的,这是一个奇怪的解释,所以让我们看看这个类有什么有趣的地方:该类允许包装任意对象,使用 MethodParameters设置任意参数,然后使用 MethodName 调用声明的任意对象的任意函数。 因此,反序列化时,该任意对象执行一个带有参数的函数

这是如何可能的

System.Windows.Data 命名空间位于 PresentationFramework.dll 中,路径为 C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF,其中定义和实现了 ObjectDataProvider。

使用 dnSpyarrow-up-right 您可以检查我们感兴趣的类的代码。在下面的图像中,我们看到了 PresentationFramework.dll --> System.Windows.Data --> ObjectDataProvider --> Method name 的代码

当设置 MethodName 时,可以看到调用了 base.Refresh(),让我们看看它做了什么:

好的,让我们继续看 this.BeginQuery() 做了什么。BeginQueryObjectDataProvider 覆盖,这是它的功能:

请注意,在代码的末尾调用了 this.QueryWorke(null)。让我们看看它执行了什么:

请注意,这不是函数 QueryWorker 的完整代码,但显示了其中的有趣部分:代码调用了 this.InvokeMethodOnInstance(out ex); 这是设置的方法被调用的地方。

如果您想检查只设置 MethodName 就会被执行的情况,可以运行此代码:

请注意,您需要在加载System.Windows.Data时添加参考_C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF\PresentationFramework.dll_。

ExpandedWrapper

使用先前的漏洞利用,会出现一种情况,即对象将被反序列化为一个_ObjectDataProvider_实例(例如在DotNetNuke漏洞中,使用XmlSerializer,对象是使用GetType进行反序列化的)。然后,将不知道包装在_ObjectDataProvider_实例中的对象类型(例如Process)。您可以在此处找到有关DotNetNuke漏洞的更多信息arrow-up-right

这个类允许指定封装在给定实例中的对象类型。因此,这个类可以用来将源对象(ObjectDataProvider)封装到一个新的对象类型中,并提供我们需要的属性(ObjectDataProvider.MethodName_和_ObjectDataProvider.MethodParameters)。 这对于前面提到的情况非常有用,因为我们将能够将_ObjectDataProvider包装在一个ExpandedWrapper实例中,反序列化此类时将创建将在MethodName_中指示的函数执行的_ObjectDataProvider_对象。

您可以使用以下代码检查此包装器:

Json.Net

官方网页arrow-up-right中指出,该库允许使用Json.NET强大的JSON序列化程序对任何.NET对象进行序列化和反序列化。因此,如果我们能反序列化ObjectDataProvider gadget,我们就可以通过反序列化一个对象来引发RCE

Json.Net示例

首先让我们看一个使用该库进行序列化/反序列化对象的示例:

滥用 Json.Net

使用 ysoserial.netarrow-up-right 我创建了漏洞利用:

在这段代码中,你可以测试漏洞,只需运行它,你会看到计算器被执行:

chevron-right从零开始学习AWS黑客技术 htARTE(HackTricks AWS红队专家)arrow-up-righthashtag

最后更新于