16 KiB
Parameter Pollution | JSON Injection
Parameter Pollution
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
{% embed url="https://websec.nl/" %}
HTTP Parameter Pollution (HPP) Overview
HTTP Parameter Pollution (HPP) — це техніка, де зловмисники маніпулюють HTTP-параметрами, щоб змінити поведінку веб-додатку ненавмисними способами. Ця маніпуляція здійснюється шляхом додавання, модифікації або дублювання HTTP-параметрів. Ефект цих маніпуляцій не є безпосередньо видимим для користувача, але може суттєво змінити функціональність додатку на стороні сервера, з помітними наслідками на стороні клієнта.
Example of HTTP Parameter Pollution (HPP)
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-ключів.
Technology-Specific Parameter Parsing
- Спосіб, яким параметри обробляються та пріоритизуються, залежить від основної веб-технології, що впливає на те, як HPP може бути використано.
- Інструменти, такі як Wappalyzer, допомагають ідентифікувати ці технології та їх поведінку при обробці.
PHP and HPP Exploitation
Ситуація з маніпуляцією OTP:
- Контекст: Механізм входу, що вимагає одноразового пароля (OTP), був використаний.
- Метод: Перехопивши запит OTP за допомогою інструментів, таких як Burp Suite, зловмисники дублювали параметр
email
у HTTP-запиті. - Результат: OTP, призначений для початкової електронної пошти, був надісланий на другу електронну адресу, вказану в маніпульованому запиті. Ця вразливість дозволила несанкціонований доступ, обійшовши заплановану міру безпеки.
Цей сценарій підкреслює критичну помилку в бекенді додатку, який обробляв перший параметр email
для генерації OTP, але використовував останній для доставки.
Ситуація з маніпуляцією API-ключем:
- Сценарій: Додаток дозволяє користувачам оновлювати свій API-ключ через сторінку налаштувань профілю.
- Вектор атаки: Зловмисник виявляє, що, додавши додатковий параметр
api_key
до POST-запиту, він може маніпулювати результатом функції оновлення API-ключа. - Техніка: Використовуючи інструмент, такий як Burp Suite, зловмисник формує запит, що містить два параметри
api_key
: один легітимний і один шкідливий. Сервер, обробляючи лише останнє входження, оновлює API-ключ на значення, надане зловмисником. - Результат: Зловмисник отримує контроль над функціональністю API жертви, потенційно отримуючи доступ або модифікуючи приватні дані без дозволу.
Цей приклад ще раз підкреслює необхідність безпечного оброблення параметрів, особливо в таких критичних функціях, як управління API-ключами.
Parameter Parsing: Flask vs. PHP
Спосіб, яким веб-технології обробляють дубльовані HTTP-параметри, варіюється, що впливає на їх вразливість до атак HPP:
- Flask: Приймає перше значення параметра, наприклад,
a=1
у рядку запитуa=1&a=2
, пріоритизуючи початковий екземпляр над наступними дублікатами. - PHP (на Apache HTTP Server): Навпаки, пріоритизує останнє значення параметра, вибираючи
a=2
у наведеному прикладі. Ця поведінка може ненавмисно сприяти експлуатації HPP, визнаючи маніпульований параметр зловмисника замість оригінального.
Parameter pollution by technology
Результати були взяті з https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89
PHP 8.3.11 AND Apache 2.4.62
- Ігноруйте все після %00 у назві параметра.
- Обробляйте name[] як масив.
- _GET не означає метод GET.
- Вибирайте останній параметр.
Ruby 3.3.5 and WEBrick 1.8.2
- Використовує роздільники & та ; для розділення параметрів.
- Не розпізнає name[].
- Вибирає перший параметр.
Spring MVC 6.0.23 AND Apache Tomcat 10.1.30
- POST RequestMapping == PostMapping & GET RequestMapping == GetMapping.
- POST RequestMapping & PostMapping розпізнають name[].
- Вибирайте name, якщо існують name та name[].
- Конкатенуйте параметри, наприклад, first,last.
- POST RequestMapping & PostMapping розпізнають параметри запиту з Content-Type.
NodeJS 20.17.0 AND Express 4.21.0
- Розпізнає name[].
- Конкатенує параметри, наприклад, first,last.
GO 1.22.7
- НЕ розпізнає name[].
- Вибирайте перший параметр.
Python 3.12.6 AND Werkzeug 3.0.4 AND Flask 3.0.3
- НЕ розпізнає name[].
- Вибирайте перший параметр.
Python 3.12.6 AND Django 4.2.15
- НЕ розпізнає name[].
- Вибирайте останній параметр.
Python 3.12.6 AND Tornado 6.4.1
- НЕ розпізнає name[].
- Вибирайте останній параметр.
JSON Injection
Duplicate keys
obj = {"test": "user", "test": "admin"}
Фронт-енд може вірити першій появі, тоді як бекенд використовує другу появу ключа.
Колізія ключів: Обрізання символів та коментарі
Деякі символи не будуть правильно інтерпретовані фронт-ендом, але бекенд їх інтерпретує та використовує ці ключі, це може бути корисно для обходу певних обмежень:
{"test": 1, "test\[raw \x0d byte]": 2}
{"test": 1, "test\ud800": 2}
{"test": 1, "test"": 2}
{"test": 1, "te\st": 2}
Зверніть увагу, як у цих випадках фронтенд може вважати, що test == 1
, а бекенд буде вважати, що test == 2
.
Це також можна використовувати для обходу обмежень значень, таких як:
{"role": "administrator\[raw \x0d byte]"}
{"role":"administrator\ud800"}
{"role": "administrator""}
{"role": "admini\strator"}
Використання обрізання коментарів
{% code overflow="wrap" %}
obj = {"description": "Duplicate with comments", "test": 2, "extra": /*, "test": 1, "extra2": */}
{% endcode %}
Тут ми використаємо серіалізатор з кожного парсера, щоб переглянути його відповідний вихід.
Серіалізатор 1 (наприклад, бібліотека GoJay для GoLang) створить:
description = "Дублювати з коментарями"
test = 2
extra = ""
Серіалізатор 2 (наприклад, бібліотека JSON-iterator для Java) створить:
description = "Дублювати з коментарями"
extra = "/*"
extra2 = "*/"
test = 1
Альтернативно, просте використання коментарів також може бути ефективним:
obj = {"description": "Comment support", "test": 1, "extra": "a"/*, "test": 2, "extra2": "b"*/}
Бібліотека GSON Java:
{"description":"Comment support","test":1,"extra":"a"}
Бібліотека simdjson для Ruby:
{"description":"Comment support","test":2,"extra":"a","extra2":"b"}
Непослідовний пріоритет: десеріалізація проти серіалізації
obj = {"test": 1, "test": 2}
obj["test"] // 1
obj.toString() // {"test": 2}
Float and Integer
Число
999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
може бути декодовано в кілька представлень, включаючи:
999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
9.999999999999999e95
1E+96
0
9223372036854775807
Які можуть створити невідповідності
Посилання
- https://medium.com/@shahjerry33/http-parameter-pollution-its-contaminated-85edc0805654
- https://github.com/google/google-ctf/tree/master/2023/web-under-construction/solution
- https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89
- https://bishopfox.com/blog/json-interoperability-vulnerabilities
{% embed url="https://websec.nl/" %}
{% hint style="success" %}
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Підтримати HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.