Vulnerabilidad de Contaminación de Prototipo(Prototype Pollution): Prueba de Concepto y Explicación

    La técnica de ataque conocida como Prototype Pollution se vale de debilidades presentes en la forma en que se implementan los objetos en JavaScript. Este método se emplea para alterar la propiedad "prototype" de un objeto en una aplicación web, brindando al atacante la capacidad de ejecutar código malicioso o manipular la información de la aplicación.

    En el contexto de JavaScript, la propiedad "prototype" se utiliza para definir las características y funciones de un objeto. Los atacantes aprovechan esta particularidad del lenguaje para modificar las características y funciones de un objeto, logrando así tomar el control de la aplicación.

    El ataque de Prototype Pollution se materializa cuando un atacante altera la propiedad "prototype" de un objeto en una aplicación web. Este acto puede llevarse a cabo manipulando datos transmitidos mediante formularios o solicitudes AJAX, o introduciendo código malicioso en el código JavaScript de la aplicación.

    Una vez que el objeto ha sido manipulado, el atacante puede ejecutar código malicioso en la aplicación, manipular datos o incluso tomar el control de la sesión de un usuario. Un ejemplo ilustrativo sería la modificación de la propiedad "prototype" de un objeto de autenticación de usuario para permitir el acceso a una cuenta sin requerir una contraseña.

    Las consecuencias de la explotación del ataque Prototype Pollution pueden ser graves, ya que los atacantes pueden asumir el control de la aplicación o comprometer los datos de los usuarios. Además, debido a que este tipo de ataque se basa en vulnerabilidades en la implementación de objetos en JavaScript, su detección y corrección pueden resultar desafiantes.
    

    JavaScript está basado en prototipos: cuando se crean nuevos objetos, se transfieren las propiedades y los métodos del prototipo "object", que contiene funcionalidades básicas como toString, constructor y hasOwnProperty.


    La herencia basada en objetos le otorga a JavaScript la flexibilidad y eficiencia que los programadores web han apreciado, pero también lo hace vulnerable a la manipulación.

    Los actores maliciosos pueden realizar cambios en toda la aplicación de todos los objetos modificando el objeto, de ahí el nombre de "contaminación prototipo".

    Curiosamente, los atacantes ni siquiera necesitan modificar directamente el objeto; pueden acceder a él a través de la propiedad __proto__ de cualquier objeto JavaScript. Y una vez que realizan un cambio en el objeto, este se aplica a todos los objetos JavaScript en una aplicación en ejecución, incluidos los creados después de la manipulación.



PoC

    
    Para esta prueba de concepto utilizaremo el siguiente laboratorio: SKF-LABS Prototype Pollution

    Abrimos la aplicación, tenemos el panel de resgitro:


Vemos que este usuario no tiene privilegios de administrador y también podemos enviar un mensaje a un administrador.


Si echamos un vistazo al código, vemos que cuando somos admin la propiedad esta en "true", en cambio cuando no pone "false"


Utilizamos el panel que nos da para enviar un mensaje al administrador interceptándolo con burpsuite
 

    La idea es tratar de llegar a ser admin viendo que almacena como objeto.

    La operación merge itera a través del objeto de origen y agregará cualquier propiedad que esté presente en él al objeto de destino.

    Todo lo que tenemos que hacer para modificar su prototipo es proporcionarle datos JSON que tienen el __proto__ como propiedad. Una carga útil común se verá así:


    Si pasamos esta carga útil a la operación de merge sin sanitizar los campos, contaminará/moficara completamente los prototipos de objetos.

Interceptamos la petición de envió de correo



Cambiamos la estructura a JSON y lo acepta


Modificamos y al no tener una propiedad, nuestro usuario la va a heredar, contaminamos el prototipo proporcionando datos JSON como explicamos antes en la propiedad __proto__


Y conseguimos hacernos administrador


    Si creamos otro usuario vemos que el nuevo usuario también tendrá admin establecido en True.

¿Cuál es la solución?


    Si está utilizando una operación vulnerable como la operación de merge que vimos anteriormente, puede solucionarla simplemente evitándola si el nombre de la clave es ___proto___ como el siguiente código.

1 comentario:

  1. Muchísimas gracias por la mención y tomar como ejemplo nuestra máquina, maravilloso articulo y una explicación de 10. Muchas gracias compañero

    ResponderEliminar