Analisi vulnerabilità Wordpress – SQL Column Truncation

Pochi giorni fa è stata scoperta una vulnerabilità molto seria nella piattaforma di blogging Wordpress.
La vulnerabilità è dovuta, oltre ad una mancanza nel codice, ad un problema legato al database in esecuzione per la persistenza dei dati: MySQL.

La vulnerabilità è dovuta ad una “feature” implementata da MySQL per velocizzare i confronti tra le stringhe e ad una soluzione utilizzata per inserire dati troppo estesi per la dimensione della colonna: il troncamento.
Nella configurazione di default viene solamente emesso un warning, che spesso viene ignorato dalle applicazioni che usano il database e quindi non indicano il possibile problema. Utilizzando la configurazione è possibile convertire gli avvisi in errori impostando il SQL mode STRICT_ALL_TABLES, tuttavia questo renderà inutilizzabili quasi tutte le applicazioni web.

Ma vediamo la vulnerabilità…

Per il confronto tra stringhe l’impostazione di default di MySQL non prevede l’uso della modalità binaria e quindi del confronto bit a bit. Vengono infatti utilizzate tecniche più rilassate che effettuano l’operazione di trailing trim sulle stringhe. In pratica scrivere ’software engineer’ e ’software engineer     ‘ è assolutamente lo stesso in un confronto con le impostazioni predefinite.

Inserire un nuovo utente nel sistema comporta ovviamente la rilevazione di eventuali nomi utente già immessi e quindi una query del genere:

SELECT * FROM utente WHERE nomeutente = ‘admin   ‘;

Per il discorso fatto prima il sistema cerca ‘admin’ e la query è equivalente a:

SELECT * FROM utente WHERE nomeutente = ‘admin’;

Ricordiamo però il discorso del troncamento delle stringhe e supponiamo che nomeutente sia di lunghezza massima 8.
Se noi inserissimo il nome utente ‘admin   troncami’, tutti i caratteri che compongono la parola ‘troncami’ verrebbero rimossi e la query risulterebbe equivalente a quanto visto.

Facciamo un passo indietro. Al fine di velocizzare ulteriormente le ricerche su stringhe MySQL controlla prima la lunghezza della stringa inserita con la larghezza della colonna.

Nel nostro caso ‘admin   troncami’ ha lunghezza 16 mentre il campo nomeutente è di dimensione 8. Di conseguenza la query di selezione per controllare se il nome utente inserito sia presente non ha successo ed il sistema procede con l’inserimento.

A questo punto viene eseguita la query di insert:

INSERT INTO utente (nomeutente, password) VALUES (’admin   troncami’, ‘miapassinmd5′);

che però diventa

INSERT INTO utente (nomeutente, password) VALUES (’admin’, ‘miapassinmd5′);

A questo punto ho due utenti admin nel database e posso entrare tranquillamente.

Related Posts with Thumbnails

Popularity: 9%

Share this Post:
Digg Google Bookmarks reddit Mixx StumbleUpon Technorati Yahoo! Buzz DesignFloat Delicious BlinkList Furl

Leave a Reply:

Name (required):
Mail (will not be published) (required):
Website:
Comment (required):
XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Indirizzo per il Trackback