Parameter Pollution | JSON Injection
Tip
Вивчайте та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
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-ключів.
Technology-Specific Parameter Parsing
- Спосіб парсингу та пріоритизації параметрів залежить від базової веб-технології, що впливає на те, як HPP може бути експлуатовано.
- Інструменти на кшталт Wappalyzer допомагають ідентифікувати ці технології та їхню поведінку парсингу.
PHP та HPP: експлуатація
Випадок маніпуляції OTP:
- Контекст: Механізм логіну, який вимагав One-Time Password (OTP), було скомпрометовано.
- Метод: Перехопивши запит OTP за допомогою інструментів на кшталт Burp Suite, атакуючі продублювали параметр
emailу HTTP-запиті. - Наслідок: OTP, призначений для початкового email, був надісланий на другий email, вказаний у зміненому запиті. Ця вразливість дозволила отримати несанкціонований доступ, обходячи передбачений захід безпеки.
Цей сценарій підкреслює критичний недолік на бекенді застосунку, який використав перший параметр email для генерації OTP, але останній — для доставки.
Випадок маніпуляції API Key:
- Сценарій: Застосунок дозволяє користувачам оновлювати свій API key через сторінку налаштувань профілю.
- Вектор атаки: Атакуючий виявив, що, додавши ще один параметр
api_keyдо POST-запиту, він може маніпулювати результатом функції оновлення API key. - Техніка: Використовуючи інструмент на кшталт Burp Suite, атакуючий формує запит із двома параметрами
api_key: одним легітимним і одним зловмисним. Сервер, обробляючи останній екземпляр, оновлює API key на значення, надане атакуючим. - Результат: Атакуючий отримує контроль над API функціоналом жертви, потенційно отримуючи доступ або змінюючи приватні дані без авторизації.
Цей приклад додатково підкреслює необхідність безпечної обробки параметрів, особливо в таких критичних функціях, як управління API key.
Парсинг параметрів: Flask vs. PHP
Спосіб обробки дубльованих HTTP параметрів різниться між технологіями, що впливає на їхню вразливість до HPP:
- Flask: Приймає перше значення параметра, наприклад
a=1у query stringa=1&a=2, віддаючи пріоритет першому екземпляру над наступними. - PHP (на 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всередині згенерованих посилань або дій форм.
Server-Side Parameter Pollution (SSPP) у внутрішніх API
Деякі застосунки вбудовують введені користувачем дані у серверні запити до internal APIs. Якщо ці дані неналежним чином екодовані, ви можете інжектувати або перевизначити параметри у внутрішньому запиті. Тестуйте будь-яке введення користувача, включно з query параметрами, полями форм, заголовками та параметрами шляху URL.
Поширені перевірки:
- Додати новий параметр з
%26(URL-encoded&). - Відсікнути downstream query з
%23(URL-encoded#). - Перевизначити існуючий параметр шляхом його дублювання.
Example:
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[] як масив .
- _GET не означає GET Method .
- Віддає перевагу останньому параметру .
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: Усікання символів та коментарі
Деякі символи не будуть правильно інтерпретовані на frontend, але backend їх інтерпретує та використовуватиме ці ключі; це може бути корисно для bypass certain restrictions:
{"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": */}
Тут ми використаємо serializer кожного parser-а, щоб побачити їх відповідний вихід.
Серіалізатор 1 (наприклад, GoLang’s GoJay library) виведе:
description = "Duplicate with comments"test = 2extra = ""
Серіалізатор 2 (наприклад, 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"*/}
Бібліотека GSON для Java:
{ "description": "Comment support", "test": 1, "extra": "a" }
Бібліотека simdjson для Ruby:
{ "description": "Comment support", "test": 2, "extra": "a", "extra2": "b" }
Непослідовний пріоритет: Deserialization vs. Serialization
obj = {"test": 1, "test": 2}
obj["test"] // 1
obj.toString() // {"test": 2}
Float та 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
-
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)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.


