Параметричне забруднення | 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
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
Огляд 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
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*l_Pf2JNCYhmfAvfk7UTEbQ.jpeg
- Ігнорувати все після %00 у назві параметра.
- Обробляти name[] як масив.
- _GET не означає метод GET.
- Віддавати перевагу останньому параметру.
Ruby 3.3.5 та WEBrick 1.8.2
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*kKxtZ8qEmgTIMS81py5hhg.jpeg
- Використовує роздільники & та ; для розділення параметрів.
- Не розпізнає name[].
- Віддає перевагу першому параметру.
Spring MVC 6.0.23 І 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 І name[].
- Конкатенувати параметри, наприклад, first,last.
- POST RequestMapping & PostMapping розпізнають параметри запиту з Content-Type.
NodeJS 20.17.0 І 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 І Werkzeug 3.0.4 І Flask 3.0.3
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*Se5467PFFjIlmT3O7KNlWQ.jpeg
- Не розпізнає name[].
- Віддає перевагу першому параметру.
Python 3.12.6 І Django 4.2.15
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rf38VXut5YhAx0ZhUzgT8Q.jpeg
- Не розпізнає name[].
- Віддає перевагу останньому параметру.
Python 3.12.6 І Tornado 6.4.1
.png)
https://miro.medium.com/v2/resize:fit:1100/format:webp/1*obCn7xahDc296JZccXM2qQ.jpeg
- Не розпізнає name[].
- Віддає перевагу останньому параметру.
JSON-ін'єкція
Дубльовані ключі
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"}
Використання обрізання коментарів
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
Альтернативно, просте використання коментарів також може бути ефективним:
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
Які можуть створити невідповідності
Посилання
- 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
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.