Express Prototype Pollution Gadgets
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Для отримання додаткової інформації перегляньте оригінальне дослідження
В додатку Express, що використовує JSON content type response і відображає JSON:
У цих випадках XSS зазвичай не можливий з типом вмісту JSON. Однак, з забрудненням прототипу ми можемо заплутати Express, щоб він повертав HTML-відповідь. Ця вразливість залежить від використання додатком res.send(obj)
та використання парсера тіла з типом вмісту application/json.
Шляхом забруднення body
та _body
властивостей, можливо змусити Express віддавати HTML тип контенту та відображати властивість _body
, що призводить до збереженого XSS.
Можливо змусити express відображати UTF-7 контент за допомогою:
Наступний PP зробить атрибути всередині JSON з додатковим пробілом, що не зламає функціональність:
Тоді відображений JSON виглядатиме так:
Наступний PP гаджет змусить сервер надіслати HTTP заголовок: Access-Control-Expose_headers: foo
Це вимагає, щоб модуль CORS був встановлений
З наступним payload можливо сховати метод з відповіді OPTIONS:
Можливо змінити код статусу, що повертається, використовуючи наступний PP payload:
Коли ви призначаєте прототипу примітив, наприклад, рядок, це призводить до операції без дії, оскільки прототип має бути об'єктом. Якщо ви намагаєтеся призначити об'єкт прототипу самому Object.prototype
, це викине виключення. Ми можемо використовувати ці дві поведінки, щоб виявити, чи була успішною забрудненість прототипу:
Коли додаток включає об'єкт у свою відповідь, створення атрибута з незвичайною назвою поряд з __proto__
може бути корисним. Зокрема, якщо лише незвичайний атрибут повертається у відповіді, це може вказувати на вразливість додатка:
Крім того, у сценаріях, де використовується бібліотека Lodash, встановлення властивості як через забруднення прототипу (PP), так і безпосередньо в об'єкті пропонує ще один діагностичний підхід. Якщо така властивість відсутня у відповіді, це свідчить про те, що Lodash перевіряє наявність властивості в цільовому об'єкті перед злиттям:
Є опція в Express, яка дозволяє вам створювати об'єкти з параметрів рядка запиту. Ви безумовно можете використовувати це в ланцюжку помилок для експлуатації вразливості забруднення прототипу.
?foo.bar=baz
створює об'єкт у Node.
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)