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

HTTP Parameter Pollution: Когда Backend’ы воюют между собой

HTTP Parameter Pollution: Когда Backend'ы воюют между собой

HTTP Parameter Pollution (HPP) — это когда ты шлёшь ?id=1&id=2, а один парсер хватает первый параметр, другой — второй, и вуаля: ты уже обходишь авторизацию или меняешь логику приложения. Суть в том, что разные технологии по-разному жрут дубликаты параметров, и это можно использовать для pwn’а систем.

Че почем: таблица парсеров-дебилов

Вот как разные бэкенды обрабатывают ?par=val1&par=val2:

Технология Что берёт Результат
PHP/Apache Последнее значение par=val2
JSP/Tomcat Первое значение par=val1
ASP.NET/IIS Все значения (конкатенация) par=val1,val2
Python/Django Последнее значение par=val2

Это значит, если фронтенд на Tomcat проверяет первый id=1 (легитимный), а бэкенд на PHP берёт последний id=2 (твой payload) — ты прошёл валидацию и обосрался в чужую админку.

Точка входа: где искать

Что вижу:

  • Параметры в GET/POST запросах (uididactionpriceaccount)

  • Формы с редиректами и URL-билдингом

  • API endpoints с query-параметрами

  • Системы с разными компонентами (фронт + бэкенд, WAF + апп)

Как поймал:

  1. Fuzzing дубликатами: curl "https://target.com/transfer?amount=100&toAccount=legit&toAccount=attacker"

  2. Burp Repeater: Добавляешь второй параметр вручную, смотришь на поведение

  3. Nuclei template: Автоматизация проверки на HPP-паттерны

  4. Header smuggling: Иногда работает через Cookie/Referer

Чем пахнет: Обход авторизации (8/10), IDOR (7/10), injection в логику (9/10).

Эксплойт: реальные кейсы

Twitter Intent Bug (Eric Rafaloff)

Твиттер обрабатывал второй параметр screen_name, игнорируя первый:

Форма показывала «Follow @twitter», но клик фолловил @attacker. Классика клиентского HPP.

Money Transfer на стероидах

Представь:

  • Фронтенд: POST /transferMoney.php с amount=1000&fromAccount=12345

  • Бэкенд: Добавляет toAccount=9876 (фиксированный счёт компании)

  • Ты шлёшь: amount=1000&fromAccount=12345&toAccount=99999

Если бэкенд на PHP — твой второй toAccount перезапишет дефолтный, деньги полетят на счёт 99999 вместо легитимного 9876.

OWASP-пример с UID

Twitter обнаружил, что ?uid=victim&uid=attacker в email-верификации брал второй UID:

WAF видит «legit», пропускает. PHP рендерит второй — XSS fired.

Mod_Security path traversal:

ModSec: «safe.pdf? OK». Apache: «Вот твой /etc/passwd, держи».

Cookie pollution:
Если апп парсит параметры из Cookie и GET — комбинируй:

Некоторые фреймворки мержат источники, беря «последний override» из GET.

Советы

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

  1. IDOR через UID/ID: Видишь ?user_id=123 в профиле? Попробуй ?user_id=123&user_id=1 (админ часто ID=1). Если бэкенд на PHP — может взять второй.

  2. Price manipulation в e-commerce:

Если фронтенд валидирует первый (дорогой), а payment gateway берёт последний — покупай Ferrari за рубль.

  1. Auth bypass через logged_in:

Если WAF проверяет первый (безопасный), а апп авторизует по второму — добро пожаловать в /admin.

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

  1. Разведка: ffuf -u "https://target.com/api?id=FUZZ&id=666" -w nums.txt — ищем эндпоинты с ID/UID.

  2. Определяем бэкенд: По заголовкам (X-Powered-ByServer) или поведению. PHP берёт последний? Отлично.

  3. Craft payload: Комбинируй легитимное значение (первое) + вредоносное (второе):

  1. Проверка доказательства: Логинься в victim’s account через ?uid=victim&uid=you. Видишь чужие данные? Скриншот → Standoff365 → $$$$.

Доп-трюки:

  • Проверь robots.txt и sitemap.xml: Там могут быть /api/v1/transfer/admin/user-edit — золотые жилы для HPP.

  • Если есть JWT: Попробуй ?token=valid&token={"alg":"none"} — может, парсер дублей сломает логику верификации.

  • CloudMetadata SSRF + HPP: curl "http://169.254.169.254/latest/meta-data/iam/security-credentials/?role=user&role=admin" — вдруг AWS-токены отдадут admin-роль.

Если всё плохо: Иди фаззить JSON body — там тоже бывают дубликаты ключей {"id":1, "id":2}, и парсеры JSON (Python vs Node.js) обрабатывают их по-разному. Или учи Rust, бро — там хоть типы нормальные.

Мои курсы