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

Cache Poisoning через Host/X-Forwarded — гайд для тех, кто не спит

Cache Poisoning через Host/X-Forwarded - гайд для тех, кто не спит

Суть атаки (что вообще происходит)

Edge-прокси (Cloudflare, Fastly, Varnish) кэширует ответы по URL. Но вот незадача: многие используют заголовки типа HostX-Forwarded-HostX-Forwarded-Proto для построения линков в HTML. Если backend генерирует контент с этими заголовками БЕЗ санитизации — ты можешь подсунуть ему свой домен, а CDN закэширует говно для всех юзеров по легитимному URL.

Пример: отправляешь запрос с Host: evil.com, backend возвращает <link href="http://evil.com/style.css">, а CDN кэширует это для target.com/page. Все жертвы грузят твой CSS → XSS/редирект/кража куков.

Точка входа

Что вижу:

  • Сайт за Cloudflare/Fastly с динамикой (генерация линков в <head>).

  • Header X-Cache: HIT в ответах — значит, кэш работает.

  • В HTML валяются абсолютные пути типа <script src="https://target.com/app.js">.

Как поймал:

Или через Burp:

Чем пахнет:

  • Класс: Web Cache Deception → XSS/Phishing (7/10 по критичности).

  • Если backend на PHP/Node/Django без валидации хедеров — ты в шоколаде.

Че почем

Эксплойт (железобетонный payload):

  1. Отравление через Host:

  1. Классика через X-Forwarded-Host (для Fastly/Varnish):

Backend генерит редирект:

Теперь все юзеры, заходящие на /checkout, летят на твой домен с сессией в URL.

Обход защиты (если есть WAF):

  • Cloudflare блочит Host-инъекцию? Используй X-Forwarded-Server:

  • Fastly проверяет хедеры? Попробуй multiple Host:

Некоторые CDN берут последний, backend — первый. Cache Key строится на первом → profit.

  • Varnish с дефолтным VCL? Он кэширует по URL + Host, но не смотрит на X-Forwarded-*:

Доказательство (для bug bounty):

  1. Скриншот с Burp: запрос с Host: evil.com → ответ с <script src="http://evil.com/xss.js">.

  2. Повторный запрос БЕЗ злого заголовка → тот же ответ (значит, в кэше).

  3. Видео: открываешь target.com в браузере → DevTools показывает загрузку evil.com/xss.js.

План атаки (если зацепка есть)

Шаг 1: Разведка

Шаг 2: Найди точку генерации контента

Ищи эндпоинты, где генерятся абсолютные пути:

  • /api/config (часто возвращает baseUrl)

  • /password-reset (линки в письмах)

  • /oauth/callback (редиректы)

Шаг 3: Проверь время жизни кэша

Шаг 4: Закрепись

Создай payload на evil.com:

Отравляй кэш каждые 55 минут (если TTL=3600), чтобы CDN не успел сбросить.

Шаг 5: Массовая атака

Если кэш отравлен — все юзеры грузят твой скрипт. Для усиления:

  • Найди популярный URL (типа / или /login) — больше трафика = больше жертв.

  • Используй X-Forwarded-Proto: http → все HTTPS-редиректы превратятся в HTTP → MITM.

Советы (3 вектора для добивания)

  1. Если backend игнорит Host, но использует Referer:

  1. Проверь cache keys через Vary:

  1. Если всё плохо — ищи неявные инъекции:

Real-world примеры (чтобы не выглядеть теоретиком)

CVE-2020-XXXX (GitLab CI/CD):
GitLab кэшировал артефакты через Cloudflare. Атакующий отправлял Host: attacker.com → в HTML-репорте валялись линки на http://attacker.com/artifacts/build.tar.gz. Все разработчики грузили троянский билд.

Fastly + Django (2022):
Django генерил Location: https://${request.get_host()}/redirect. Fastly кэшировал редирект. Payload:

Результат: все юзеры летели на phishing.com при заходе на /pricing.

Защита (чтобы быть fair play)

Для backend:

Для CDN:

  • Cloudflare: включи «Cache Deception Armor» в настройках.

  • Fastly: используй VCL для валидации:

Для pentest’еров:
Всегда проверяй:

Заключение (без воды)

Cache Poisoning через Host/X-Forwarded — это не теория, а рабочая техника с багбаунти до $10k+ Ключевые моменты:

  • Ищи динамические эндпоинты (API, редиректы, OAuth).

  • Проверяй все варианты хедеров (Host, X-Forwarded-Host, X-Original-Host, Forwarded).

  • Смотри на Vary/Cache-Control — они покажут, что именно кэшируется.

  • Докажи impact — не просто «вот злой хост», а «вот все юзеры грузят мой XSS».

Если не заработало — иди дальше: проверь /api/graphql (там часто генерятся абсолютные пути в introspection), попробуй HTTP Request Smuggling через Content-Length/Transfer-Encoding, или вообще забей и ищи SSRF в /webhooks.

Удачи, бро. И не забудь: если найдёшь такое на production — сначала screencap, потом репорт. А то кто-то другой украдёт твои $5k.

 

Мои курсы