solutions - exploit csrf
¿Está comprobando lo suficiente la referencia como para proteger contra un ataque CSRF? (5)
Entre otras cosas, usar el referente no funcionará para los usuarios cuyos navegadores (o proxies corporativos) no envían referencias.
¿Está revisando la referencia lo suficiente para proteger contra un ataque de falsificación de solicitud entre sitios? Sé que el referente puede ser falso, pero ¿hay alguna forma para que el atacante lo haga por el cliente? Sé que los tokens son la norma, pero ¿funcionaría esto?
Esta es una pregunta de hace 3 años con cuatro respuestas diferentes que básicamente dicen lo mismo: seguir la norma, usar tokens, no intente utilizar referer.
Mientras que los tokens todavía se consideran la opción más segura, usar el referer es a menudo mucho más fácil y también bastante seguro. Solo asegúrate de mirar todas las solicitudes PUT / POST / PATCH / DELETE y considera que es un ataque si falta un referer o proviene del dominio equivocado. Muy pocos (si los hay) proxies quitar el referer para este tipo de solicitudes.
Ver también la recomendación de OWASP sobre verificar el encabezado del referer como una protección CSRF:
Comprobando el encabezado del Referer
Aunque es trivial falsificar el encabezado del referer en su propio navegador, es imposible hacerlo en un ataque CSRF. Comprobar el referer es un método comúnmente usado para prevenir CSRF en dispositivos de red integrados porque no requiere un estado por usuario. Esto hace que un referer sea un método útil de prevención de CSRF cuando la memoria es escasa.
Sin embargo, se considera que el control del referer es más débil que la protección CSRF. Por ejemplo, las vulnerabilidades de redireccionamiento abierto se pueden usar para explotar las solicitudes basadas en GET que están protegidas con una verificación de referencia. Cabe señalar que las solicitudes GET nunca deben incurrir en un cambio de estado ya que esto es una violación de la especificación HTTP.
También hay errores de implementación comunes con los controles de referencia. Por ejemplo, si el ataque CSRF se origina en un dominio HTTPS, se omitirá el referer. En este caso, la falta de un referer debe considerarse un ataque cuando la solicitud está realizando un cambio de estado. También tenga en cuenta que el atacante tiene una influencia limitada sobre el árbitro. Por ejemplo, si el dominio de la víctima es "sitio.com", entonces un atacante tiene el exploit CSRF originado en "site.com.attacker.com" que puede engañar a la implementación de un cheque de referencia roto. XSS se puede utilizar para eludir una comprobación de referencia.
La única respuesta correcta es "Entre otras cosas, usar el referente no funcionará para los usuarios cuyos navegadores (o proxies corporativos) no envían referencias". Todas las personas que dicen que los referentes pueden ser falsificados están llenos. No puede falsificar una referencia a menos que tenga control sobre el navegador de la otra persona de alguna otra manera (XSS / Trojan / etc). Si necesita referencias para el uso de la aplicación, son tan eficaces como las fichas CSRF. Solo asegúrese de estar 100% seguro de que su cheque es correcto (por ejemplo, si usa regex, asegúrese de marcar desde el principio "^" del remitente).
No, no es suficiente, es muy fácil para el atacante hacer eso. Para el cliente, como usted pregunta, todo lo que el atacante tiene que hacer es hacer que el usuario haga clic en un enlace creado por él, desde ese punto, se acabó el juego.
El atacante copiará el formulario utilizado en el sitio original y falsificará el resto porque ahora el código está en su propio sitio y luego lo enviará al sitio de la víctima.
Como mencionas en la pregunta, los tokens son la norma cuando se trata de prevenir CSRF
Sigue la norma: usa tokens.
Verificación de la referencia en realidad no hace nada, porque la solicitud proviene de esa página de todos modos! El problema que intenta evitar es que la página se solicite sin que el usuario haga nada; no la página que se está golpeando a sí misma.
Los tokens son la forma de protegerse de esto. Genere uno, almacénelo en la sesión y escríbalo en el HTML; luego, al publicarlo, verifique el que recibe y vea si coincide con el que espera. Si no lo hace, fallas. De cualquier manera, generas un nuevo token después.
También puede ser relevante considerar que esto ensuciará a la gente si tiene varias páginas; por lo que es posible que desee crear un token diferente por página.