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

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 string a=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

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*l_Pf2JNCYhmfAvfk7UTEbQ.jpeg

  1. Ігнорувати все після %00 в імені параметра .
  2. Обробляє name[] як array .
  3. _GET не означає метод GET .
  4. Надає перевагу останньому параметру .

Ruby 3.3.5 and WEBrick 1.8.2

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*kKxtZ8qEmgTIMS81py5hhg.jpeg

  1. Використовує роздільники & та ; для розбиття параметрів .
  2. Не розпізнає name[] .
  3. Надає перевагу першому параметру .

Spring MVC 6.0.23 AND Apache Tomcat 10.1.30

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*llG22MF1gPTYZYFVCmCiVw.jpeg

  1. POST RequestMapping == PostMapping & GET RequestMapping == GetMapping .
  2. POST RequestMapping & PostMapping розпізнають name[] .
  3. Надає перевагу name, якщо існують і name AND name[] .
  4. Конкатенує параметри, наприклад first,last .
  5. POST RequestMapping & PostMapping розпізнають query parameter з Content-Type .

NodeJS 20.17.0 AND Express 4.21.0

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*JzNkLOSW7orcHXswtMHGMA.jpeg

  1. Розпізнає name[] .
  2. Конкатенує параметри, наприклад first,last .

GO 1.22.7

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NVvN1N8sL4g_Gi796FzlZA.jpeg

  1. Не розпізнає name[] .
  2. Надає перевагу першому параметру .

Python 3.12.6 AND Werkzeug 3.0.4 AND Flask 3.0.3

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*Se5467PFFjIlmT3O7KNlWQ.jpeg

  1. Не розпізнає name[] .
  2. Надає перевагу першому параметру .

Python 3.12.6 AND Django 4.2.15

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rf38VXut5YhAx0ZhUzgT8Q.jpeg

  1. Не розпізнає name[] .
  2. Надає перевагу останньому параметру .

Python 3.12.6 AND Tornado 6.4.1

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*obCn7xahDc296JZccXM2qQ.jpeg

  1. Не розпізнає name[] .
  2. Надає перевагу останньому параметру .

JSON Injection

JSON, XML and YAML Hacking

Дубльовані ключі

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 = 2
  • extra = ""

Серіалізатор 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

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