# Basic .Net deserialization (ObjectDataProvider gadget, ExpandedWrapper, and Json.Net)
{% hint style="success" %}
Learn & practice AWS Hacking:<imgsrc="/.gitbook/assets/arte.png"alt=""data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<imgsrc="/.gitbook/assets/arte.png"alt=""data-size="line">\
Learn & practice GCP Hacking: <imgsrc="/.gitbook/assets/grte.png"alt=""data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<imgsrc="/.gitbook/assets/grte.png"alt=""data-size="line">](https://training.hacktricks.xyz/courses/grte)
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
Ce post est dédié à **comprendre comment le gadget ObjectDataProvider est exploité** pour obtenir RCE et **comment** les bibliothèques de sérialisation **Json.Net et xmlSerializer peuvent être abusées** avec ce gadget.
D'après la documentation : _la classe ObjectDataProvider encapsule et crée un objet que vous pouvez utiliser comme source de liaison_.\
Oui, c'est une explication étrange, alors voyons ce que cette classe a de si intéressant : cette classe permet de **encapsuler un objet arbitraire**, d'utiliser _**MethodParameters**_ pour **définir des paramètres arbitraires,** puis **d'utiliser MethodName pour appeler une fonction arbitraire** de l'objet arbitraire déclaré avec les paramètres arbitraires.\
Par conséquent, l'**objet** arbitraire va **exécuter** une **fonction** avec **des paramètres tout en étant désérialisé.**
L'espace de noms **System.Windows.Data**, trouvé dans le **PresentationFramework.dll** à `C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF`, est l'endroit où l'ObjectDataProvider est défini et implémenté.
En utilisant [**dnSpy**](https://github.com/0xd4d/dnSpy), vous pouvez **inspecter le code** de la classe qui nous intéresse. Dans l'image ci-dessous, nous voyons le code de **PresentationFramework.dll --> System.Windows.Data --> ObjectDataProvider --> Nom de la méthode**
Notez que ce n'est pas le code complet de la fonction `QueryWorker`, mais cela montre la partie intéressante : le code **appelle `this.InvokeMethodOnInstance(out ex);`** c'est la ligne où le **méthode définie est invoquée**.
Notez que vous devez ajouter en référence _C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF\PresentationFramework.dll_ afin de charger `System.Windows.Data`
En utilisant l'exploit précédent, il y aura des cas où l'**objet** sera **désérialisé en tant que** une instance _**ObjectDataProvider**_ (par exemple dans la vulnérabilité DotNetNuke, en utilisant XmlSerializer, l'objet a été désérialisé en utilisant `GetType`). Ensuite, il n'aura **aucune connaissance du type d'objet qui est encapsulé** dans l'instance _ObjectDataProvider_ (par exemple `Process`). Vous pouvez trouver plus [d'informations sur la vulnérabilité DotNetNuke ici](https://translate.google.com/translate?hl=en\&sl=auto\&tl=en\&u=https%3A%2F%2Fpaper.seebug.org%2F365%2F\&sandbox=1).
Cette classe permet de **spécifier les types d'objets des objets qui sont encapsulés** dans une instance donnée. Ainsi, cette classe peut être utilisée pour encapsuler un objet source (_ObjectDataProvider_) dans un nouveau type d'objet et fournir les propriétés dont nous avons besoin (_ObjectDataProvider.MethodName_ et _ObjectDataProvider.MethodParameters_).\
Ceci est très utile pour des cas comme celui présenté précédemment, car nous serons en mesure de **wrapper \_ObjectDataProvider**_\*\* à l'intérieur d'une instance \*\*_**ExpandedWrapper** \_ et **lorsqu'il est désérialisé**, cette classe **créera** l'objet _**OjectDataProvider**_ qui **exécutera** la **fonction** indiquée dans _**MethodName**_.
Sur la [page web officielle](https://www.newtonsoft.com/json), il est indiqué que cette bibliothèque permet de **sérialiser et désérialiser n'importe quel objet .NET avec le puissant sérialiseur JSON de Json.NET**. Donc, si nous pouvions **désérialiser le gadget ObjectDataProvider**, nous pourrions provoquer un **RCE** simplement en désérialisant un objet.
Apprenez et pratiquez le hacking AWS :<imgsrc="/.gitbook/assets/arte.png"alt=""data-size="line">[**HackTricks Formation Expert Red Team AWS (ARTE)**](https://training.hacktricks.xyz/courses/arte)<imgsrc="/.gitbook/assets/arte.png"alt=""data-size="line">\
Apprenez et pratiquez le hacking GCP : <imgsrc="/.gitbook/assets/grte.png"alt=""data-size="line">[**HackTricks Formation Expert Red Team GCP (GRTE)**<imgsrc="/.gitbook/assets/grte.png"alt=""data-size="line">](https://training.hacktricks.xyz/courses/grte)
* Consultez les [**plans d'abonnement**](https://github.com/sponsors/carlospolop)!
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** nous sur **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Partagez des astuces de hacking en soumettant des PRs aux** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) dépôts github.