Asignación masiva de archivos web
Última actualización
¿Te fue útil?
Última actualización
¿Te fue útil?
Varios frameworks ofrecen funciones de asignación masiva muy útiles para reducir la carga de trabajo de los desarrolladores. Gracias a esto, los programadores pueden insertar directamente un conjunto completo de datos ingresados por el usuario desde un formulario a un objeto o una base de datos. Esta función se suele utilizar sin una whitelist
para proteger los campos de la entrada del usuario. Un atacante podría aprovechar esta vulnerabilidad para robar información confidencial o destruir datos.
La vulnerabilidad de asignación masiva web es un tipo de vulnerabilidad de seguridad en la que los atacantes pueden modificar los atributos del modelo de una aplicación a través de los parámetros enviados al servidor. Al invertir el código, los atacantes pueden ver estos parámetros y, al asignar valores a parámetros críticos desprotegidos durante la solicitud HTTP, pueden editar los datos de una base de datos y cambiar la funcionalidad prevista de una aplicación.
Ruby on Rails es un framework de aplicaciones web que es vulnerable a este tipo de ataques. El siguiente ejemplo muestra cómo los atacantes pueden aprovechar la vulnerabilidad de asignación masiva en Ruby on Rails. Supongamos que tenemos un modelo User
con los siguientes atributos:
El modelo anterior especifica que solo se permite la asignación masiva de los atributos username
y email
. Sin embargo, los atacantes pueden modificar otros atributos alterando los parámetros enviados al servidor. Supongamos que el servidor recibe los siguientes parámetros.
Aunque el modelo User
no indica explícitamente que el atributo admin
es accesible, el atacante puede modificarlo porque está presente en los argumentos. Eludiendo cualquier control de acceso que pueda existir, el atacante puede enviar estos datos como parte de una solicitud POST al servidor para establecer un usuario con privilegios de administrador.
Supongamos que nos encontramos con la siguiente aplicación que cuenta con una aplicación web de Asset Manager. Supongamos también que se nos ha facilitado el código fuente de la aplicación. Al completar el paso de registro, obtenemos el mensaje Success!!
y podemos intentar iniciar sesión.
Después de iniciar sesión, aparece el mensaje Account is pending approval
. El administrador de esta aplicación web debe aprobar nuestro registro. Al revisar el código Python del archivo /opt/asset-manager/app.py
, se muestra el siguiente fragmento.
Podemos ver que la aplicación está verificando si el valor k
está configurado. Si es así, permite al usuario iniciar sesión. En el código a continuación, también podemos ver que si configuramos el parámetro confirmed
durante el registro, se inserta cond
como True
y nos permite omitir el paso de verificación del registro.
En ese caso, lo que deberíamos intentar es registrar otro usuario y probar a configurar el parámetro confirmed
con un valor aleatorio. Con Burp Suite, podemos capturar la solicitud HTTP POST a la página /register
y configurar los parámetros:
Ahora podemos intentar iniciar sesión en la aplicación usando las credenciales new:test
.
La vulnerabilidad de asignación masiva se explotó con éxito y ahora iniciamos sesión en la aplicación web sin esperar a que el administrador apruebe nuestra solicitud de registro.
Para evitar este tipo de ataque, se deben asignar explícitamente los atributos a los campos permitidos o utilizar los métodos de lista blanca que proporciona el marco para comprobar los atributos que se pueden asignar en masa. El siguiente ejemplo muestra cómo utilizar parámetros fuertes en el controlador. User
En el ejemplo anterior, el método user_params
devuelve un nuevo hash que incluye solo los atributos username
y email
, ignorando cualquier otra entrada que el cliente pueda haber enviado. Al hacer esto, nos aseguramos de que solo los atributos permitidos explícitamente puedan modificarse mediante la asignación masiva.
Colocamos el código fuente de la aplicación que acabamos de cubrir en
/opt/asset-manager/app.py
dentro del objetivo de este ejercicio, pero cambiamos el nombre del parámetro crucial. Inicie sesión en el objetivo mediante SSH, vea el código fuente e ingrese el nombre del parámetro que se debe manipular para iniciar sesión en la aplicación web Asset Manager.
Encontramos el puerto 300 abierto, que en principio nos interesa.
Al acceder por el puerto 3000 nos encontramos un panel de registro / login:
Al registrarnos nos da un Success!!
Pero al loguearnos nos dice que tiene que aprobarlo un administrador:
Accedemos por SSH y vemos el contenido del script:
Nos interesa la función login()
:
Podemos ver que la aplicación está verificando si el valor k
está configurado. En el código a continuación, también podemos ver que si configuramos el parámetro active
durante el registro, se inserta cond
como True
y nos permite omitir el paso de verificación del registro.
Vamos a intentar es registrar otro usuario y probar a configurar el parámetro active
con un valor aleatorio. Con Burp Suite, podemos capturar la solicitud HTTP POST a la página /register
y configurar los parámetros:
Ahora podemos iniciar sesión en la aplicación usando las credenciales new:test
, eludiendo la validación: