Parameter Pollution | JSON Injection
Tip
Вчіться та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вчіться та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вчіться та практикуйте Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Перегляньте повний каталог HackTricks Training для assessment tracks (ARTA/GRTA/AzRTA) і Linux Hacking Expert (LHE).
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 Discord group, telegram group, слідкуйте за @hacktricks_live на X/Twitter, або перегляньте сторінку LinkedIn і YouTube channel.
- Діліться hacking tricks, надсилаючи PRs до репозиторіїв github HackTricks і HackTricks Cloud.
HTTP Parameter Pollution (HPP) — Огляд
HTTP Parameter Pollution (HPP) — це техніка, коли атакуючі маніпулюють HTTP-параметрами, щоб змінити поведінку веб-додатка небажаним чином. Ці маніпуляції виконуються шляхом додавання, модифікації або дублювання HTTP-параметрів. Ефект таких змін не завжди безпосередньо видно користувачеві, але може суттєво змінити функціональність додатка на стороні сервера з помітними наслідками на стороні клієнта.
Приклад HTTP Parameter Pollution (HPP)
URL транзакції банківського додатка:
- Original URL:
https://www.victim.com/send/?from=accountA&to=accountB&amount=10000
Вставивши додатковий параметр from:
- Manipulated URL:
https://www.victim.com/send/?from=accountA&to=accountB&amount=10000&from=accountC
Транзакція може бути помилково списана з accountC замість accountA, що демонструє потенціал HPP для маніпуляцій транзакціями або іншими функціями, такими як скидання пароля, 2FA налаштування або запити API key.
Розбір параметрів залежно від технології
- Спосіб, яким парсяться та пріоритизуються параметри, залежить від базової веб-технології, що впливає на те, як HPP може бути експлуатований.
- Інструменти на кшталт Wappalyzer допомагають ідентифікувати ці технології та їх поведінку при парсингу.
PHP and HPP — Експлуатація
OTP Manipulation Case:
- Context: Механізм входу, що вимагає One-Time Password (OTP), був скомпрометований.
- Method: Перехопивши запит OTP за допомогою інструментів на кшталт Burp Suite, атакуючі продублювали параметр
emailу HTTP-запиті. - Outcome: OTP, призначений для початкового email, був надісланий замість цього на другий email, вказаний у зміненому запиті. Ця вразливість дозволила несанкціонований доступ, обминаючи передбачений контроль безпеки.
Цей сценарій підкреслює критичний недолік у backend-додатку, який використовував перший параметр email для генерації OTP, але останній — для його доставки.
API Key Manipulation Case:
- Scenario: Додаток дозволяє користувачам оновлювати свій API key через сторінку налаштувань профілю.
- Attack Vector: Атакуючий виявив, що додавання додаткового параметра
api_keyдо POST-запиту дозволяє маніпулювати результатом функції оновлення API key. - Technique: Використовуючи інструмент на кшталт Burp Suite, атакуючий формує запит, що містить два параметри
api_key: один легітимний і один шкідливий. Сервер, обробляючи лише останній екземпляр, оновлює API key на значення, вказане атакуючим. - Result: Атакуючий отримує контроль над API-функціоналом жертви, потенційно отримуючи доступ або змінюючи приватні дані без авторизації.
Цей приклад ще раз підкреслює необхідність безпечної обробки параметрів, особливо в таких критичних функціях, як керування API key.
Розбір параметрів: Flask vs. PHP
Спосіб, яким веб-технології обробляють дублікати HTTP-параметрів, відрізняється і впливає на їх вразливість до HPP-атак:
- Flask: приймає перше зустрінуте значення параметра, наприклад
a=1в query stringa=1&a=2, віддаючи пріоритет початковому екземпляру над наступними дублікатами. - PHP (on Apache HTTP Server): навпаки, віддає пріоритет останньому значенню параметра, вибираючи
a=2у наведеному прикладі. Така поведінка може непередбачувано сприяти HPP-експлуатаціям, віддаючи перевагу маніпульованому параметру атакуючого над оригінальним.
HPP Testing Notes (OWASP WSTG)
- HTTP-стандарти не визначають, як інтерпретувати множинні параметри з однаковим іменем, тому поведінка варіюється в різних стеках і компонентах.
- Під час тестування server-side HPP дублюйте кожен параметр у query string або тілі запиту і спостерігайте, чи конкатенує додаток значення, використовує перший/останній або повертає помилку.
- Для client-side HPP інжектуйте URL-encoded
&у відображене значення параметра (наприклад,%26HPP_TEST) і шукайте декодовані вхождення на кшталт&HPP_TESTабо&HPP_TESTвсередині згенерованих посилань або action форм.
Server-Side Parameter Pollution (SSPP) у Internal APIs
Деякі додатки вставляють введені користувачем дані у серверні запити до internal APIs. Якщо цей ввід не кодується належним чином, ви можете інжектувати або перезаписати параметри у внутрішньому запиті. Тестуйте будь-який користувацький ввід, включаючи query parameters, поля форм, headers та URL path parameters.
Поширені проби:
- Додати новий параметр за допомогою
%26(URL-encoded&). - Відсічення downstream query за допомогою
%23(URL-encoded#). - Перезапис існуючого параметра шляхом його дублювання.
Приклад:
GET /userSearch?name=peter%26name=carlos&back=/home
Може призвести до серверного запиту, наприклад:
GET /users/search?name=peter&name=carlos&publicProfile=true
Parameter pollution за технологією
There results were taken from https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89
PHP 8.3.11 AND Apache 2.4.62
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*l_Pf2JNCYhmfAvfk7UTEbQ.jpeg
- Ігнорувати все після %00 в імені параметра .
- Обробляє name[] як array .
- _GET не означає метод GET .
- Надає перевагу останньому параметру .
Ruby 3.3.5 and WEBrick 1.8.2
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*kKxtZ8qEmgTIMS81py5hhg.jpeg
- Використовує роздільники & та ; для розбиття параметрів .
- Не розпізнає name[] .
- Надає перевагу першому параметру .
Spring MVC 6.0.23 AND Apache Tomcat 10.1.30
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*llG22MF1gPTYZYFVCmCiVw.jpeg
- POST RequestMapping == PostMapping & GET RequestMapping == GetMapping .
- POST RequestMapping & PostMapping розпізнають name[] .
- Надає перевагу name, якщо існують і name AND name[] .
- Конкатенує параметри, наприклад first,last .
- POST RequestMapping & PostMapping розпізнають query parameter з Content-Type .
NodeJS 20.17.0 AND Express 4.21.0
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*JzNkLOSW7orcHXswtMHGMA.jpeg
- Розпізнає name[] .
- Конкатенує параметри, наприклад first,last .
GO 1.22.7
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NVvN1N8sL4g_Gi796FzlZA.jpeg
- Не розпізнає name[] .
- Надає перевагу першому параметру .
Python 3.12.6 AND Werkzeug 3.0.4 AND Flask 3.0.3
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*Se5467PFFjIlmT3O7KNlWQ.jpeg
- Не розпізнає name[] .
- Надає перевагу першому параметру .
Python 3.12.6 AND Django 4.2.15
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rf38VXut5YhAx0ZhUzgT8Q.jpeg
- Не розпізнає name[] .
- Надає перевагу останньому параметру .
Python 3.12.6 AND Tornado 6.4.1
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*obCn7xahDc296JZccXM2qQ.jpeg
- Не розпізнає name[] .
- Надає перевагу останньому параметру .
JSON Injection
Дубльовані ключі
obj = {"test": "user", "test": "admin"}
Може статися, що front-end довіряє першому екземпляру, тоді як backend використовує другий екземпляр ключа.
Key Collision: Усікання символів та коментарі
Деякі символи не будуть правильно інтерпретовані front-end, але backend їх інтерпретує і використовуватиме відповідні ключі; це може бути корисно для обходу певних обмежень:
{"test": 1, "test\[raw \x0d byte]": 2}
{"test": 1, "test\ud800": 2}
{"test": 1, "test"": 2}
{"test": 1, "te\st": 2}
Зверніть увагу, як у цих випадках front end може вважати, що test == 1, а backend — що test == 2.
Це також можна використати для обходу обмежень значень, наприклад:
{"role": "administrator\[raw \x0d byte]"}
{"role":"administrator\ud800"}
{"role": "administrator""}
{"role": "admini\strator"}
Використання Comment Truncation
obj = {"description": "Duplicate with comments", "test": 2, "extra": /*, "test": 1, "extra2": */}
Тут ми використаємо серіалізатор кожного парсера, щоб побачити відповідний вихід.
Серіалізатор 1 (e.g., GoLang’s GoJay library) згенерує:
description = "Duplicate with comments"test = 2extra = ""
Серіалізатор 2 (e.g., Java’s JSON-iterator library) згенерує:
description = "Duplicate with comments"extra = "/*"extra2 = "*/"test = 1
Як альтернатива, пряме використання коментарів також може бути ефективним:
obj = {"description": "Comment support", "test": 1, "extra": "a"/*, "test": 2, "extra2": "b"*/}
Бібліотека Java GSON:
{ "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
Що може створювати невідповідності
References
-
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
-
https://portswigger.net/web-security/api-testing/server-side-parameter-pollution
Tip
Вчіться та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вчіться та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вчіться та практикуйте Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Перегляньте повний каталог HackTricks Training для assessment tracks (ARTA/GRTA/AzRTA) і Linux Hacking Expert (LHE).
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 Discord group, telegram group, слідкуйте за @hacktricks_live на X/Twitter, або перегляньте сторінку LinkedIn і YouTube channel.
- Діліться hacking tricks, надсилаючи PRs до репозиторіїв github HackTricks і HackTricks Cloud.


