Un ataque de falsificación de solicitudes entre sitios (CSRF) explota la lógica generalmente aceptada de los navegadores web para administrar una sesión de usuario en páginas abiertas. El estándar es que un usuario solo puede tener una sesión activa en la aplicación web que está usando actualmente. Cualquier pestaña recién abierta en su navegador utilizará automáticamente las cookies del usuario que ya ha iniciado sesión. El atacante utiliza este hecho con mayor frecuencia enviando a su víctima un enlace especialmente preparado después de hacer clic en qué acción se activará (por ejemplo, cambios de contraseña) en la página donde la víctima tiene una sesión activa.
La protección contra este tipo de ataque es más a menudo mediante la adición de un parámetro especial único e impredecible, al menos por sesión, que se pega como una variable a las solicitudes sensibles (por ejemplo, cambiar la contraseña, agregar un nuevo usuario) y cuya corrección es verificada por el servidor. Un atacante que no conoce el valor de este token no puede generar una solicitud que el servidor no rechazará debido al incumplimiento del token antiCSRF.
En una de las aplicaciones que probé, descubrí la posibilidad de llevar a cabo muchos ataques CSRF. Un ejemplo es preparar una página especialmente diseñada después de escribir que, por el usuario que ha iniciado sesión, se realizará una solicitud de cambio de contraseña en nombre del usuario. El siguiente es el código de esta página, junto con los parámetros que son responsables de proporcionar la nueva contraseña. Tenga en cuenta que la línea seleccionada en la siguiente copia impresa muestra el código que define el campode formulario de entrada donde se define la nueva contraseña.
Una solicitud enviada automáticamente que utiliza sesiones del usuario que entró en la página sustituida tiene el siguiente aspecto:
Host: XXXXX
User-Agent: Mozilla/5.0 (X11; x86_64 Linux; rv:45.0) Gecko/20100101 Firefox/45.0
[...]
-----------------------------70124987214088125821572825923
Content-Disposition: form-data; name="newpassword"
csrf
[...]
En respuesta, la aplicación confirma el cambio de contraseña, que se muestra en la siguiente captura de pantalla: