Vulnerabilidad de sesión de PHP

7

Estoy tratando de resolver un desafío en un CTF, con sesiones de PHP. El objetivo es hacer que check.php echo $_PASSWORD .

No tengo acceso a los archivos y, por lo tanto, no puedo editarlos.

Mi solución propuesta es:

  1. Queremos que la sesión se bloquee durante 20 segundos, por lo tanto, necesitamos que eat.php se ejecute durante tanto tiempo.
  2. Al mismo tiempo, necesitamos ejecutar check.php , habiéndolo establecido $time y luego esperar a que se desbloquee la sesión.
  3. Ahora necesitamos desbloquear la sesión, lo que significa que debemos detener eat.php .
  4. check.php continuará ejecutándose, la siguiente expresión: $time+20!=$_SESSION['time'] será falsa, y PHP hará eco de $_PASSWORD .

¿Es posible mi propuesta? Si es así, ¿cómo lo implementarías? También me gustaría conocer otras instrucciones para resolver este problema.

get.php:

<?php
setcookie('id',uniqid());
?>

eat.php:

<?php
$cookie=$_POST['cookie'];
session_save_path('/home/mawekl/timetravel/');
session_start();
echo 'You ate: '.htmlspecialchars($cookie);
echo "\n<br>";
$_SESSION['cookie']=$cookie;
$_SESSION['time']=time();
?> 

check.php:

<?php
$cookie=$_COOKIE['id'];
$time=time();
session_save_path('/home/mawekl/timetravel/');
session_start();
if ($cookie!=$_SESSION['cookie'])
    die('Wrong cookie');
if ($time+20!=$_SESSION['time'])
    die('You must eat cookie after 20 seconds from now, but you ate it '.($time-$_SESSION['time']).' seconds ago');
echo $_PASSWORD;
?> 
    
pregunta Roee H 12.06.2016 - 23:01
fuente

1 respuesta

1

Podría estar equivocado, por supuesto, ya que no conozco la solución, pero aquí está mi análisis.

get.php puede ignorarse por completo, ya que puede crear un valor de cookie aleatorio id .

Es posible que no tengamos toda la información necesaria. ¿El servidor ejecuta Apache o algo más? ¿Qué versión de PHP se utilizó? ¿Hay una descripción para el desafío (a menudo contienen sugerencias poco claras)?

Tal como está, veo solo dos formas realistas de abordar esto: inyectar datos en esa variable $_SESSION['time'] , o hacer una pausa check.php después de $time=time(); y antes de $time+20!=$_SESSION['time'] .

Buscando vulnerabilidades de inyección en PHP, solo encontré CVE-2006-3016 (PHP 5.1) pero contiene muy pocos detalles y tendrían que ejecutar una versión PHP muy antigua de todos modos. El año pasado alguien también reportó una vulnerabilidad de inyección de sesión , pero parece que no es aplicable. Esta avenida no parece muy factible.

Esto deja el truco de pausa. Estaba pensando en algo como esto:

  1. Abra muchas conexiones y permita que soliciten eat.php con grandes valores de $_POST['cookie'] para que tarde mucho tiempo en escribir todas las sesiones.
  2. Solicite check.php , que se bloqueará hasta que se complete el paso 1. Varíe la cantidad de solicitudes realizadas en el paso 1 hasta que demore exactamente 20 segundos.

Esto requeriría que el servidor realice subprocesos múltiples, ya que debe dejar a check.php en un estado inactivo y realizar un montón de solicitudes de eat.php en segundo plano.

El problema con esto es que cada eat.php necesita escribir en la misma sesión, o no se bloquearía en absoluto en check.php (ya que no habría ningún hilo bloqueando la sesión que check.php intenta leer ). Pero si cada finalización sucesiva de eat.php actualiza el valor de $_SESSION['time'] a algo más reciente, no tendrá un valor de tiempo antiguo. Así que esto tampoco funciona. (Tal vez podría funcionar si PHP bloquea en la sesión de cualquier que aún se está escribiendo, entonces otra sesión podría actualizarse en eat.php y aún así dejaría a check.php en espera, pero parece poco probable que no haya exploró la posibilidad.)

En resumen, necesitamos más información y quizás incluso acceso a un entorno desafiante. Desde mi perspectiva, parece imposible sin otra vulnerabilidad (por ejemplo, el envío de actualizaciones falsas de NTP).

Para responder a tu pregunta

Sí, su solución propuesta probablemente funcionaría. Solo un problema: ¿cómo se las arreglaría realmente para lograr que haga esto? ;)

    
respondido por el Luc 06.07.2016 - 03:37
fuente

Lea otras preguntas en las etiquetas