Trouver la pollution du prototype côté client avec DOM Invader | Blog

L’année dernière, nous avons considérablement simplifié la recherche de DOM XSS en introduisant un tout nouvel outil appelé DOM Invader. Cette année, nous avons amélioré DOM Invader pour faciliter la recherche de CSPP (prototype de pollution côté client) en quelques clics. Si vous souhaitez enquêter, trouver et corriger les vulnérabilités du prototype de pollution côté client, vous devriez vraiment continuer à lire – pour découvrir comment DOM Invader vous facilite la vie. Nous avons également créé une autre vidéo YouTube pour vous aider à utiliser les nouvelles fonctionnalités :

Qu’est-ce que la pollution prototype ?

Nous espérons publier dans quelques mois des prototypes de laboratoire sur la pollution côté client sur notre Web Security Academy démontrant le problème, mais pour l’instant, voici ce que vous devez savoir.

La pollution de prototype est une vulnérabilité qui se produit lorsque vous fusionnez un objet avec un objet JSON contrôlé par l’utilisateur. Cela peut également se produire à la suite d’un objet généré à partir de paramètres de requête/hachage, lorsque l’opération de fusion ne nettoie pas les clés. Cela permet à un attaquant d’utiliser des clés de propriété comme __proto__ , ce qui lui permet ensuite de créer des affectations arbitraires à l’Object.prototype (ou à d’autres prototypes globaux). Lorsque cela se produit, on parle de source de pollution prototype. L’exemple de code suivant le montre :

