28 nov 2012

Cross Site Request Forgery: Qué es, para que sirve y como protegerlo

Buenas a todos, en Flu Project hemos hablado largo y tendido acerca de las vulnerabilidades de tipo web y de como explotarlas (incluso les hemos dedicado un reto hacking), pero hasta ahora nunca habiamos hablado de las vulnerabilidades de tipo CSRF (Cross Site Request Foregery).

CSRF es una vulnerabilidad web, quizás no tan conocida como las inyecciones SQL Injection o XSS, pero igualmente importante, que permite que un atacante realice peticiones en nombre de otro (víctima), gracias a que la aplicación web desconoce si la petición es realizada voluntariamente por el usuario o por un ataque CSRF.

Vamos a verlo con un ejemplo sencillo y con el que muchos estaréis familiarizados.

Imaginaros un blog en el que se encuentra un usuario autenticado. Para salir del blog utiliza un botón de desconexión que internamente llama a una función de logout como la siguiente:

http://www.miweb.com/logout.php

Si un usuario malicioso llegase a engañar al usuario victima para que ejecute el link camuflado con un phising en una imagen cualquiera por ejemplo o mediante ingeniería social, lograría que el usuario desconectase su sesión:

<img src="http://www.miweb.com/logout.php">

Este ejemplo que acabamos de ver es inofensivo, pero dependiendo del código introducido podremos ejecutar ordenes más jugosas en nombre de otro. Si unimos además esta vulnerabilidad a otras como los XSS las posibilidades se incrementan.

Para prevenirnos de los ataques CSRF deberíamos seguir las siguientes recomendaciones:
  • Filtrados iguales a los de las vulnerabilidades de tipo Cross-Site Scripting (XSS)
  • Uso de tokens aleatorios unicos en cada sesión (muy importante).
  • Re-autenticación en formularios en los que se traten datos sensibles

Un ejemplo práctico para filtrar esta vulnerabilidad en .Net podría ser el siguiente, en el que al cargar la página de inicio se proporciona un ID que será verificado a la vuelta del formulario para verificar si la acción es legítima o no:

void Page_Init(object sender, EventArgs e){ViewStateUserKey = Session.SessionID;}
Eso es todo por hoy, próximamente continuaremos con el mundo de las vulnerabilidades webSaludos!

2 comentarios:

  1. Una cosa que hay que tener en cuenta a la hora de añadir tokens, es que éstos no se pasen vía GET, porque si no puede ser cazado, y el CSRF seguiría existiendo. Un saludo.

    ResponderEliminar
  2. [...] Cross Site Request Forgery: Qué es, para que sirve y como protegerlo [...]

    ResponderEliminar