Basic .Net deserialization (ObjectDataProvider gadget, ExpandedWrapper, and Json.Net)
从零开始学习 AWS 黑客技术,成为专家 htARTE(HackTricks AWS 红队专家)!
您在 网络安全公司 工作吗? 想要看到您的 公司在 HackTricks 中做广告 吗? 或者您想要访问 PEASS 的最新版本或下载 PDF 版本的 HackTricks 吗? 请查看 订阅计划!
发现我们的独家 NFTs 集合 The PEASS Family
加入 💬 Discord 群组](https://discord.gg/hRep4RUj7f) 或 电报群组 或 关注 我的 Twitter 🐦@carlospolopm。
通过向 hacktricks 仓库 和 hacktricks-cloud 仓库 提交 PR 来分享您的黑客技巧。
本文致力于理解如何利用 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。
使用 dnSpy 您可以检查我们感兴趣的类的代码。在下面的图像中,我们看到了 PresentationFramework.dll --> System.Windows.Data --> ObjectDataProvider --> Method name 的代码

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

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

请注意,在代码的末尾调用了 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漏洞的更多信息。
这个类允许指定封装在给定实例中的对象类型。因此,这个类可以用来将源对象(ObjectDataProvider)封装到一个新的对象类型中,并提供我们需要的属性(ObjectDataProvider.MethodName_和_ObjectDataProvider.MethodParameters)。 这对于前面提到的情况非常有用,因为我们将能够将_ObjectDataProvider包装在一个ExpandedWrapper实例中,反序列化此类时将创建将在MethodName_中指示的函数中执行的_ObjectDataProvider_对象。
您可以使用以下代码检查此包装器:
Json.Net
在官方网页中指出,该库允许使用Json.NET强大的JSON序列化程序对任何.NET对象进行序列化和反序列化。因此,如果我们能反序列化ObjectDataProvider gadget,我们就可以通过反序列化一个对象来引发RCE。
Json.Net示例
首先让我们看一个使用该库进行序列化/反序列化对象的示例:
滥用 Json.Net
使用 ysoserial.net 我创建了漏洞利用:
在这段代码中,你可以测试漏洞,只需运行它,你会看到计算器被执行:
从零开始学习AWS黑客技术 htARTE(HackTricks AWS红队专家)!
您在网络安全公司工作吗?想要看到您的公司在HackTricks中宣传吗?或者您想要访问PEASS的最新版本或下载PDF格式的HackTricks吗?请查看订阅计划!
加入 💬 Discord群组 或 电报群组 或在Twitter上关注我 🐦@carlospolopm。
通过向hacktricks repo和hacktricks-cloud repo提交PR来分享您的黑客技巧。
最后更新于