Собесов

Security Engineering Яндекса — LFI: какие файлы открывать первыми

Кейсы и метрикиWeb vulnerabilitiesСредняяMiddle

Условие

Вы обнаружили на сайте уязвимость 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, ~/.env
  • composer.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_AGENT env, после <?php phpinfo();?> в UA можно RCE.
  • phar:// deserialization.

Подводные камни

  1. LFI ≠ Path Traversal. LFI — приложение интерпретирует/инклюдит файл (PHP, JSP). Path traversal — просто читает (GET-параметр содержит файл, отдаваемый «как есть»). Эксплуатируются по-разному.
  2. null-byte injection (%00) работает только в PHP < 5.3 / Java старых версий.
  3. /etc/shadow обычно 0640 root:shadow — недоступно для www-data. Запрос ничего не даст.
  4. /proc/self/environ начиная с ядра 2.6.39 — read-only для своего процесса (нельзя эксплуатировать через UA).
  5. Wrappers требуют конфигурации. allow_url_include=On нужен для data:///php://input RCE — в современных PHP по умолчанию Off.
  6. Логирование атак. Все ваши попытки попадают в access.log → форензикам сразу видно атакующего.
  7. При наличии Web Application Firewall простые ../../etc/passwd блокируются. Используются ..%2f, ..%252f, ....//, нулевые байты.

Эталонный ответ

Стартовый чек-лист:

  1. /etc/passwd (подтверждение).
  2. /proc/self/environ, /proc/self/cmdline (env с секретами).
  3. Конфиги приложения: .env, config.php, settings.py, web.config.
  4. SSH/AWS-ключи: ~/.ssh/id_rsa, ~/.aws/credentials.
  5. Логи для log poisoning → RCE: /var/log/nginx/access.log.
  6. Если PHP — wrappers: php://filter, data://, php://input.

Цель — пройти от LFI до раскрытия секретов и далее до RCE.

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти