Включение файлов: RFI и LFI
Подключение файла по имени из адресной строки — ошибка, из-за которой в 2000-х массово получали контроль над веб-хостингом.
Суть
- LFI (Local File Inclusion) — приложение открывает файл по управляемому путём: конфигурации, ключи, /etc/passwd, логи. Часто сочетается с path traversal (../../).
- RFI (Remote File Inclusion) — подключается удалённый скрипт (http://evil/shell.txt). Если allow_url_include=On, файл исполняется в контексте приложения — это прямой путь к RCE.
Почему это было массовым
В 2000-х PHP-приложения делали require($_GET['page']). Ботнеты искали такие шаблоны автоматически и ставили шеллы на десятки тысяч сайтов. Классические цели — небольшие «самописные» CMS и заброшенные плагины.
Сегодня RFI как жанр почти ушёл (allow_url_include по умолчанию выключен), но LFI остаётся: в легаси-панелях, «учебных» CMS, самописных загрузчиках. На shared-хостинге одна такая точка часто ведёт к соседним сайтам.
Что находят сканеры и аудиторы
- Чтение произвольных файлов через path traversal в отчётах, инвойсах, шаблонах
- Лог-отравление: в User-Agent записывают PHP-код, потом «включают» лог-файл через LFI
- Комбинация с загрузкой файлов: LFI + картинка с PHP-кодом = выполнение кода
- Утечки конфигураций и ключей — даже без RCE это уже инцидент
Пример (концептуально)
Страница /index.php?page=about включает файл about.php из папки views. Подстановка page=../../../../etc/passwd приводит к выводу системного файла. В комбинированных сценариях добавляют null-байт, PHP-фильтры (php://filter) для чтения исходников, лог-отравление для последующего исполнения.
История: массовые взломы PHP-хостингов
В конце 2000-х ботнеты искали в интернете PHP-приложения с include($_GET['page']) и за часы ставили веб-шеллы на тысячи сайтов. Жертвами становились не «известные бренды», а обычные сайты компаний и учебные CMS — атакующим было всё равно, что там: иногда использовали как плацдарм для спама, иногда перепродавали доступ дальше.
Характерная деталь: владельцы неделями не замечали проблему. На вид сайт работал как обычно, а в директории уже лежал скрытый файл-закладка. Инцидент всплывал, когда хостинг массово блокировал аккаунты или появлялся дефейс.
Защита
- Не формировать пути из пользовательского ввода. Жёсткий allowlist имён модулей → map в реальный файл.
- realpath + проверка префикса директории, запрет ../, запрет URL-схем в include.
- allow_url_include=Off, disable_functions, open_basedir для веб-процесса.
- Обновлять легаси-код; находить такие точки сканерами и ручным аудитом.
Нужна проверка именно вашего контура?
Запустите автоматическое сканирование или закажите ручной аудит с заключением — с приоритетами и планом устранения.