COMBATIENDO CROSS-SITE REQUEST FORGERY
La técnica llamada falsificación de petición en sitios cruzados, proviene de su nombre en inglés Cross Site Request Forgery (CSRF o XSRF). Este ataque fuerza al navegador web de su víctima, validado en algún servicio (como por ejemplo correo o home banking) a enviar una petición a una aplicación web vulnerable.
Esta aplicación se encarga de realizar la acción elegida a través de la víctima, debido que la actividad maliciosa será procesada en nombre del usuario logueado. Al contrario de los ataques conocidos como Cross Site Scripting (su traducción sería ordenes en sitios cruzados – XSS) los cuales explotan la confianza del usuario para con un sitio particular; el Cross Site Request Forgery explota la confianza que un sitio web tiene en un usuario particular.
¿Por qué puede ser peligrosa la vulnerabilidad CSRF?
Los riesgos que plantea la explotación de CSRF incluyen distintos tipos de actividades ilícitas e indeseadas. Desde el acceso a cuentas privadas de usuarios, pasando por acusar a alguien de acceder a sitios de contenido pedófilo e inclusive, hasta habilitar algún tipo de filtro o regla en el correo electrónico para que todos los correos se reenvíen a otra cuenta. Como vemos la explotación de esto puede conllevar a graves consecuencias.
¿Cómo funciona?
- Para que se pueda llevar a cabo un ataque mediante CSRF, en primera instancia, el atacante debe conseguir vulnerar e ingresar código HTML en un determinado servidor que podemos llamar “A”
- Por otro lado, la víctima establece una conexión legÍtima con una aplicación web en otro servidor, que llamaremos “B”
- La víctima accede a la aplicación web donde se encuentra el código introducido por el atacante
- El navegador de la víctima realiza una petición contra la aplicación del servidor web “B” sin que el usuario se entere
Lo descrito anteriormente sería algo como lo que vemos en el siguiente esquema:
¿Cómo hacer nuestra web segura ante este tipo de ataque?
En este post aprenderemos cómo podemos evitar que nuestra aplicación web sea vulnerable a este tipo de ataque.
Empezaremos viendo una página web vulnerable a este tipo de ataque para entender cómo funciona de forma visual.
Después, nos encargaremos de modificar dicha página web para hacerla segura.
El primer paso será crear nuestro proyecto de aplicación web, al que llamaremos TutorialCSRF.
Escogemos la plantilla de MVC.
Para este ejemplo, crearemos una carpeta dentro de Views, a la que llamaremos CSRF.
Para empezar, vamos a crear una vista de Login que contendrá el formulario para que el usuario inicie sesión. De momento, el formulario lo crearemos sin usar Razor.
LOGIN.CSHTML
El resultado gráfico es el siguiente:
Una vez hecha la parte gráfica del inicio de sesión, procedemos a hacer el controlador, que es que se encargará de crear la sesión para el usuario. La sesión la crearemos en el Post de Login, es decir, cuando el usuario haya pulsado en iniciar sesión después de introducir su nombre y contraseña.
Para añadir un controlador (controller):
Seleccionamos un controlador MVC 5 vacío:
Y le asignamos un nombre. El nombre del controlador debe coincidir con el de la carpeta donde están las vistas, es decir, CSRF, y luego la palabra Controller:
Una vez creado, el código por defecto del controlador es el siguiente:
Vamos a modificarlo para que cumpla con lo necesario para nuestro proyecto:
CSRFCONTROLLER
Podemos borrar el ActionResult de Index, puesto que no vamos a tener ninguna vista que se llame así. Nosotros le vamos añadir el ActionResult para la vista Login, para que funcione. Tendrá el siguiente código en el Get:
Como el Login tiene un formulario a través del cual vamos a enviar los datos para iniciar sesión al pulsar el botón de Iniciar sesión, necesitamos crear un ActionResult para el método Post, donde verificaremos si el usuario tiene permiso para acceder a la página, iniciando la sesión. El código es el siguiente:
Volvemos a la carpeta de Views, ya que vamos a crearnos dos vistas más:
- Una vista para que el usuario pueda escoger los productos que desee comprar. La vista se llamará Productos.cshtml. Un apunte importante es que el usuario sólo podrá comprar productos si ha iniciado sesión previamente. El código para esta vista es el siguiente:
PRODUCTOS.CSHTML
Con este código, la página se vería así:
El código que habría que añadir a CSRFController para que la página Productos funcione es el siguiente:
-
- Método Get:
-
- Método Post:
- Otra vista para que el usuario pueda visualizar el resultado de su compra al pulsar en comprar productos, llamada Compra.cshtml:
COMPRA.CSHTML
El resultado gráfico es el siguiente:
Como vemos, aparece el artículo que hemos seleccionado en la página de Productos. Ya tendríamos la compra realizada. El código que hay que añadir al CSRFController para que funcione es el siguiente:
Una vez realizados los pasos básicos en nuestra página web para poder realizar una compra, creamos otro proyecto dentro de la misma solución. Llamaremos a este proyecto Hacker, ya que será la que realizará el ataque a nuestra página web. Para que el ataque se pueda hacer, es necesario que el usuario haya iniciado sesión en la página web de compras, pues debe estar la sesión abierta.
Para crearlo, pulsamos click derecho sobre la solución y elegimos Add – New Project:
Elegimos un proyecto de tipo MVC como hemos hecho anteriormente:
Y le ponemos el nombre Hacker, de forma que la solución quedaría así, con los dos proyectos:
Imaginemos que llegamos a una página web como esta, teniendo la sesión iniciada en la página web de compras:
Como nos llama la atención, pulsamos en el botón y el hacker podría realizar su ataque en la página web de compras, pues nuestra sesión está iniciada y la página es vulnerable.
Al pulsar en Descargar, habríamos comprado tres artículos, por ejemplo, sin nosotros desearlo, y nos aparecería lo siguiente:
Como podemos observar, la página hacker nos ha redirigido a la página de compras, realizando compras que nosotros no hemos indicado ni deseábamos.
El código de la página web creada por el “hacker” es el siguiente:
Como podemos ver, al crear el formulario, estamos indicando que lo vamos a redirigir a http://localhost:nuestroPuerto/CSRF/Productos, con varios input ocultos que serán los productos que se comprarían sin que nosotros quisiésemos.
Para ver el ataque, debemos ejecutar las dos aplicaciones. Iniciamos sesión en la página web de compras y pulsamos el botón de la página hacker que hemos creado.
Para poder iniciar las dos páginas a la vez en modo Debug en Visual Studio hacemos los siguiente:
- Estando en la pestaña de la vista Productos, pulsamos en el botón de inicio de Visual Studio:
- Sobre el proyecto Hacker, pulsamos click derecho – Debug – Start new instance:
Hasta ahora hemos visto que nuestra página web de compras es vulnerable y podríamos tener problemas.
Vamos a solucionarlo. Es muy sencillo, ya que hay una etiqueta llamada AntiForgeryToken que generará un token, impidiendo el acceso de otros usuarios desde páginas web externas.
Pero, para poder aplicarlo, debemos usar la sintaxis de Razor a la hora de crear nuestro formulario de Productos, quedando de esta forma:
Una vez creado el formulario con Razor y usando la etiqueta AntiForgeryToken, debemos modificar el controlador CSRFController, añadiendo la decoración [ValidateAntiForgeryToken] en el método ActionResult del Post de Productos.
Comprobamos el resultado de haber hecho estas modificaciones. Volvemos a pulsar el botón de la página hacker, habiendo iniciado sesión en nuestra página de compras:
Nos da error porque ahora nuestra página es segura ante ataques Cross Site Request Forgery, de forma que no nos deja acceder a las compras desde una página externa.
Espero que este post os haya sido útil para poder evitar ataques maliciosos en vuestra página web. Muchas gracias.
Autor: David Aguayo Hernández
Curso: Microsoft MCSA Web Applications + Microsoft MCSD App Builder + Xamarin
Centro: Tajamar
Año académico: 2017-2018
Código en Github: Github
Linkedin: David Aguayo