Protección CSRF en páginas estáticas

7

Tengo un sitio estático que tiene formularios. Los formularios se envían a un punto final de Rails que captura los datos enviados. El sitio estático y el punto final de Rails están en el mismo dominio, en diferentes subdominios y todo el tráfico está completamente en HTTPS.

Entiendo cómo funciona Rails CSRF para los formularios generados por el servidor. Pero en mi caso, estos formularios están en páginas HTML estáticas. Entiendo que todos los encabezados de solicitud pueden ser falsificados, por lo que no puedo confiar en eso.

Si no es posible encontrar una solución sólida para este escenario, mi última opción sería pasar a los formularios generados por el servidor (lo que quiero evitar por ahora).

Cualquier sugerencia sobre un buen enfoque de esto sería muy bienvenida. O cualquier puntero a un sistema o una biblioteca que ya haga esto.

Podría implementar una comprobación de REFERER en la solicitud POST de HTTPS (en mi caso). ¿Es eso suficiente? ¿No puede ser falsificado?

La hoja de trucos para la prevención de CSRF dice: Aunque es trivial falsificar el encabezado de referencia en su propio navegador, es imposible hacerlo en un ataque CSRF. - No entiendo muy bien esto.

Cualquier ayuda sería muy apreciada.

    
pregunta Akshay Rawat 29.10.2012 - 12:24
fuente

3 respuestas

2

Puedo realizar cualquier solicitud a su servidor, con los encabezados y valores que desee. Por lo tanto, un atacante puede enviarle un paquete muy fácilmente con un remitente que haya elegido. Pero, ¿cómo hiciste esto en un ataque CSRF?

CSRF funciona al enviarte a una página web que controlo, y luego esa página redirige tu navegador a la página web para ejecutar el CSRF. Por ejemplo, podría enviarte (a través de esa página de ataque) a https://example.com/usermgmt.php?action=delete&user=1 , lo que podría hacer que elimines inadvertidamente el ID de usuario 1.

Lo que hace su navegador es configurar el encabezado REFERER (cuando se carga usermgmt.php) de donde sea que venga, por ejemplo, http://malicious.tld . Si usermgmt.php verificara el referente, notaría que no proviene del mismo dominio. Por lo tanto, no puede (de forma predeterminada) falsificar referencias para CSRF.

Una captura aquí son cosas como páginas de inicio de sesión. Considera esto: https://example.com/login.php?returnTo=index.php . Un ataque CSRF solo funciona cuando la víctima ya ha iniciado sesión, de lo contrario, el atacante podría cargar la URL por sí mismo. Y si ha iniciado sesión, es probable que la página de inicio de sesión simplemente lo redireccione directamente a la URL de retorno. Ahora, ¿qué sucede si escribe usermgmt.php?action=delete&userid=1 como la URL de retorno? Redirigirá de login.php a usermgmt.php, y el remitente recibido por usermgmt.php será https://example.com/login.php?returnto=x . Parece totalmente legítimo, pero no lo es.

Además, es posible que algunos navegadores no incluyan una referencia por razones de privacidad, lo que luego rompería el sitio web. No sé de ningún navegador que tenga esta opción (¿"característica"?) Sin instalar un complemento especial, pero nunca se sabe.

Entonces, la mejor solución es usar tokens CSRF, y ciertamente lo haría si usted va a hospedar algo para una audiencia más grande, pero si es para un grupo de usuarios cerrado, probablemente esté de acuerdo con la referencia.     

respondido por el Luc 29.10.2012 - 12:38
fuente
4

Personalmente, no recomiendo usar el encabezado del Referer para detener los ataques CSRF. Tiene dos problemas:

  • Primero, es frágil. Hay una larga historia de ataques en el encabezado del Referer, que involucra (de diversas maneras) exploits en los complementos (por ejemplo, Flash), errores en las API del navegador (por ejemplo, XHR) y redirección. Para ser claros, no estoy diciendo que verificar al Referente necesariamente será inseguro; Solo estoy argumentando que creo que es más frágil y que tendría más confianza en una solución que usa tokens CSRF.

  • En segundo lugar, algunos navegadores y firewalls corporativos bloquean el encabezado del Referer por razones de privacidad, lo que significa que se verá obligado a bloquear usuarios legítimos. Por lo tanto, el encabezado del Referer simplemente no es una buena solución.

En lugar de usar el encabezado del Referer, recomendaría que uses tokens CSRF.

    
respondido por el D.W. 29.10.2012 - 18:32
fuente
-1

Es efectivamente el punto final de tus rieles el que necesita protegerse. Debe diferenciar entre sus páginas estáticas y la página malintencionada de otra persona en Internet.

Estoy de acuerdo en que hacer que el punto final de los rieles verifique la referencia es una forma frágil de autorizar el acceso.

Una posibilidad es que el punto final de los rieles tenga una ruta que no esté protegida por CSRF, y no haga nada, pero permite configurar la cookie de CSRF. Una "forma nula". Todos los sitios estáticos de su dominio pueden golpearlo antes de hacer otras llamadas AJAX.

Presumiblemente, si está utilizando AJAX, está en el mismo dominio, lo que significa que puede ver la cookie. Si ese punto final fuera golpeado desde otro sitio, no obtendrían la cookie porque están en un dominio diferente.

    
respondido por el Scott Smith 11.02.2016 - 19:08
fuente

Lea otras preguntas en las etiquetas