Параметричне забруднення | JSON-ін'єкція

Reading time: 8 minutes

Параметричне забруднення

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Підтримайте HackTricks

Огляд HTTP Параметричного Забруднення (HPP)

HTTP Параметричне Забруднення (HPP) — це техніка, при якій зловмисники маніпулюють HTTP параметрами, щоб змінити поведінку веб-додатку ненавмисними способами. Ця маніпуляція здійснюється шляхом додавання, модифікації або дублювання HTTP параметрів. Ефект цих маніпуляцій не є безпосередньо видимим для користувача, але може суттєво змінити функціональність додатку на стороні сервера, з помітними наслідками на стороні клієнта.

Приклад HTTP Параметричного Забруднення (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 ключів.

Парсинг параметрів, специфічний для технології

  • Спосіб парсингу та пріоритету параметрів залежить від основної веб-технології, що впливає на те, як HPP може бути використано.
  • Інструменти, такі як Wappalyzer, допомагають ідентифікувати ці технології та їх поведінку при парсингу.

PHP та експлуатація HPP

Ситуація з маніпуляцією OTP:

  • Контекст: Механізм входу, що вимагає одноразового пароля (OTP), був експлуатований.
  • Метод: Перехопивши запит OTP за допомогою інструментів, таких як Burp Suite, зловмисники дублювали параметр email у HTTP запиті.
  • Результат: OTP, призначений для початкової електронної пошти, був надісланий на другу електронну адресу, вказану в маніпульованому запиті. Ця вразливість дозволила несанкціонований доступ, обійшовши заплановану міру безпеки.

Цей сценарій підкреслює критичну помилку в бекенді додатку, який обробляв перший параметр email для генерації OTP, але використовував останній для доставки.

Ситуація з маніпуляцією API ключем:

  • Сценарій: Додаток дозволяє користувачам оновлювати свій API ключ через сторінку налаштувань профілю.
  • Вектор атаки: Зловмисник виявляє, що, додавши додатковий параметр api_key до POST запиту, він може маніпулювати результатом функції оновлення API ключа.
  • Техніка: Використовуючи інструмент, такий як Burp Suite, зловмисник формує запит, що містить два параметри api_key: один легітимний і один шкідливий. Сервер, обробляючи лише останнє входження, оновлює API ключ на значення, надане зловмисником.
  • Результат: Зловмисник отримує контроль над функціональністю API жертви, потенційно отримуючи доступ або модифікуючи приватні дані без дозволу.

Цей приклад ще раз підкреслює необхідність безпечного оброблення параметрів, особливо в таких критичних функціях, як управління API ключами.

Парсинг параметрів: Flask проти PHP

Спосіб, яким веб-технології обробляють дубльовані HTTP параметри, варіюється, що впливає на їх вразливість до атак HPP:

  • Flask: Приймає перше значення параметра, яке зустрічається, наприклад, a=1 у рядку запиту a=1&a=2, надаючи пріоритет початковому екземпляру над наступними дублікатами.
  • PHP (на Apache HTTP Server): Навпаки, надає пріоритет останньому значенню параметра, вибираючи a=2 у наведеному прикладі. Ця поведінка може ненавмисно сприяти експлуатації HPP, визнаючи маніпульований параметр зловмисника замість оригінального.

Параметричне забруднення за технологією

Результати були отримані з https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89

PHP 8.3.11 І 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 та 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 І 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 І 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 І Werkzeug 3.0.4 І Flask 3.0.3

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

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

Python 3.12.6 І Django 4.2.15

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

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

Python 3.12.6 І Tornado 6.4.1

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

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

JSON-ін'єкція

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

ini
obj = {"test": "user", "test": "admin"}

Фронт-енд може вірити першій появі, тоді як бекенд використовує другу появу ключа.

Колізія ключів: Обрізання символів та коментарі

Деякі символи не будуть правильно інтерпретовані фронт-ендом, але бекенд їх інтерпретує та використовує ці ключі, це може бути корисно для обходу певних обмежень:

json
{"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.

Це також можна використовувати для обходу обмежень значень, таких як:

json
{"role": "administrator\[raw \x0d byte]"}
{"role":"administrator\ud800"}
{"role": "administrator""}
{"role": "admini\strator"}

Використання обрізання коментарів

ini
obj = {"description": "Duplicate with comments", "test": 2, "extra": /*, "test": 1, "extra2": */}

Тут ми використаємо серіалізатор з кожного парсера, щоб переглянути його відповідний вихід.

Серіалізатор 1 (наприклад, бібліотека GoJay для GoLang) створить:

  • description = "Duplicate with comments"
  • test = 2
  • extra = ""

Серіалізатор 2 (наприклад, бібліотека JSON-iterator для Java) створить:

  • description = "Duplicate with comments"
  • extra = "/*"
  • extra2 = "*/"
  • test = 1

Альтернативно, просте використання коментарів також може бути ефективним:

ini
obj = {"description": "Comment support", "test": 1, "extra": "a"/*, "test": 2, "extra2": "b"*/}

Бібліотека GSON Java:

json
{ "description": "Comment support", "test": 1, "extra": "a" }

Бібліотека simdjson для Ruby:

json
{ "description": "Comment support", "test": 2, "extra": "a", "extra2": "b" }

Непослідовний пріоритет: десеріалізація проти серіалізації

ini
obj = {"test": 1, "test": 2}

obj["test"] // 1
obj.toString() // {"test": 2}

Float and Integer

Число

undefined
999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999

може бути декодовано в кілька представлень, включаючи:

undefined
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)

Підтримайте HackTricks