Client-side prototype pollution in third-party libraries
Laboratorio de Portswigger sobre Prototype Pollution
Certificaciones
- eWPT
- eWPTXv2
- OSWE
- BSCP
Descripción
En este laboratorio es posible explotar un DOM XSS a través de un prototype pollution en el lado del cliente. Esto se debe a un gadget presente en una librería de terceros, que es fácil pasar por alto debido a que el código fuente está minificado. Aunque técnicamente es posible resolver este laboratorio de forma manual, es recomendable utilizar DOM Invader, ya que nos ahorrará una cantidad considerable de tiempo y esfuerzo
Resolución
Al acceder a la web vemos esto
Lo primero que vamos a hacer es intentar inyectar una propiedad arbitraria a través de la cadena de consulta
1
https://0aeb0038032f073c815612f4002600ff.web-security-academy.net/?__proto__[foo]=bar
Lo siguiente que vamos a hacer es abrirnos la consola del navegador e inspeccionar el Object.prototype para ver si lo hemos contaminado correctamente con la propiedad arbitraria. Como podemos ver, no hemos conseguido contaminar la propiedad
No pasa nada si esto pasa, ya que hay diferentes formas de contaminar el prototipo. He probado esta forma alternativa de contaminar el prototipo, y tampoco ha funcionado
1
https://0aeb0038032f073c815612f4002600ff.web-security-academy.net/?__proto__.foo=bar
Cuando abrimos la consola por primera vez es curioso que nos aparezca un texto que dice Hash Changed
Si seleccionamos una categoría el hash cambia
De esto se encarga esta función que se encuentra en el archivo store.js
He inspeccionado los archivos js y no he visto que ningún tipo de sanitización en ninguno. Por lo tanto, al no encontrar nada de esta forma vamos a usar el Dom Invader para ver si encontramos al interesante. Para ello, lo primero es pulsar en Open browser en Burpsuite y posteriormente habilitar el Dom Invader
Abrimos las herramientas de desarrollador y nos dirigimos a la pestaña DOM Invader. Ahí vemos que se han detectado dos formas de envenenar el prototipo
Para comprobar que se ha envenenado el prototipo realmente podemos pulsar en Test
Si queremos ver solo el valor de la propiedad testproperty podemos hacerlo así
Lo que vamos a hacer ahora es buscar gadgets, podemos hacerlo pulsando en el botón que vimos anteriormente que decía Scan for gadgets pero yo prefiero hacerlo de esta forma. Tenemos que hacer click sobre el engranaje
Una vez estemos aquí, tenemos que habilitar la checkbox que dice Scan for gadgets is on. Posteriormente pulsamos en Save y en Reload
Una vez hecho esto, DOM Invader empezará a buscar gadgets
En caso de encontrar algún gadget saldrá este mensaje
Los resultados se muestran en la pestaña DOM Invader
En este caso tenemos suerte y DOM Invader nos hace la explotación haciendo click en el botón Exploit. Sin embargo, hay otras situaciones en las que no aparece esta opción y tenemos que hacer esto manualmente. Al pulsar en Exploit, vemos que se ha explotado correctamente la vulnerabilidad porque nos sale un alert
Para completar este laboratorio debemos URL decodear el payload, sustituir alert(1) por alert(document.cookie), pegarlo en el Exploit server y pulsar sobre Deliver exploit to victim

















