Bueno, dentro de la rama de ataques de sesión se encuentran dos importantes: session fixation y session hijacking. Aunque no me voy a adentrar mucho en el tema a pesar de que muy interesante e importante. Session Fixation o Fijasión de Sesión (rima..), se trata de fijar un ID de sesión que puede ser el mismo que el atacante o impuesto por el mismo. De esta manera el atacante podría tomar el lugar del usuario víctima para realizar alguna clase de acción en un servidor determinado. Por ejemplo, si el código web es el siguiente:
<html><head><title>Session Fixation</title><head>
</body>
<?php
session_start();
if(isset($_SESSION[’usuario’]) && $_SESSION[’usuario’]==”1337″){
echo “Bienvenido usuario: “.$_SESSION[’usuario’];
}else{
header(’Location: http://www.google.com.ar/’);exit;
}
?>
</body></html>
Este es un código simple y hasta absurdo que hice, no lo pude probar pero si hay algún problema avisen me. Como se puede ver al iniciar la sesión con session_start() se checkea si en la cookie existe la variable “usuario” y si en la variable se encuentra el contenido valido, de lo contrario te redirecciona a la pagina www.google.com.ar. Entonces si vemos el contenido de la cookie valida se encuentra la id de la sesión PHP, o sea PHPSESSID, que nos ayuda a identificar al usuario.
Una simple prueba puede ser modificando el código para que primero nos almacene la variable correcta ($_SESSION[’usuario’]=”1337″), y nos identifique como validos. En ese momento, copiamos PHPSESSID y desde otro sistema, browser o borrando las cookies usamos el código original. Al principio nos crea la sesión pero al ver que no es correcta nos redirecciona. En ese momento con la ID creada, la reemplazamos por la valida dándonos como resultado la bienvenida.
Aunque este es un caso muy raro, es una buena introducción para que se entienda de que se trata. Esto también es muy común y peligroso, siendo la característica principal del ataque, cuando se aplican ID’s de sesión mediante URL. Por ejemplo:
http://www.sitiovulnerable.com/login.php?MiID=1337
Con lo que un atacante podría enviar un link a su víctima, mediante ingeniería social, y invocar una nueva o existente ID a su objetivo.
Una forma que estuve analizando es agregar mas variables a la sesion, que al momento de loguearse o llevar acabo una accion se genere. Por ejemplo:
<?php
if($_SESSION[’usuario’]==”1337″ && isset($_SESSION[’valida’])){/* accion */
}else{
header(’Location: http://www.google.com.ar/’);
exit;
}
?>
La idea es agregar mas variables, mientras mas complejas mejor, por ejemplo:
$_SERVER[’otraprueba’]=md5($_SERVER[’REMOTE_ADDR’]);
Siendo “127.0.0.1″ nuestra ip nos daria como resultado: f528764d624db129b32c21fbca0cb8d6. Lo que nos agregaría una prueba casi única de la identidad del usuario. Con la intesión de identificar al usuario hay muchas mas variables que pueden ser agregadas. Pero siempre tratando de que se generen pruebas “únicas”, si tomamos el ejemplo que acabo de dar podemos usar $_SERVER[’REMOTE_HOST’] o $_SERVER[’REQUEST_TIME’].
