Secuestro de sesiones en PHP

domingo, 19 de febrero de 2012
El uso de las sesiones en PHP es muy común para construir un sistema de autenticación de nuestros usuarios a cierta parte de nuestro sitio (un panel administrativo, información clasificada, etc).
En los últimos días he estado trabajando para mejorar la seguridad del sistema que actualmente estoy implementando, uno de los aspectos a mejorar es la seguridad en sesiones ($_SESSION).

Como todos saben PHP le asigna a cada sesión un identificador único llamado PHPSESSID, el cual se le es enviado al cliente mediante una cookie, pero del lado de nuestro servidor PHP genera un archivo con nombre de nuestro PHPSESSID, en el cual guarda la información de las variables de la sesión. De forma general así es como PHP maneja nuestras sesiones.


PHPSESSID


Informacion en una cookie:

cookie


Archivo en el servidor:

cookie

Una de las formas para lograr accesos inautorizados a nuestro sistema puede ser por medio del secuestro de la sesión de un usuario actualmente conectado al sistema.

El atacante de alguna forma podría acceder a la cookie (ejemplos aquí), de esta forma podría saber el PHPSESSID que PHP a asignado a nuestro cliente. Con esto la sesión ha sido comprometida y el atacante ahora podría acceder a nuestro sistema sin tener siquiera buscar un nombre de usuario y una contraseña, metiendo nuestra URL y en una cookie el PHPSESSID.Para poder evitar este tipo de accesos indeseados, una de las medidas que he tomado ha sido registrar la IP del cliente al momento de crear la sesión de autorización para nuestro sistema.



session_start();

define(IP_CLIENTE,$_SERVER[‘REMOTE_ADDR’]); //de esta forma siempre veremos la IP del cliente

function login($usuario,$passwd,$conexion)

{

if(trim($usuario)=="" || trim($passwd)=="")

trigger_error("Usuario y/o contraseña inválidos",E_USER_ERROR);

$usuario= mysql_escape_string($usuario);

$SQL=”SELECT idUsuario,Nombre,contrasena FROM usuarios WHERE login='$usuario'”;

$rs=mysql_query($SQL,$conexion);

if($rs)

{
$registro=mysql_fetch_row($rs);

if($registro[2]==$passwd)

{

$_SESSION['IP']=IP_CLIENTE; //Guardamos la IP desde la cual se inicio la session.

$_SESSION['idUsuario']=$registro[0];

$_SESSION['Nombre']=$registro[1];

return true;

}

else

trigger_error("Usuario y/o contraseña inválidos", E_USER_ERROR);

}

}

?>


Esta es una pequeña función que hace el proceso de validación de un usuario para permitirle el ingreso al sistema, si el usuario ha tecleado correctamente su nombre de usuario y contraseña, se registran las variables en SESSION para poder identificarlo por dentro de todo nuestro sistema.


La parte importante de esta función esta en registrar la IP del cliente el cual ha tecleado correctamente la información esto con el fin de verificar si la IP que hace las peticiones de Sesiones coincide con la IP que hemos registrado. Tambien es importante comentar que la definición de IP_CLIENTE habría que colocarla dentro de algun script de PHP el cual sea incluido en todos los demás scripts de nuestro sistema, esto con el fin de que en cada pagina php podamos obtener la IP del cliente que esta accediendo a ella, y asi hacer la validación contra la IP que tenemos registrado en $_SESSION['IP'], si estas no coinciden se tendria que denegar el acceso a la pagina.

Este post lo puse por que creo que este sistema esta implementado en 000webhost cuando te logeas y te dice que te enviara un mail de autentificacion :)

0 comentarios:

Publicar un comentario