Cross-Site Request Forgery (CSRF)
Descripción
Cross-Site Request Forgery (CSRF) es un ataque que obliga a un usuario final a ejecutar acciones no deseadas en una aplicación web en la que está actualmente autenticado. Con un poco de ayuda de ingeniería social (como enviar un enlace por correo electrónico o chat), un atacante puede engañar a los usuarios de una aplicación web para que ejecuten acciones de su elección. Si la víctima es un usuario normal, un ataque CSRF exitoso puede obligar al usuario a realizar solicitudes de cambio de estado, como transferir fondos, cambiar su dirección de correo electrónico, etc. Si la víctima es una cuenta administrativa, CSRF puede comprometer toda la aplicación web.
Mitigación
Para prevenir los ataques CSRF, los desarrolladores de aplicaciones web deben implementar medidas de seguridad adecuadas, como la inclusión de tokens CSRF en los formularios y solicitudes HTTP. Estos tokens CSRF permiten que la aplicación web verifique que la solicitud proviene de un usuario legítimo y no de un atacante malintencionado.
Explotación
A continuación tenemos un portal en donde accederemos con las siguientes credenciales:
1
alice:seedalice
Para demostrar un ejemplo de explotación de Cross-Site Request Forgery (CSRF) editaremos el perfil de nuestra cuenta e interceptaremos la petición con Burpsuite.
Al interceptar el request con burpsuite podemos notar lo siguiente:
En el cuerpo del requetes se transmite data con los siguientes valores:
- __elgg_token
- __elgg_ts
- guid
Los cuales al parecer corresponden a un indicador único que posee cada usuario. Para corrocoroborar que tenemos un CSRF presente, seguiremos los siguientes pasos:
Enviaremos nuestro request al repeater, daremos clic derecho en el request y seleccionaremos en Change request method (solo por comodidad).
Realizaremos un drop a la petición anterior y nos dirigiremos nuevamente a la configuración del perfil.
Podemos observar que el nombre mostrado aún corresponde a ‘Alice’, ahora, si nos vamos al request que tenemos en nuestro repeater en donde cambiamos el nombre de usuario a ‘Gohanckz’ y lo enviamos, podremos haber realizado el cambio del perfil sin problemas.
Si nos dirigimos nuevamente a la configuración del perfil y actualizamos el sitio, podremos observar los cambios realizados.
Para llevar a cabo este ejemplo, volveremos a poner el nombre de usuario alice.
Ahora iniciaremos sesión con otra cuenta para aprovecharnos del CSRF y hacer que alice cambie su nombre, tan solo ingresando al link que nosotros le enviaremos desde la cuenta samy.
Iniciamos sesión con las credenciales de samy
1
samy:seedsamy
y luego nos dirigimos a message, para enviar un correo a alice en donde pondremos en la URL de una imagen, el request completo tramitado por GET que se utiliza al momento de cambiar el nombre de usuario.
Ahora, al enviarlo y al volver entrar con la cuenta de alice, podremos ver que al abrir el mensaje de samy, este intenta cargar la imagen desde el request en GET que contiene la petición para el cambio de nombre de la cuenta de usuario.
Ahora al actualizar nuevamente la cuenta de alice, podremos notar los cambios realizados, tan solo al abrir el mensaje.
Con esto podemos cambiar la contraseña, actualzar el perfil, añadir/eliminar un amigo de la plataforma evaluada o realizar alguna acción importante en una cuenta solo formando un Payload con los parámetros vulnerables.