Nivel Principiante
Imagina que tienes una sesión abierta en tu banco en una pestaña de tu navegador. En otra pestaña, visitas un sitio web malicioso. Si ese sitio web te engaña para que hagas clic en un enlace o en una imagen invisible, podría enviar una petición a tu banco para, por ejemplo, transferir dinero, sin que tú te des cuenta. Como tu sesión ya está abierta, el banco cree que la petición viene de ti. El CSRF es ese engaño, un ataque que obliga a tu navegador a realizar una acción no deseada en un sitio web donde ya has iniciado sesión.
Nivel Intermedio
El CSRF (Cross-Site Request Forgery), o Falsificación de Peticiones en Sitios Cruzados, es un tipo de ataque de seguridad web donde un atacante engaña a un usuario autenticado para que envíe una petición HTTP no deseada a una aplicación web. A diferencia del XSS que inyecta código malicioso en un sitio, el CSRF se aprovecha de la confianza que un sitio web tiene en el navegador del usuario para realizar acciones en su nombre.
La vulnerabilidad reside en el hecho de que las peticiones HTTP no son intrínsecamente seguras y pueden ser forjadas. Un atacante puede crear una petición maliciosa (por ejemplo, una imagen invisible en un sitio web que carga una URL de transferencia de dinero de un banco) y, si el usuario tiene una sesión activa con el banco, el navegador incluirá automáticamente las cookies de sesión en la petición, lo que hace que el banco la procese como una petición legítima.
Nivel Avanzado
Técnicamente, un ataque CSRF se basa en la forma en que los navegadores manejan las cookies. Cuando un usuario se autentica en un sitio web, el servidor le asigna una cookie de sesión. Esta cookie se adjunta automáticamente a todas las peticiones subsecuentes a ese dominio. Un atacante aprovecha esta conducta creando una petición HTTP forjada en un dominio diferente.
Un ejemplo de una petición CSRF podría ser:
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""><img src="https://banco.com/transferencia?monto=1000&destino=atacante"></pre>
Si el usuario visita un sitio web malicioso que contiene este código, su navegador intentará cargar la imagen, y al hacerlo, enviará la petición al banco con las cookies de sesión del usuario, realizando la transferencia sin su consentimiento.
La principal defensa contra el CSRF es el Token de Sincronización del Lado del Servidor (CSRF Token). Se trata de un token único y aleatorio que el servidor genera para cada sesión de usuario y se incluye en cada formulario o petición que modifica el estado del servidor. Cuando el usuario envía la petición, el servidor verifica que el token en la petición coincida con el token almacenado en la sesión del usuario. Dado que un atacante no puede robar este token (ya que está protegido por la política de mismo origen), no puede forjar la petición, y el servidor la denegará. Otra medida de seguridad es el encabezado SameSite en las cookies, que evita que las cookies se envíen a peticiones de dominios cruzados.