¿Por qué se puede prevenir el ataque CSRF mediante la emisión de tokens CSRF?

2

La forma común de evitar solicitudes de CSRF: cada vez que el usuario carga una página que contiene un formulario para POSTAR, se le emite un token de CSRF que se supone que es desconocido para los sitios de terceros potencialmente malintencionados. El token se emite como una cookie y como un campo oculto <form> . El cliente debe autenticar cada solicitud POST colocando un token CSRF válido en el cuerpo de la solicitud y presentando una cookie válida.

Digamos que el usuario ha iniciado sesión en example.com y, en otra pestaña, busca en evil.com ; y evil.com quiere atacar a example.com/form.html . Entiendo que evil.com puede emitir una solicitud POST a un example.com/form.html y este sitio interpretará esta solicitud POST maliciosa como una solicitud válida proveniente del usuario. Los tokens CSRF previenen este escenario, porque se supone que son desconocidos para evil.com ; no puede enviar el token correcto con su solicitud POST maliciosa, por lo que el servidor example.com rechazará esa solicitud.

Y aquí viene la parte que no entiendo. El token CSRF se emite como una cookie y como un campo de formulario oculto. Para la parte de cookies, esto es trivial: IIUC cada solicitud a example.com contiene automáticamente todas las cookies que vienen de example.com ; por lo tanto, suponiendo que en otra pestaña, el usuario haya iniciado sesión en example.com , la solicitud POST maliciosa contendrá la cookie CSRF válida. ¿Esto es correcto?

Para la parte del campo de formulario oculto, esto se vuelve un poco más complicado, pero no mucho. Evil.com puede emitir un GET XMLHttpRequest para example.com/form.html y esa solicitud será exitosa, ya que el usuario ha iniciado sesión en este sitio en otra pestaña y porque las solicitudes GET no están protegidas por CSRF. En respuesta, evil.com obtiene example.com/form.html fuente HTML, que contiene el <form> en cuestión, que a su vez contiene el campo oculto <input> con el token CSRF. Evil.com ahora puede analizar el documento recibido, extraer el token y agruparlo con su posterior solicitud POST malintencionada para example.com/form.html , y así completar con éxito un ataque CSRF.

¿Qué está mal en mi razonamiento anterior? ¿Qué es lo que no entiendo?

    
pregunta gaazkam 18.05.2018 - 14:25
fuente

1 respuesta

6

Tiene razón en que el navegador enviará la cookie CSRF desde example.com con la solicitud. Sin embargo, debido al Intercambio de recursos de origen cruzado , el script en evil.com no puede leer el token CSRF incrustado en la página web en example.com/form.html .

Por lo tanto, el script en evil.com no puede acceder a la cookie, ya que pertenece a otro dominio. Y no puede leer el token en el formulario, porque el navegador no le permite leer el contenido de la página.

La secuencia de comandos en evil.com podría leer el token en la forma si example.com permitiera el dominio en su encabezado Access-Control-Allow-Origin . Esto significaría que example.com ha incluido explícitamente en la lista blanca evil.com para poder leer el contenido de la respuesta.

    
respondido por el Eelke 18.05.2018 - 14:41
fuente

Lea otras preguntas en las etiquetas