Client Side Prototype Pollution

Apprenez le piratage AWS de zéro à héros avec htARTE (Expert en équipe rouge AWS de HackTricks)!

Autres façons de soutenir HackTricks :

Découverte à l'aide d'outils automatiques

Les outils https://github.com/dwisiswant0/ppfuzz, https://github.com/kleiton0x00/ppmap et https://github.com/kosmosec/proto-find peuvent être utilisés pour trouver des vulnérabilités de pollution de prototype.

De plus, vous pourriez également utiliser l'extension de navigateur PPScan pour analyser automatiquement les pages auxquelles vous accédez à la recherche de vulnérabilités de pollution de prototype.

Débogage de l'utilisation d'une propriété

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

Trouver la cause profonde de la pollution du prototype

Une fois qu'une vulnérabilité de pollution du prototype a été identifiée par l'un des outils, et si le code n'est pas trop complexe, vous pouvez trouver la vulnérabilité en recherchant des mots-clés tels que location.hash, decodeURIComponent, ou location.search dans les Outils de développement Chrome. Cette approche vous permet de localiser la section vulnérable du code JavaScript.

Pour des bases de code plus grandes et plus complexes, une méthode simple pour découvrir le code vulnérable implique les étapes suivantes :

  1. Utilisez un outil pour identifier une vulnérabilité et obtenir une charge utile conçue pour définir une propriété dans le constructeur. Un exemple fourni par ppmap pourrait ressembler à ceci : constructor[prototype][ppmap]=reserved.

  2. Définissez un point d'arrêt à la première ligne de code JavaScript qui s'exécutera sur la page. Actualisez la page avec la charge utile, mettant en pause l'exécution à ce point d'arrêt.

  3. Pendant que l'exécution JavaScript est en pause, exécutez le script suivant dans la console JS. Ce script signalera quand la propriété 'ppmap' est créée, aidant à localiser son origine :

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. Naviguez de nouveau vers l'onglet Sources et sélectionnez "Reprendre l'exécution du script". Le JavaScript continuera à s'exécuter, et la propriété 'ppmap' sera polluée comme prévu. L'utilisation de l'extrait de code fourni facilite l'identification de l'emplacement exact où la propriété 'ppmap' est polluée. En examinant la Pile d'appels, différents empilements où la pollution s'est produite peuvent être observés.

Lorsqu'il s'agit de décider quel empilement enquêter, il est souvent utile de cibler les empilements associés aux fichiers de bibliothèque JavaScript, car la pollution de prototype se produit fréquemment au sein de ces bibliothèques. Identifiez l'empilement pertinent en examinant son lien avec les fichiers de bibliothèque (visible sur le côté droit, similaire à une image fournie à titre indicatif). Dans les scénarios avec plusieurs empilements, comme ceux des lignes 4 et 6, le choix logique est l'empilement de la ligne 4, car il représente l'occurrence initiale de la pollution et donc la cause première de la vulnérabilité. En cliquant sur l'empilement, vous serez dirigé vers le code vulnérable.

Recherche de Gadgets de Script

Le gadget est le code qui sera exploité une fois qu'une vulnérabilité PP est découverte.

Si l'application est simple, nous pouvons rechercher des mots-clés comme srcdoc/innerHTML/iframe/createElement et examiner le code source pour vérifier s'il conduit à l'exécution de JavaScript. Parfois, les techniques mentionnées peuvent ne pas trouver de gadgets du tout. Dans ce cas, une simple revue du code source révèle quelques bons gadgets comme dans l'exemple ci-dessous.

Exemple de recherche de gadget PP dans le code de la bibliothèque Mithil

Consultez cet article : https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/

Recompilation des charges utiles pour les bibliothèques vulnérables

Contournement des filtres HTML via PP

Cette recherche montre les gadgets PP à utiliser pour contourner les sanitizations fournies par certaines bibliothèques de filtres 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>

Références

Apprenez le piratage AWS de zéro à héros avec htARTE (Expert en équipe rouge AWS de HackTricks)!

Autres façons de soutenir HackTricks:

Dernière mise à jour