2011-05-10 14 views
6

Leí muchos q/a en SO sobre el riesgo de la sesión de fijación/secuestro y muchas personas sugieren cambiar las directivas php.ini como session.use_only_cookies a ON y otras directivas php.ini para hacer el servidor más seguro ...Ataque de fijación de sesión simple en localhost con fines de prueba

quería ver con mis ojos si pudiera replicar caso de un ataque sencillo en mi servidor localhost basado en PHP5 + Apache.

En mi localhost session.use_only_cookies es OFF por lo que según el q/a anterior mi localhost está básicamente desprotegido, que es lo que necesito hacer la prueba.

que primero lea este artículo sencilla sobre cómo se desempeñasen un ataque de fijación de sesión:

Con el fin de replicar el escenario descrito en el artículo, creé dos scripts PHP muy simples (código está por debajo), pero el ataque no funciona, esto es lo que hice:

  1. (pretendiendo ser Mallory) yo digo Alice: “hola ir visitar http://localhost/login.php?PHPSESSID=mysessionid

  2. Entonces (pretendiendo ser Alice) fui a http://localhost/login.php?PHPSESSID=mysessionid

  3. Como administrador de mi servidor localhost vi la sesión que se está creando en el disco del servidor (se cerated como un archivo con el nombre sess_ mysessionid), así que pensé: genial, está funcionando !!!

  4. Entonces (pretendiendo ser Alice) Me he registrado en la introducción de “Joe”, como credencial de

  5. registros de Alicia en el país y se le redirige a insession_ok.php, y en este punto (de acuerdo con el artículo de wikipedia arriba) Mallory debe poder ver insession_ok.php también porque él fijó la sesión a mysessionid, pero esto no es cierto, porque cuando Alice inicia sesión se crea una nueva sesión en el servidor sess_vdshg238cnfb4vt7ahpnp1p522, así que no entiendo en este punto cómo se supone que se debe fijar Mallory/secuestrar la sesión, como se explica en el artículo ???


login.php

<?php 
session_start(); 

//if user credentials are ok, let's put him in session 
if(@$_POST['usr'] === 'joe') 
    $_SESSION['in_session'] = TRUE; 

//if user is already logged in, let's redirect him to the account page "insession_ok.php" 
if(isset($_SESSION['in_session'])) 
{ 
    $webpage = 'http://' . $_SERVER['HTTP_HOST'] . '/insession_ok.php';  
    header("Location: " . $webpage, TRUE, 302); 
}  
?> 
<form method="POST" action="login.php"> 
    <input name="usr" type="text"> 
    <input type="submit" value="Submit"> 
</form>  
<script type="text/javascript"> 
    alert(document.cookie); //to view cookies 
</script> 

insession_ok.php

<?php 
session_start(); 
if(@$_SESSION['in_session'] === TRUE) 
    echo "in session ok"; 
else //user is not in session cause he did not login, let's redirect him to login page 
{ 
    $webpage = 'http://' . $_SERVER['HTTP_HOST'] . '/login.php';  
    header("Location: " . $webpage, TRUE, 302); 
} 
?> 

Cualquier pista/idea siempre se aprecia!

Respuesta

6

Esta es la forma en que siempre he usado para probar los ataques de fijación de sesión. Requiere conocimiento del protocolo HTTP, pero si eres lo suficientemente bueno como para mirar la fijación de la sesión, un poco de HTTP no debería asustarte :)

La versión de la sesión de fijación que estoy viendo Aquí está la idea de una computadora pública, en la que vas a una biblioteca, navegas a un sitio como www.myawesomesite.com y, sin iniciar sesión, escribes la identificación de sesión que te asignaron.

A continuación, salga y espere a que alguien inicie sesión en www.myawesomesite.com. Tan pronto como inicien sesión, cambie manualmente la sesión en su computadora a la cookie que se usó en la computadora pública. El servidor luego piensa que usted es el usuario autenticado.

Para probar esto en localhost, podemos usar dos navegadores diferentes para ver el efecto, ya que los navegadores generalmente no comparten cookies.

Éstos son los pasos para hacerlo:

  • abierto Chrome y navegar a localhost. Esto representará la computadora pública. Inspeccione la ID de sesión y anótela. Puede hacerlo utilizando un programa como Fiddler para ver la solicitud o utilizando un complemento como Web Developer para ver las cookies. El valor de la cookie debe ser similar al PHPSESSID=46l11p0vt81ouo2hkt0ck8ij76

  • Abra Firefox y navegue hasta localhost. Esto representará la computadora del atacante. Con el complemento Web Developer, cambie la cookie PHPSESSID al valor que anotó desde Chrome.

  • En Chrome, inicie sesión como Alice. Esto representará la entrada de la víctima.

  • De vuelta en Firefox, haga clic en "Actualizar" o navegue a una página autenticada. Si eres susceptible a una fijación de sesión, entonces deberías haber iniciado sesión como Alice en Firefox, sin pasar por el inicio de sesión.

La solución para esto es simple (como estoy seguro de que has visto). Simplemente llame al session_regenerate_id() tan pronto como un usuario se autentique en su código. Esto invalida cualquier ID de sesión que se usó antes de iniciar sesión y significa que Oscar ahora debe intentar robar su ID de sesión después de iniciar sesión (pero antes de cerrar sesión), lo cual es mucho más difícil de hacer.

1

Además de tener session.use_only_cookies deshabilitado, también debe asegurarse de que no exista actualmente una cookie de ID de sesión válida, ya que PHP preferiría $_COOKIE sobre $_GET. De hecho, la causa de que Alice tenga una ID de sesión diferente después de iniciar sesión probablemente se debe a que Alice ya tiene una cookie válida con una ID de sesión que luego se usa en lugar de la ID de sesión proporcionada a través de la URL. También puede desactivar sus cookies y habilitar session.use_trans_sid para evitar las cookies.

Luego su exploit debería funcionar como se esperaba.

Cuestiones relacionadas