Локальное включение файлов LFI: полный разбор атак и защиты

Локальное включение файлов LFI: полный разбор атак и защиты

Локальное включение файлов Local File Inclusion относится к классу уязвимостей веб приложений при котором, пользовательский ввод попадает в путь к файлу включаемому сервером. В результате злоумышленник получает возможность читать произвольные файлы операционной системы, а в ряде сценариев переходит к исполнению кода и полному захвату приложения.

Типичная причина LFI отсутствие строгой валидации параметров используемых в конструкциях вида include require или при чтении шаблонов конфигураций и логов. Если разработчик полагается на простые строковые проверки и не учитывает особенности файловой системы, кодировок и особенностей веб сервера открывают широкие возможности для эксплуатации уязвимости.

Основные методы эксплуатации LFI

Базовый сценарий проверки веб приложения заключается в подстановке относительных путей с переходами по каталогам. В простейшем случае GET параметр page допускает значение news.php, но не фильтрует последовательность ../. Пример URL запроса:

https://target.example/index.php?page=../../../../etc/passwd

В случае, если уязвимость присутствует в системе,  в ответе система может вернуть содержимое системного файла /etc/passwd что уже нарушает конфиденциальность. На платформах с интерпретацией PHP дополнительно используются обёртки вида php://filter позволяющие получать исходный код скриптов в кодировке base64 и анализировать логику веб приложения.

Следующий уровень опасности уязвимости связан с переходом от чтения файлов к вредоносной эксплуатации кода приложения. Для этого злоумышленник пытается внедрить произвольный PHP фрагмент в лог веб сервера или в файл сессий, а затем подключить его через LFI. Например, если строка логов содержит параметр User Agent, злоумышленник подставляет туда конструкцию с функцией system а после запрашивает включение вредоносного файла.

Инструменты и практические приёмы обнаружения

Начальный этап тестирования LFI выполняется вручную в браузере или через выполнение curl запроса в терминале. Аналитик выявляет параметры похожие на имя файла шаблона языка или модуля и подставляет диагностические значения. Пример:

curl "https://target.example/index.php?page=../../../../etc/passwd"
curl "https://target.example/index.php?page=php://filter/convert.base64-encode/resource=index.php"

Для автоматического перебора используют технику фаззинга запросов. Распространённый инструмент для выполнения этой задачи ffuf.  Инструмент входит в базовый набор Kali, Parrot, Arch Linux, или устанавливается в систему из исходников git. Пример инсталляции и использования приложения в системе:

git clone https://github.com/ffuf/ffuf.git
cd ffuf
go build
./ffuf -u "https://target.example/index.php?page=FUZZ" -w wordlists/lfi.txt

Маркер FUZZ указывает место подстановки строк из словаря. Уже на этом шаге ffuf покажет коды ответа и размеры страниц для каждого варианта пути. Чтобы отсечь очевидный шум, используют фильтрацию по статусу и авто калибровку

ffuf -u "https://target.example/index.php?page=FUZZ" \
-w /usr/share/wordlists/lfi.txt \
-mc 200 -ac

Ответы с повторяющимся размером и шаблонной страницей ошибки ffuf помечает как фон. Отличающихся по размеру или содержанию запросов ffuf помечает как потенциально уязвимые, затем такие страницы  изучаются вручную через браузер или прокси. Для POST запросов команда запуска почти не меняется

ffuf -u https://target.example/download \
-X POST -d "file=FUZZ" \
-H "Content-Type: application/x-www-form-urlencoded" \
-w /usr/share/wordlists/lfi.txt -mc 200 -ac

При необходимости трафик направляют в Burp или ZAP для параллельного анализа использовав опцию прокси

ffuf -u "https://target.example/index.php?page=FUZZ" \
-w /usr/share/wordlists/lfi.txt \
-x http://127.0.0.1:8080 -mc 200 -ac

Число потоков регулируется ключом -t а предельная частота запросов параметром -rate чтобы не перегрузить тестируемый ресурс.

В OWASP ZAP аналогичная функция реализована в модуле Fuzzer. Достаточно выбрать нужный параметр в интерфейсе и прикрепить к нему словарь. Параллельно ZAP может выполнять активное сканирование и выдавать свои находки по LFI в отдельном отчёте.

При таком подходе ffuf, Burp Suite и OWASP ZAP не заменяют друг друга, а образуют связку где быстрое автоматическое покрытие параметров дополняется тщательным разбором ограниченного числа подозрительных ответов, что делает поиск LFI управляемым и автоматизированным процессом.

Check Risk WAF SaaS — облачная защита веб-приложений и инфраструктуры
Check Risk WAF — защита веб-приложений и API

Блокирует SQLi, XSS, L7‑DDoS и вредоносных ботов. Подключение без изменений кода вашего веб-приложения, события и отчёты — из одного кабинета.

  • Система обнаружения атак
  • Кастомные правила
  • Защита от бот‑трафика и сканеров
  • Пилотное тестирование — бесплатно

Практические аспекты эксплуатации

При успешной эксплуатации LFI атакующий стремится расширить доступ за пределы чтения. Для приложений на PHP распространён подход с подменой логов. В заголовок User Agent добавляется фрагмент кода, после чего выполняется запрос к уязвимому параметру который включает файл access.log. Если приложение не ограничивает каталог и права доступа конфигурация сервера превращается в примитивный веб шелл.

Даже если переход к удалённому выполнению кода невозможен чтение конфигураций может раскрыть данные подключения к базе список внутренних сервисов и токены внешних API. Эти сведения используются для дальнейшего продвижения внутри инфраструктуры, поэтому LFI рассматривается как серьёзный элемент в цепочки атаки.

Методы предотвращения и снижения риска

Надёжная защита от LFI опирается на принцип жёсткого контроля источников путей. Вместо передачи имён файлов из параметров следует использовать заранее определённые идентификаторы и сопоставлять их с путями по белому списку. Любые последовательности ../ нулевые байты и управляющие символы должны блокироваться на уровне общей библиотеки валидации.

Дополнительно рекомендуется нормализовать путь через функции реальной файловой системы и проверять что он остаётся внутри разрешённого каталога. На уровне конфигурации веб сервера и интерпретатора следует отключать возможность обращения к глобальным каталогам через include ограничивать значение параметра open_basedir и минимизировать права пользователя от имени которого работает приложение.

Существенную роль играет разграничение доступа к файлам. Конфигурации с чувствительными данными необходимо выносить из корня веб сервера журналы и временные файлы хранить в каталогах недоступных через HTTP. Даже в случае логической ошибки в коде это уменьшит влияние возможной эксплуатации LFI.

В завершение важно помнить что защита приложения должна дополняться сетевыми средствами контроля. Применение специализированного веб экрана приложений WAF позволяет выявлять характерные последовательности вида ../ и обращения к системным файлам ещё на уровне HTTP запросов. Использование решения Check Risk WAF помогает блокировать попытки эксплуатации LFI и других инъекций до их обработки приложением. Регулярная настройка правил и анализ аномальных обращений через платформу WAF существенно снижает совокупный риск, а в случае с LFI применение WAF Check Risk позволяет во всех практических сценариях предотвратить риски связанные с данной уязвимостью.

web
245
17.11.2025 15:00
ИП Елисеев Иван Владимирович
ИНН: 236401038208
Свидетельство о государственной регистрации программы для ЭВМ № 2026683774 от 04 августа 2026 г.
Продукт включен в реестр Российского ПО. Реестровая запись №32239 от 17.02.2026 г.
Регистрационный номер оператора, осуществляющего обработку персональных данных: 23-26-176186