Herramientas
Ataque CSRF (Cross Site Request Forgery)

Ataque CSRF (Cross Site Request Forgery)

En la actualidad se observan noticias de ataques cibernéticos de filtración de información privada, cuentas de redes sociales de personas populares en el mundo. Los atacantes utilizan técnicas mas complejas y muchas veces pasan desapercibidos por la victima logrando robar estos datos personales.

Por tal razón este post abordará una de los muchos ataques que se presentan en sitios web y como prevenirlos.

La técnica llamada falsificación de petición en sitios cruzados (Cross Site Request ForgeryCSRF”), este tipo de ataque se da cuando el atacante logra que el usuario ejecute una acción de forma no intencionada en una aplicación en la que había iniciado sesión.

Un ejemplo de este tipo de ataque es el siguiente: el atacante puede colocar una página web (o enviar un email) de interés para la victima. Se le pide al usuario que haga clic en un enlace falso, y esta acción activa la solicitud HTTP fraudulenta. Esta solicitud se envía a la entidad bancaria y ejecuta la acción deseada por el atacante. La sesión sigue iniciada y la solicitud es correcta. El servidor no cuenta con ninguna razón para no ejecutar la acción y, en consecuencia, el dinero se transfiere. La victima no se da cuenta de nada hasta que revisa su saldo.

Otro ejemplo que se puede observar es: imitar un sistema de usuarios con su página de inicio de sesión (login.php), un script que valide el inicio y cierre de sesión (validacion.php), y una página que simule un ataque (pagina-maliciosa.html).

Archivo login.php:

La página login.php primero inicia los datos de sesión con _sessiónstart(), después comprueba si el usuario ya está logeado, y si no es así, muestra un formulario de inicio de sesión.

Archivo de validación validacion.php:

El archivo validacion.php inicia los datos de sesión, luego comprueba si existe alguna acción con la que se pueda trabajar. En el caso de iniciaSesion, se realiza una validación de input con el operador ternario de PHP junto con las funciones ctype_alnum() y crypt(). En el caso de cerraSesion, se destruye la sesión. Finalmente se redirige al usuario a login.php.

El archivo malicioso de ejemplo es pagina-maliciosa.html:

Si se visita login.php, e inicia sesión, y después da clic en pagina-maliciosa.html, automáticamente se cierra la sesión aunque no haya hecho clic en el botón de Salir. El navegador envía un Request al servidor para acceder al script validacion.php, esperando que sea realmente una imagen. El script en validacion.php no tiene forma de diferenciar entre un request válido iniciado por el usuario que hace clic en el enlace Salir o que procede de un archivo malicioso.

El archivo pagina-maliciosa.html se puede alojarse en un servidor diferente al que está logeado la victima, y funcionará igual, debido a que la página del atacante está haciendo un petición a nombre del usuario usando la misma sesión que tiene abierta. No importa si el sitio web en el que está logeado este en una red privada, el request se enviá desde la misma dirección IP del usuario, haciendo que sea difícil rastrear la fuente maligna.

Para evitar este tipo de ataques se debería implementar algún tipo de identificador único que luego sea verificado, normalmente se utiliza token. En el ejemplo anterior la modificación seria la siguiente:

y en el archivo validacion.php

Aplicando estas correcciones a los archivos del sistema de inicio de sesión y validación, la página pagina-maliciosa.html no puede cerrar la sesión debido a que se ha agrego un nuevo reto al atacante: lograr adivinar el token aleatorio que se genera.

Para terminar se recomienda estar constantemente atento ante comportamientos extraños y sospechosos. Se debe implementar buenas prácticas de desarrollo y seguridad en los sistemas de información o cualquier sistemas que se genere para consultar datos y con esto se logrará reducir este tipo de ataques.

Bibliografía


https://diego.com.es/ataques-csrf-cross-site-request-forgery-en-php
https://medium.com/@alex.ggperez/qu%C3%A9-es-un-ataque-csrf-79114a42dede
https://www.acens.com/wp-content/images/2015/11/cross-site-request-forgery-wp-Gacens.pdf