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

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

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

  1. Ігнорувати все після %00 в імені параметра .
  2. Обробляє name[] як масив .
  3. _GET не означає GET Method .
  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: Усікання символів та коментарі

Деякі символи не будуть правильно інтерпретовані на 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 = 2
  • extra = ""

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

Що може спричинити невідповідності

Посилання

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