params.replace(/+/g, ' ').split('&').forEach(function(v){
var param = v.split( '=' ),
            key = decodeURIComponent( param[0] ),
            val,
            cur = obj,
            I = 0,
//…
obj[key]=val;
//…
let url = new URL(location);
let params = url.searchParams;
deparam(params.toString())

Pour exploiter la pollution prototype, il faut une source et un gadget. Un gadget prototype de pollution se produit lorsqu’un site utilise une propriété de manière dangereuse sans filtrage. Par exemple, un site peut effectuer les opérations suivantes :

let myObject = {};
if(myObject.html) {
   document.getElementById('myElement').innerHTML = myObject.html;
}

À première vue, il pourrait sembler qu’il n’y a pas de problème ici. L’objet ne contient aucune propriété, mais le moteur JavaScript examinera l’Object.prototype pour la propriété “html” si elle n’existe pas sur l’objet actuel. Cela conduit alors à un prototype de gadget anti-pollution appelé “html”. Voyons ce qui se passe lorsque nous modifions l’Object.prototype :


Cela se traduit par l’utilisation de la propriété Object.prototype.html, au lieu de la propriété “html” de l’objet “myObject”. Un développeur supposera que ces propriétés ne sont pas contrôlées par l’utilisateur et conduisent donc à XSS.

Comment découvrir les sources de pollution des prototypes côté client ?

Si vous voulez que DOM Invader trouve des sources de pollution prototypes, vous devez activer l’option de pollution prototype.

Capture d'écran montrant comment activer la pollution du prototype

Lorsque vous l’avez activé, accédez à un site que vous souhaitez tester. Vous pouvez utiliser l’un de nos cas de test si vous voulez voir comment cela fonctionne. DOM Invader tentera de tester la chaîne de requête, le hachage et les objets JSON envoyés à l’aide d’un message Web et signalera si cela a réussi.

Capture d'écran montrant des prototypes de sources de pollution

Dans ce cas, DOM Invader a trouvé deux sources de pollution prototypes qui se produisent toutes les deux dans la chaîne de requête – indiquées par “en recherche”. Vous pouvez utiliser le bouton “Tester” pour vérifier manuellement la source, ou vous pouvez utiliser le bouton “Rechercher les gadgets” pour découvrir automatiquement les gadgets. Si vous choisissez ce dernier, DOM Invader ouvrira une nouvelle fenêtre et affichera une barre de progression. Une fois la numérisation terminée, il vous montrera les résultats dans le DOM augmenté :

Capture d'écran montrant le résultat de la recherche de gadgets

Dans l’exemple ci-dessus, DOM Invader a découvert un gadget appelé “html”, qui se retrouve dans un récepteur innerHTML. Vous remarquerez qu’un bouton vert “Exploit” est apparu – cela combinera la source découverte avec le gadget et créera automatiquement un prototype d’exploit de pollution.

Si vous souhaitez essayer DOM Invader avec une véritable vulnérabilité CSPP, nous en avons caché une dans notre Gin & Juice Shop ; voyez si vous pouvez l’exploiter!

Trouver des prototypes de pollution sur des sites réels

Comme toujours chez PortSwigger, nous utilisons nos outils pour trouver les vulnérabilités du monde réel – ce faisant, nous avons rencontré de nombreux problèmes que nous pourrions résoudre en améliorant DOM Invader. La première chose qui est devenue évidente lors de la numérisation des gadgets était que nous obtenions beaucoup de bruit provenant d’éviers non intéressants. Pour résoudre ce problème, nous avons décidé de ne montrer que les puits intéressants par défaut. Si vous n’êtes pas satisfait de la valeur par défaut, vous pouvez modifier les sources/puits affichés si vous le souhaitez.

Nous voulions automatiser la découverte de prototypes de sources de pollution et nous avons trouvé que la meilleure façon de le faire était d’utiliser Puppeteer. Nous avons cependant eu un problème, comment éliminer les vulnérabilités de DOM Invader ? Nous pourrions utiliser Puppeteer pour traverser le DOM comme nous l’avons fait pour nos tests automatisés, mais ce serait lent et fastidieux.

Nous avons donc décidé d’ajouter des rappels dans DOM Invader. Les rappels vous permettent d’exécuter JavaScript lorsqu’une source, un récepteur ou un message a été trouvé, ce qui facilite la journalisation des vulnérabilités. Si vous ouvrez à nouveau le rouage de configuration comme avant, vous remarquerez que chaque sous-onglet a un bouton de configuration de rappel. Ce rappel vous permettra d’appeler du JavaScript personnalisé chaque fois qu’un élément a été trouvé, et les données seront transmises au rappel que vous pouvez utiliser :

Capture d'écran montrant le bouton de configuration du rappel du récepteur

Capture d'écran montrant le code de rappel du récepteur

L’utilisation de ces rappels est vraiment puissante, vous pouvez utiliser navigator.sendBeacon ou fetch pour envoyer ces données à un point de terminaison qui enregistre les données. Vous pouvez renvoyer true ou false si vous voulez que DOM Invader affiche les données – cela peut être très utile s’il y a un site bruyant et que vous voulez savoir quelles données atteignent un puits spécifique. Les rappels sont désactivés par défaut, c’est pourquoi ils sont grisés – une fois que vous en modifiez un et que vous cliquez sur Enregistrer, il devient actif. Vous pouvez utiliser le bouton de réinitialisation pour désactiver la fonction de rappel et la ramener à son état par défaut.

J’ai créé un rappel source :

function(sourceDetails, sources) {
   let data = JSON.stringify(sourceDetails);
   let url="http://localhost:8000/log.php";
   fetch(url, {__proto__:null, method: "post", keepalive: true, body: data});
   return true;//return true to log source
}

Cela a envoyé les données à un script PHP qui a enregistré les données. J’ai alors commencé à les tester pour les gadgets. Vous pouvez rechercher des gadgets indépendamment, même si le site n’a pas de source de pollution prototype connue. Pour ce faire, vous devez changer de mode dans le rouage des paramètres de pollution du prototype :

Capture d'écran montrant le rouage des paramètres de pollution du prototype

Capture d'écran montrant comment rechercher des gadgets

Vous remarquerez que DOM Invader essaie de choisir les paramètres optimaux pour l’analyse des gadgets – par exemple, il supprimera les en-têtes de réponse CSP – vous pouvez remplacer ces valeurs par défaut si vous le souhaitez. En utilisant ces techniques, j’ai découvert plusieurs sites vulnérables à la pollution des prototypes côté client, notamment un constructeur automobile bien connu, un site de jeu bien connu, un domaine WordPress majeur et d’autres.

Crédits et remerciements

Comme toujours Bouilloire James a été super utile avec la conception de DOM Invader et a fait l’excellente suggestion d’avoir un bouton “Scan for gadgets” merci James. Merci à Nolan Ward pour les excellents graphismes et le montage vidéo. Il y a eu d’excellentes recherches sur la pollution des prototypes côté client que j’ai trouvées vraiment utiles. grâce à Sergueï BobrovMohan Sri Rama Krishna PTerjanqBeomjin LeeMasato KinugawaNikita StupineRahul MainicJaiswal durMikhaïl EgorovMélar DevaMicha Bentkowskidescripteur de fichierOlivierWilliam QuillesIan Bouchard pour avoir partagé leurs excellents outils et recherches.

Obtenir la nouvelle version de DOM Invader

Pour obtenir la nouvelle version de DOM Invader, mettez simplement à jour votre version de Burp Suite Professional ou Burp Suite Community Edition vers 2022.6 sur le canal Early Adopter pour commencer à l’utiliser.

Leave a Comment

Your email address will not be published.