Express Prototype Pollution Gadgets

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

Autres façons de soutenir HackTricks:

Servir des réponses XSS

Pour plus de détails consultez la recherche originale

Changer le type de contenu JSON en HTML

Dans une application Express utilisant une réponse de type de contenu JSON et reflétant un JSON:

app.use(bodyParser.json({type: 'application/json'}));
app.post('/', function(req, res){
_.merge({}, req.body);
res.send(req.body);
});

Dans ces cas, XSS n'est généralement pas possible avec un type de contenu JSON. Cependant, avec la pollution de prototype, nous pouvons confondre Express pour servir une réponse HTML. Cette vulnérabilité repose sur l'application utilisant res.send(obj) et utilisant le body parser avec le type de contenu application/json.

{"__proto__":{"_body":true,"body":"<script>evil()"}}

En polluant les propriétés body et _body, il est possible de provoquer Express pour servir le type de contenu HTML et de refléter la propriété _body, ce qui entraîne un XSS stocké.

Rendu UTF7

Il est possible de faire en sorte qu'express rende le contenu UTF-7 avec:

{"__proto__":{"content-type": "application/json; charset=utf-7"}}

Techniques de numérisation sécurisées

Espaces JSON

Le PP suivant fera en sorte que les attributs à l'intérieur d'un JSON aient un espace supplémentaire qui ne cassera pas la fonctionnalité :

{"__proto__":{"json spaces": " "}}

Ensuite, un JSON réfléchi ressemblera à :

{"foo":  "bar"} -- Note the extra space

En-têtes Exposés

Le gadget PP suivant fera en sorte que le serveur renvoie l'en-tête HTTP : Access-Control-Expose_headers: foo

{"__proto__":{"exposedHeaders":["foo"]}}

Il est nécessaire que le module CORS soit installé

Méthode OPTIONS

Avec la charge utile suivante, il est possible de cacher une méthode d'une réponse OPTIONS:

// Original reponse: POST,GET,HEAD

// Payload:
{"__proto__":{"head":true}}

//New response: POST;GET

Statut

Il est possible de changer le code de statut retourné en utilisant la charge utile PP suivante :

{"__proto__":{"status":510}}

Erreur

Lorsque vous attribuez à un prototype une valeur primitive telle qu'une chaîne de caractères, cela produit une opération no-op car le prototype doit être un objet. Si vous essayez d'attribuer un objet prototype à Object.prototype lui-même, cela va lever une exception. Nous pouvons utiliser ces deux comportements pour détecter si la pollution du prototype a réussi :

({}).__proto__.__proto__={}//throws type exception
({}).__proto__.__proto__="x"//no-op does not throw exception

Valeur Réfléchie

Lorsqu'une application inclut un objet dans sa réponse, la création d'un attribut avec un nom inhabituel aux côtés de __proto__ peut être instructive. En particulier, si seul l'attribut inhabituel est renvoyé dans la réponse, cela pourrait indiquer la vulnérabilité de l'application :

{"unusualName":"value","__proto__":"test"}

De plus, dans les scénarios où une bibliothèque comme Lodash est utilisée, définir une propriété à la fois via la pollution de prototype (PP) et directement à l'intérieur de l'objet offre une autre approche diagnostique. Si une telle propriété est omise de la réponse, cela suggère que Lodash vérifie l'existence de la propriété dans l'objet cible avant la fusion :

{"__proto__":{"a":"value1"},"a":"value2","b":"value3"}
// If 'b' is the only property reflected, this indicates prototype pollution in Lodash

Divers

Autoriser les points

Il existe une option dans Express qui vous permet de créer des objets à partir des paramètres de la chaîne de requête. Vous pourriez certainement l'utiliser dans une chaîne de bugs pour exploiter une vulnérabilité de pollution de prototype.

{"__proto__":{"allowDots":true}}

?foo.bar=baz crée un objet dans Node.

Références

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

Autres façons de soutenir HackTricks:

Dernière mise à jour