Parameter Pollution | JSON Injection
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
HTTP Parameter Pollution (HPP) — це техніка, де зловмисники маніпулюють HTTP-параметрами, щоб змінити поведінку веб-додатку ненавмисними способами. Ця маніпуляція здійснюється шляхом додавання, модифікації або дублювання HTTP-параметрів. Ефект цих маніпуляцій не є безпосередньо видимим для користувача, але може суттєво змінити функціональність додатку на стороні сервера, з помітними наслідками на стороні клієнта.
URL транзакції банківського додатку:
Оригінальний URL: https://www.victim.com/send/?from=accountA&to=accountB&amount=10000
Вставивши додатковий параметр from
:
Маніпульований URL: https://www.victim.com/send/?from=accountA&to=accountB&amount=10000&from=accountC
Транзакція може бути неправильно зарахована на accountC
замість accountA
, демонструючи потенціал HPP для маніпуляції транзакціями або іншими функціональностями, такими як скидання пароля, налаштування 2FA або запити API-ключів.
Спосіб, яким параметри обробляються та пріоритизуються, залежить від основної веб-технології, що впливає на те, як HPP може бути використано.
Інструменти, такі як Wappalyzer, допомагають ідентифікувати ці технології та їх поведінку при обробці.
Ситуація з маніпуляцією OTP:
Контекст: Механізм входу, що вимагає одноразового пароля (OTP), був використаний.
Метод: Перехопивши запит OTP за допомогою інструментів, таких як Burp Suite, зловмисники дублювали параметр email
у HTTP-запиті.
Результат: OTP, призначений для початкової електронної пошти, був надісланий на другу електронну адресу, вказану в маніпульованому запиті. Ця вразливість дозволила несанкціонований доступ, обійшовши заплановану міру безпеки.
Цей сценарій підкреслює критичну помилку в бекенді додатку, який обробляв перший параметр email
для генерації OTP, але використовував останній для доставки.
Ситуація з маніпуляцією API-ключем:
Сценарій: Додаток дозволяє користувачам оновлювати свій API-ключ через сторінку налаштувань профілю.
Вектор атаки: Зловмисник виявляє, що, додавши додатковий параметр api_key
до POST-запиту, він може маніпулювати результатом функції оновлення API-ключа.
Техніка: Використовуючи інструмент, такий як Burp Suite, зловмисник формує запит, що містить два параметри api_key
: один легітимний і один шкідливий. Сервер, обробляючи лише останнє входження, оновлює API-ключ на значення, надане зловмисником.
Результат: Зловмисник отримує контроль над функціональністю API жертви, потенційно отримуючи доступ або модифікуючи приватні дані без дозволу.
Цей приклад ще раз підкреслює необхідність безпечного оброблення параметрів, особливо в таких критичних функціях, як управління API-ключами.
Спосіб, яким веб-технології обробляють дубльовані HTTP-параметри, варіюється, що впливає на їх вразливість до атак HPP:
Flask: Приймає перше значення параметра, наприклад, a=1
у рядку запиту a=1&a=2
, пріоритизуючи початковий екземпляр над наступними дублікатами.
PHP (на Apache HTTP Server): Навпаки, пріоритизує останнє значення параметра, вибираючи a=2
у наведеному прикладі. Ця поведінка може ненавмисно сприяти експлуатації HPP, визнаючи маніпульований параметр зловмисника замість оригінального.
Результати були взяті з https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89
Ігноруйте все після %00 у назві параметра.
Обробляйте name[] як масив.
_GET не означає метод GET.
Вибирайте останній параметр.
Використовує роздільники & та ; для розділення параметрів.
Не розпізнає name[].
Вибирає перший параметр.
POST RequestMapping == PostMapping & GET RequestMapping == GetMapping.
POST RequestMapping & PostMapping розпізнають name[].
Вибирайте name, якщо існують name та name[].
Конкатенуйте параметри, наприклад, first,last.
POST RequestMapping & PostMapping розпізнають параметри запиту з Content-Type.
Розпізнає name[].
Конкатенує параметри, наприклад, first,last.
НЕ розпізнає name[].
Вибирайте перший параметр.
НЕ розпізнає name[].
Вибирайте перший параметр.
НЕ розпізнає name[].
Вибирайте останній параметр.
НЕ розпізнає name[].
Вибирайте останній параметр.
Фронт-енд може вірити першій появі, тоді як бекенд використовує другу появу ключа.
Деякі символи не будуть правильно інтерпретовані фронт-ендом, але бекенд їх інтерпретує та використовує ці ключі, це може бути корисно для обходу певних обмежень:
Зверніть увагу, як у цих випадках фронтенд може вважати, що test == 1
, а бекенд буде вважати, що test == 2
.
Це також можна використовувати для обходу обмежень значень, таких як:
Тут ми використаємо серіалізатор з кожного парсера, щоб переглянути його відповідний вихід.
Серіалізатор 1 (наприклад, бібліотека GoJay для GoLang) створить:
description = "Дублювати з коментарями"
test = 2
extra = ""
Серіалізатор 2 (наприклад, бібліотека JSON-iterator для Java) створить:
description = "Дублювати з коментарями"
extra = "/*"
extra2 = "*/"
test = 1
Альтернативно, просте використання коментарів також може бути ефективним:
Бібліотека GSON Java:
Бібліотека simdjson для Ruby:
Число
може бути декодовано в кілька представлень, включаючи:
Які можуть створити невідповідності
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)