hacktricks/pentesting-web/parameter-pollution.md

16 KiB
Raw Blame History

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
{% endhint %}

{% 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

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

  1. Ігноруйте все після %00 у назві параметра.
  2. Обробляйте name[] як масив.
  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 та name[].
  4. Конкатенуйте параметри, наприклад, first,last.
  5. POST RequestMapping & PostMapping розпізнають параметри запиту з 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

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

Які можуть створити невідповідності

Посилання

{% 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
{% endhint %}