Vulnerabilità legata alla sessione PHP

7

Sto provando a risolvere una sfida su un CTF, con sessioni PHP. L'obiettivo è rendere check.php echo $_PASSWORD .

Non ho accesso ai file stessi e quindi non posso modificarli.

La mia soluzione proposta è:

  1. Vogliamo bloccare la sessione per 20 secondi, pertanto è necessario eseguire eat.php per un periodo di tempo così lungo.
  2. Allo stesso tempo, dobbiamo eseguire check.php , averlo impostato $time e quindi attendere che la sessione venga sbloccata.
  3. Ora abbiamo bisogno di sbloccare la sessione, il che significa che dobbiamo interrompere eat.php .
  4. check.php continuerà ad essere eseguito, la seguente espressione: $time+20!=$_SESSION['time'] sarà false e PHP eseguirà echo $_PASSWORD .

La mia proposta è possibile? Se lo è, come lo implementeresti? Mi piacerebbe anche conoscere altre direzioni per risolvere questo 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;
?> 
    
posta Roee H 12.06.2016 - 23:01
fonte

1 risposta

1

Potrei sbagliarmi, naturalmente, dato che non conosco la soluzione, ma ecco la mia analisi.

get.php può essere completamente ignorato, poiché puoi creare un valore casuale del valore di id .

Potremmo non avere tutte le informazioni necessarie. Il server esegue Apache o qualcos'altro? Quale versione di PHP è stata utilizzata? Esiste una descrizione per la sfida (contengono spesso suggerimenti oscuri)?

Allo stato attuale, vedo solo due modi realistici di approcciare questo: iniettare dati in quella variabile $_SESSION['time'] , o fare check.php sospendere dopo $time=time(); e prima di $time+20!=$_SESSION['time'] .

Alla ricerca di vulnerabilità di iniezione in PHP, ho trovato solo CVE-2006-3016 (PHP 5.1) ma contiene pochissimi dettagli e dovrebbero comunque eseguire una versione PHP molto vecchia. L'anno scorso anche qualcuno ha segnalato una vulnerabilità di injection injection , ma sembra non essere applicabile. Questa strada non sembra molto fattibile.

Questo lascia il trucco della pausa. Stavo pensando a qualcosa di simile:

  1. Apri molte connessioni e consenti loro di richiedere eat.php con grandi valori di $_POST['cookie'] , in modo da impiegare molto tempo a scrivere tutte le sessioni.
  2. Richiesta check.php , che verrà interrotta fino al completamento del passaggio 1. Varia la quantità di richieste fatte nel passaggio 1 finché non impiegano esattamente 20 secondi.

Ciò richiederebbe al server di eseguire il multithreading, poiché è necessario lasciare check.php in stato di sospensione ed eseguire una serie di richieste di eat.php in background.

Il problema con questo è che ogni eat.php deve scrivere nella stessa sessione, altrimenti non bloccherebbe affatto in check.php (poiché non ci sarebbe thread che blocca la sessione che check.php prova a leggere ). Ma se ogni successivo completamento di eat.php aggiorna il valore $_SESSION['time'] a qualcosa di più recente, non avrà un valore vecchio. Quindi anche questo non funziona. (Potrebbe funzionare se i blocchi PHP su qualsiasi sessione sono ancora scritti, quindi un'altra sessione potrebbe essere aggiornata in eat.php e lasciare ancora check.php in sospeso, ma questo sembra improbabile, quindi non ho esplorata la possibilità.)

In breve, abbiamo bisogno di più informazioni e forse anche di accedere a un ambiente di sfida. Dal mio punto di vista, sembra impossibile senza un'altra vulnerabilità (ad esempio, inviare falsi aggiornamenti NTP).

Per rispondere alla tua domanda

Sì, probabilmente la soluzione proposta funzionerebbe. Solo un problema: come faresti effettivamente a farlo fare questo? ;)

    
risposta data 06.07.2016 - 03:37
fonte

Leggi altre domande sui tag