Express Prototype Pollution Gadgets
Надавати відповіді XSS
Для отримання додаткових відомостей перегляньте оригінальне дослідження
Змінити тип вмісту JSON на HTML
У додатку Express, який використовує тип відповіді JSON та відображає JSON:
У цих випадках XSS зазвичай неможливий з JSON типом вмісту. Однак за допомогою забруднення прототипу ми можемо переплутати Express, щоб він відправив відповідь у форматі HTML. Ця уразливість ґрунтується на тому, що додаток використовує res.send(obj)
та використовує розбірник тіла з типом вмісту application/json.
Забруднюючи властивості body
та _body
, можна змусити Express обслуговувати вміст HTML та відображати властивість _body
, що призводить до збереженого XSS.
Відображення UTF7
Можливо зробити express відображати вміст UTF-7 за допомогою:
Безпечні техніки сканування
Простори JSON
Наступний PP дозволить атрибутам всередині JSON мати додатковий пробіл, який не порушить функціональність:
Потім відображений JSON буде виглядати так:
Відкриті заголовки
Наступний гаджет PP змусить сервер відправити HTTP-заголовок: Access-Control-Expose_headers: foo
Необхідно встановити модуль CORS
Метод OPTIONS
З наступним навантаженням можливо приховати метод від відповіді OPTIONS:
Статус
Можливо змінити повернутий код статусу за допомогою наступного PP вразливості:
Помилка
Коли ви призначаєте прототип з примітивом, таким як рядок, це призводить до операції no-op, оскільки прототип повинен бути об'єктом. Якщо ви намагаєтеся призначити об'єкт прототипу для Object.prototype
самостійно, це призведе до винятку. Ми можемо використовувати ці дві поведінки для виявлення успішності забруднення прототипу:
Відображене значення
Коли додаток включає об'єкт у відповідь, створення атрибуту з незвичайною назвою поряд з __proto__
може бути показовим. Зокрема, якщо у відповіді повертається лише незвичайний атрибут, це може свідчити про вразливість додатка:
Крім того, в сценаріях, де використовується бібліотека, така як Lodash, встановлення властивості як через забруднення прототипу (PP), так і безпосередньо всередині об'єкта, пропонує ще один діагностичний підхід. Якщо така властивість відсутня у відповіді, це свідчить про те, що Lodash перевіряє наявність властивості в цільовому об'єкті перед злиттям:
Різне
Дозвіл крапок
Є опція в Express, яка дозволяє створювати об'єкти з параметрів рядка запиту. Ви звичайно можете використати це в ланцюжку помилок для експлуатації вразливості забруднення прототипу.
?foo.bar=baz
створює об'єкт в Node.
Посилання
Last updated