Local File Inclusion (LFI) - ключевые техники и защита
LFI (Local File Inclusion) - уязвимость веб-приложений, при которой злоумышленник через непроверенный пользовательский ввод заставляет сервер подключить произвольный локальный файл, что ведёт к утечке данных, а в ряде случаев - к удалённому выполнению кода (RCE).Техники эскалации LFI → RCE (не рассмотрены в статье)
- Log Poisoning: внедрение PHP-кода в лог (например, через заголовок
User-Agent), затем подключение лога через LFI - получаем выполнение кода. - Цепочка File Upload + LFI: загрузка файла с вредоносным содержимым через легитимную форму, затем его подключение через уязвимый параметр.
- PHP filter chains: помимо
php://filter/convert.base64-encode, существуют цепочки фильтров, позволяющие добиться RCE без записи на диск.
Отличие от RFI
RFI (Remote File Inclusion) позволяет подключить файл с внешнего сервера и сразу выполнить произвольный код. Работает только при включённыхallow_url_include и allow_url_fopen в php.ini. LFI ограничена локальными файлами, но встречается значительно чаще.Защита (конкретные меры)
- Белый список допустимых значений параметра - самый надёжный способ.
- Использование
basename()для отсечения path traversal (../). - Отключение
allow_url_includeв php.ini. - Хранение подключаемых файлов вне webroot.
- На уровне SIEM/WAF - детект паттернов
../,php://,file://в параметрах запросов.
Типичные цели для чтения
| Файл | Что даёт |
|---|---|
/etc/passwd | Список пользователей системы |
.env | Креды БД, API-ключи, токены |
/proc/self/environ | Переменные окружения (иногда - вектор для RCE) |
| Логи Apache/Nginx | Вектор для log poisoning |
Полезные материалы Codeby
- CTF Web Writeup: SQL injection, SSRF и десериализация - разбор реальных задач
- Web | Калькулятор | HackerLab
Всем салам. Сегодня хотелось бы поговорить о такой уязвимости, как Local File Inclusion (LFI). Наличие данной уязвимости очень опасно. Но давайте обо всем оп порядку.
[0] - Немного теории
Как я уже говорил выше, наличие данной уязвимости очень опасно, ведь мы можем получать доступ к каким-либо файлам на сервере, что может представлять огромную опасность для нас.
Хочу сказать, что это является, как бы вступительной статьей по LFI, где мы будем рассматривать разные варианты LFI и в итоге, окончательная статья в цикле Безопасный PHP, как же все-таки от него защищаться.
Забегая вперед, хочу сказать, что данная уязвимость возникает из-за того, что, на сервере не задаются правильные права для файлов и следствие, их можно открывать и еще хреновая фильтрация. И как это будем устранять уже рассмотрим во 2ой статье.
[1] - Практика
Показывать это на боевых сайтах я не буду, потому что, как минимум это незаконно, а возьмем для эксперимента DVWA. А в следующей статье мы поднимем сайт на тестовом серваке и в подробностях будем тестировать. Итак, начнем:
[1.1] - Нулевая фильтрация
Зайдем на DVWA и выбираем соответственно уязвимость File Inclusion:
У этой страницы ссылка выглядит так:
Вот тут-то и есть наша уязвимость, откуда мы можем обращаться к серверу и читать его файлы. А ведь требовалась элементарная фильтрация, чтобы этого не допустить. Итак, для этого нам нужно указать путь к файлу. Такой вариант LFI уязвимости считается самым базовым.
Для демонстрации, в корневой папке я создал копию главной страницы и изменил его заголовок. И в запросе вместо передачи параметру page нашего файла, я передал ему файл, который находится в корневой папке. А так как мы находимся во вложенных папках, чтобы выйти из них указываем ../ что значит, на 1 папку выше и после указываем сам файл. И в итоге получаем содержимое файл. Обычно при проверке LFI уязвимости ссылаются на passwd, который расположена /etc/passwd.
И чтобы было понятно, что же это такое «нулевая фильтрация», на примере кода:
Код:
$file = $_GET['page'];
[1.2] - Base64 или php filter
Бывают случаю, когда мы не можем прочитать содержимое файла из-за определенных мер безопасности и в этом случае нам поможет PHP функция, и мы получим какую-то закодированную строку.
Строка это, как вы уже поняли в base64 расшифровав его, мы получим содержимое файла:
Этот LFI в реальности редко сейчас можно встретить. Но она достаточно часто используется в CTF соревнованиях.
Поиск LFI может производится двумя способами:
- Автоматический
- Ручной
И ручной, тут, когда находим что-то типа .php?page=home, пытаемся изменить значение параметра, если успешно выполняется, то аллелуя.
С помощью дорков можно найти, возможно, уязвимые объекты:
inurl:.php?main=*php
inurl:.php?file=
inurl:.php?inc=*php
inurl:.php?pg=*php
inurl:.php?include_file=*php
inurl:.php?main=*html
inurl:.php?inc=*html
inurl:.php?pg=*html
inurl:.php?id=
inurl:.php?action=
inurl:.php?content=
inurl:.php?page=
inurl:.php?file=
inurl:.php?inc=*php
inurl:.php?pg=*php
inurl:.php?include_file=*php
inurl:.php?main=*html
inurl:.php?inc=*html
inurl:.php?pg=*html
inurl:.php?id=
inurl:.php?action=
inurl:.php?content=
inurl:.php?page=
И еще можете прочитать про сканер дорков ZEUS-SCANNER
Также можно еще много своих дорков намутить. На этом думаю все, в следующей части мы разберем еще 2 типа LFI и как нужно от них защищаться.
И помните. Фильтровать вход, экранировать выход! Всем удачи.
Последнее редактирование модератором: