Ardilla Quio Ardilla Quio

14 de Enero de 2011

Seguridad de las sesiones en PHP: Cross-Site Session Transfer

Cross-Site Session Transfer (transferencia de sesión entre sitios) es un tipo de ataque que, dada su naturaleza, sólo puede darse en servidores compartidos. El ataque se basa en utilizar la sesión creada en una aplicación web en la cuenta del atacante para acceder a una aplicación web (que debe tener una implementación de las sesiones del sistema de autenticación similar) de otro usuario en el mismo servidor.

Es decir, poniendo como ejemplo de aplicación web una tienda virtual (como el osCommerce), un usuario que tenga su tienda virtual en un servidor compartido podría acceder como administrador en su propia tienda y luego utilizar esa sesión para acceder como administrador a la tienda virtual de otro usuario.

Cómo se realiza el ataque

Siguiendo con el ejemplo de la tienda virtual, supongamos que un usuario quiere atacar una tienda virtual alojada en un servidor compartido. Lo primero que debe hacer el atacante es crearse una cuenta en ese servidor compartido e instalarse en ella la tienda virtual. Una vez hecho esto, accederá a la zona de administración con su usuario y contraseña.

Con esto se creará una sesión en el servidor con los datos de ese administrador. A modo de ejemplo pongamos que el identificador de sesión es "31d7bgphebfemb55311b1cger6" y que el dato que guarda en sesión la tienda virtual para comprobar que el usuario está autenticado como administrador es (para simplificar) "admin_logged=true". Entonces, como vimos en el artículo "Sesiones en PHP: qué son y cómo funcionan", el servidor creará en el directorio donde guarda las sesiones (por defecto "/temp") un archivo "sess_31d7bgphebfemb55311b1cger6" con el contenido:

admin_logged=true

Lo siguiente que hace el atacante es crear en su navegador una cookie de sesión para el dominio de la tienda virtual a atacar con nombre "31d7bgphebfemb55311b1cger6". Con esto hecho, accede a la zona de administración de la tienda virtual atacada. Al llegar a este punto, el servidor compartido está recibiendo una petición a la administración de la tienda virtual atacada, en la que el usuario le dice que su sesión es "31d7bgphebfemb55311b1cger6". El servidor va al directorio donde guarda las sesiones y busca el archivo "sess_31d7bgphebfemb55311b1cger6". Como ve que existe, lee su contenido ("admin_logged=true") y se lo pasa a la tienda virtual. El servidor no tiene forma de saber que esa sesión no corresponde a este dominio ya que el directorio de sesiones es común para todos los dominios alojados en el mismo. Con esto, el atacante ya está autenticado como administrador en la tienda virtual objetivo.

Métodos de prevención

Esta vulnerabilidad se puede combatir con los mismos métodos que se combate el robo de sesiones en servidor compartido, es decir, usando las funciones session_save_path o session_set_save_handler para aislar las sesiones de nuestra aplicación web de las del resto del servidor, o, si esto no es posible (o como medida de seguridad adicional), utilizando una "marca de aplicación" en la sesión de esta forma:

if (isset($_SESSION['application']) === false || $_SESSION['application'] !== 'identificador-unico-de-la-aplicacion')
{
	// Denegar el acceso y destruir la sesión
}

1 comentarios

Anónimo

30/10/2013 23:37:50

Muy buena informacion gracias me sirvio mucho n.n

Comentario anónimo
Comentar como usuario