Blind SQL Injection on MS Access
Copyright (C) 2008 Antonio "s4tan" Parata <s4tan@ictsc.it>
Ultimo aggiornamento: 14/03/2008
In questo articolo verra' presentata una metodologia per sfruttare vulnerabilita' di tipo blind sql injection in presenza di database MS Access.
1. Introduzione
Per quel che riguarda il testing da vulnerabilita' di tipo sql injection, esiste gia' l'ottimo
cheat sheet MS Access SQL Injection Cheat Sheet ([1]). Purtroppo quando ci ritroviamo in casi
di vulnerabilita' di tipo blind sql injection ([2]), le cose si mettono male. In particolare se si vuole effettuare tramite
la blind injection il dump dei campi desiderati, ci troviamo in diffolta' a causa dell'assenza dell'operatore LIMIT, il quale ci permette di selezionare esattamente la tupla desiderata. Se poi i campi di cui vogliamo fare il dump si trovano in un'altra tabella
rispetto a quella utilizzata per la query, le cose si complicano ancora di piu'. In questo articolo vedremo in che modo sopperire alla mancanza dell'operatore LIMIT
Indice
2. Teoria
In soccorso ci viene la presenza dell'operatore TOP e della funzione LAST(). TOP
permette di selezionare il numero di tuple che si vuole la query ritorni (ma senza poter specificare da che punto iniziare). LAST invece seleziona l'ultima tupla di un'espressione. Avrete gia' intuito che attraverso l'utilizzo prima di TOP e poi di LAST e' possibile selezionare tutte le tuple di una query.
Facciamo un esempio: supponiamo di voler selezionare esattamente la 10 tupla di un'espressione, le operazioni da fare sono le seguenti; si comincia per prima con il selezionare le prime 10 tuple attraverso il seguente utilizzo di TOP: TOP 10. In seguito con l'utilizzo dell'operatore LAST si andra' a selezionare l'ultima tupla. Iterando il procedimento si puo' facilmente effettuare il dump dei campi della tabella desiderata.
Indice
3. Dalla teoria alla pratica
Supponiamo di dover testare un'applicazione (con DBMS MS Access) con il seguente url http://www.company.com/index.asp?id=1 dove il parametro id e' di tipo numerico e vulnerabile a blind sql injection. Ora supponiamo che in qualche modo siete venuti a conoscenza dell'esistenza della tabella users e sapete anche dell'esistenza dei campi username e password. L'intenzione è riuscire ad effettuare il dump di questi due campi. Per il nostro scopo utilizzeremo anche la funzione MID che ci permette di ottenere delle sottostringhe, e la funzione IIF che non e' altro che il costrutto 'if'.
Andiamo dritti al sodo e supponiamo di voler ottenere il valore della tupla numero 10 del campo username. Cominciamo con l'identificare il primo carattere, la query che verra' effettuata e':
http://www.company.com/index.asp?id=IIF((select%20mid(last(username),1,1)%20
from%20(select%20top%2010%20username%20from%20users))='a',0,'ko')
ovvero cominciamo a selezioniare (tramite la subquery) i primi 10 record attraverso l'operatore TOP, in seguito attraverso la funzione LAST() selezioniamo l'ultimo record. Infine attraverso la funzione MID() andiamo a selezionare il primo carattere e a fare inferenza su quest'ultimo (nell'esempio ci chiediamo se e' uguale ad 'a'). Se e' uguale alla lettera 'a' facciamo ritornare il numero 0 (otterremo dunque un codice di risposta uguale a 200), nel caso in cui l'esito fosse negativo, facciamo ritornare una stringa, la quale generera' un errore (dato che il parametro id e' di tipo numerico) facendo ritornare un codice di risposta uguale a 500. Iterando il meccanismo sugli indici dell'operatore TOP (per cui selezionando di volta in volta un numero maggiore di tuple) e della funzione MID() (in particolare sul secondo parametro il quale identifica la posizione da cui cominciare ad ottenere la sotto-stringa) otterremo tutti i valori del campo username.
Indice
4. Conclusioni
La difficolta' nello sfruttare vulnerabilita' di tipo blind sql injection (in caso di database MS Access) per effettuare il dump delle tabelle del DBMS, consiste nel non disponere della funzione LIMIT(). Ma attraverso l'utilizzo dell'operatore TOP e della funzione LAST() e possibile (tramite l'utilizzo di una subquery) ottenere lo stesso risultato. Si e' inoltre visto che grazie alla funzione IIF e' possibile facilmente fare inferenza su campi appartenenti a tabelle diverse.
Indice
5. Riferimenti
- http://www.webapptest.org/ms-access-sql-injection-cheat-sheet-EN.html
- http://www.ictsc.it/site/IT/papers/sqlInjectionInference.php