Un token CSRF (Cross-Site Request Forgery) es una medida de seguridad utilizada en aplicaciones web para prevenir ataques CSRF. Un ataque CSRF ocurre cuando un atacante engaña a un usuario autenticado para que realice acciones no deseadas en una aplicación web en la que el usuario tiene una sesión activa. Para prevenir esto, se utiliza un token CSRF, que es un valor único generado por el servidor y asociado a la sesión del usuario.
El token debe ser único por sesión de usuario y debe tener un valor complejo y variable para que sea difícil de adivinar por un atacante.
Índice
Ejemplo de ataque CSRF
Supongamos que tienes una cuenta bancaria en línea y que, cuando estás autenticado en tu cuenta, puedes realizar transferencias de fondos. Además, la aplicación web no implementa protección contra CSRF, es decir, no utiliza tokens CSRF. NO está protegida.
1.- El atacante crea una página web maliciosa y la publica en un sitio web o la envía a la víctima a través de un correo electrónico o mensaje.
2.- La víctima, que ya ha iniciado sesión en su cuenta bancaria, visita la página maliciosa sin darse cuenta de que es perjudicial.
3.- La página maliciosa contiene una solicitud para realizar una transferencia de fondos en la cuenta de la víctima, utilizando la información de la sesión de la víctima. La solicitud podría verse así:
form action=»https://banco.com/transferir» method=»post»>
<input type=»hidden» name=»destinatario» value=»cuentaDelAtacante» />
<input type=»hidden» name=»cantidad» value=»1000″ />
<input type=»submit» value=»Hacer Transferencia» />
</form
Cuando la víctima carga la página maliciosa, su navegador automáticamente envía la solicitud al banco con las credenciales y la sesión de la víctima. Como la víctima ya está autenticada en el banco, el banco procesa la solicitud y transfiere 1000 unidades de la cuenta de la víctima a la cuenta del atacante.
Este es un ejemplo simplificado, pero ilustra cómo un atacante puede utilizar un ataque CSRF para realizar acciones no autorizadas en nombre de la víctima.
Para evitar este tipo de ataques, las aplicaciones web implementan tokens CSRF, como se mencionó anteriormente, para asegurarse de que las solicitudes solo sean válidas si el token coincide con el valor almacenado en la sesión del usuario.
¿Cómo funciona un token CSRF?
Supongamos el mismo escenario, pero ahora la aplicación implementa tokens csrf.
Los pasos 1 y 2 se repiten pero en el paso 3
3.- La página maliciosa contiene una solicitud para realizar una transferencia de fondos en la cuenta de la víctima, utilizando la información de la sesión de la víctima. La solicitud podría verse así:
<input type=»hidden» name=»destinatario» value=»cuentaDelAtacante» />
<input type=»hidden» name=»cantidad» value=»1000″ />
<input type=»submit» value=»Hacer Transferencia» />
</form>
Lo que ocurre ahora es que la aplicación del banco recibe una petición, pero como no tiene asociada un token csrf de sesión, no la procesa.
Para evitar un ataque CSRF (Cross Site Request Forgery) , las aplicaciones necesitan una forma de determinar si la solicitud HTTP se genera legítimamente a través de la interfaz de usuario de la aplicación. La mejor forma de conseguirlo es mediante un token CSRF.
Una aplicación segura CSRF asigna un token CSRF único para cada sesión de usuario. Estos tokens se insertan dentro de parámetros ocultos de formularios HTML relacionados con operaciones críticas del lado del servidor. A continuación, se envían a los navegadores de los clientes.
Es responsabilidad del equipo de la aplicación identificar qué operaciones del lado del servidor son sensibles por naturaleza. Los tokens CSRF deben formar parte del formulario HTML, no almacenarse en cookies de sesión. La forma más sencilla de añadir un parámetro no predecible es utilizar una función hash segura (por ejemplo, SHA-2) para hacer hash del ID de sesión del usuario. Para garantizar la aleatoriedad, los tokens deben ser generados por un generador de números aleatorios criptográficamente seguro.
Cada vez que un usuario invoque estas operaciones críticas, una petición generada por el navegador debe incluir el token CSRF asociado. Este será utilizado por el servidor de aplicaciones para verificar la legitimidad de la solicitud del usuario final. El servidor de aplicaciones rechaza la solicitud si el token CSRF no coincide con la prueba.
Ejemplo de funcionamiento en un aplicación web del mecanismo de seguridad CSRF Token
Un ejemplo de cómo funciona una aplicación web con un token CSRF (Cross-Site Request Forgery) implica un proceso de autenticación y protección contra ataques CSRF. Imaginemos una aplicación web de banca en línea como escenario:
1.- Inicio de Sesión: Un usuario inicia sesión en su cuenta bancaria en línea a través de una aplicación web. La aplicación genera un token CSRF único (una cadena de caracteres larga y cifrada) y lo almacena en la sesión del usuario.
2.- Generación de Token CSRF: Cuando el usuario inicia sesión o realiza cualquier otra operación que requiere seguridad CSRF, la aplicación web genera un token CSRF único y lo asocia con la sesión activa del usuario. Este token se almacena en una cookie o en una etiqueta oculta en el formulario.
3.- Solicitud de Transferencia: El usuario decide transferir fondos a otra cuenta. Al hacer clic en «Realizar Transferencia», se genera una solicitud HTTP que incluye el token CSRF en el formulario.
4.- Protección CSRF: Antes de procesar la solicitud de transferencia, el servidor de la aplicación web verifica si el token CSRF en la solicitud coincide con el token almacenado en la sesión del usuario. Si hay una coincidencia, la solicitud se considera válida y se procesa. Si no hay una coincidencia, la solicitud se rechaza.
Transferencia Exitosa: Si la solicitud es válida, la transferencia de fondos se completa con éxito. La aplicación informa al usuario sobre la transacción exitosa.
Ataque CSRF Evitado: Si un atacante intenta forjar una solicitud de transferencia en nombre del usuario, no podrá generar un token CSRF válido, ya que el token está asociado con la sesión activa del usuario. Por lo tanto, el ataque CSRF se bloquea y la solicitud no se procesa.
Este ejemplo demuestra cómo el uso de un token CSRF en una aplicación web previene ataques CSRF al asegurarse de que las solicitudes solo sean válidas si incluyen un token que coincide con el valor almacenado en la sesión del usuario. Esto protege al usuario de realizar acciones no deseadas en su nombre y garantiza la seguridad de las operaciones críticas, como las transacciones bancarias en línea.
CSFR Spring Boot
En el contexto de Spring Boot y la seguridad web, CSRF (Cross-Site Request Forgery) es una vulnerabilidad que puede ser explotada si no se toman las medidas adecuadas para proteger una aplicación web.
Spring Boot es un marco de desarrollo de aplicaciones en Java que facilita la creación de aplicaciones web.
La protección contra CSRF en Spring Boot se refiere a la implementación de medidas de seguridad para prevenir ataques CSRF de aplicaciones web desarrolladas en este marco.
Spring Security, que es una parte integral de Spring Boot, proporciona funciones de seguridad web, incluida la protección contra CSRF.
Para habilitar la protección contra CSRF en una aplicación Spring Boot, se pueden usar las siguientes anotaciones:
@EnableWebSecurity
: Esta anotación se utiliza para habilitar la seguridad web en una aplicación Spring Boot.@EnableCsrfTokenValidation
: Esta anotación se utiliza para habilitar la validación de tokens CSRF en la aplicación, lo que significa que Spring Security generará y verificará tokens CSRF automáticamente.
La implementación de la protección CSRF en Spring Boot asegura que las solicitudes HTTP generadas por una aplicación solo sean válidas si incluyen un token CSRF válido. Esto previene eficazmente los ataques CSRF, en los que un atacante intenta aprovechar la autenticación de un usuario para realizar acciones no deseadas en su nombre.