1. Vulnerabilità web
Sql injection
19 maggio Massimo Fornari – SQL Injection 1
2. Vulnerabilità web
Si dividono in:
• Cross-site scripting
• SQL injection
• Broken authentication
• Information leakage
Sono dovuti a scarsa attenzione degli sviluppatori
19 maggio Massimo Fornari – SQL Injection 2
3. Statistiche di vulnerabilità
Il problema risulta
evidente dal grafico
19 maggio Massimo Fornari – SQL Injection 3
4. Cross-site scripting (XSS)
• Inserisce script malevoli all’interno delle pagine
tramite:
– Form di immissione
– Campi di ricerca
– Parametri URL
• Lo script può modificare temporaneamente o
permanentemente la pagina
• Consente di sottrarre dati e prendere il controllo
19 maggio Massimo Fornari – SQL Injection 4
5. Information leakage
• Si entra in possesso di informazioni sensibili
tramite:
– Analisi del sorgente
– Messaggi di errore
– Commenti
19 maggio Massimo Fornari – SQL Injection 5
6. Broken authentication
• Debolezza del sistema di controllo degli accessi,
con possibilità di autenticazione fasulla:
– Attacco di forza bruta
– Credenziali semplici, per tentativi
– Aggiramento del login
19 maggio Massimo Fornari – SQL Injection 6
7. SQL Injection
• SQL Injection: An attack technique used to
exploit web sites by altering backend SQL
statements through manipulating application
input (Web applicazion security consortium)
• Sfrutta l’inadeguatezza dei controlli sui dati di
input
19 maggio Massimo Fornari – SQL Injection 7
8. Test della vulnerabilità
• Per prima cosa l’attaccante cerca di capire se
l’applicazione è vulnerabile
– Inserisce statement propri di SQL al posto dei
parametri
– Controlla se il server esegue la query con successo
• In questo caso l’applicazione è vulnerabile
• Se il server ritorna un messaggio di errore lo si analizza alla
ricerca di una possibile vulnerabilità
19 maggio Massimo Fornari – SQL Injection 8
9. Test della vulnerabilità - continua
• Verificare un singolo parametro per volta
inserendo stament SQL:
– ‘ (single quote)
– Select, where
• Questo ha lo scopo di causare errori nella query
• In caso il server risponda con errori contenenti
“..SQL server…”, “ODBC”, “sintax” l’applicazione
è vulnerabile
19 maggio Massimo Fornari – SQL Injection 9
10. Test della vulnerabilità - continua
• Altro modo per testare la vulnerabilità è inserire
parametri corretti, seguiti da una nuova
condizione sempre vera:
SELECT * FROM edizioni WHERE id = 7
• Inserendo 7 AND 1=1 la query rimane inalterata
ma il server può reagire in 2 modi:
– Esegue la query con successo: è certamente
vulnerabile
– Rifiuta la query: il server è stato reso sicuro (almeno
nel punto appena testato)
19 maggio Massimo Fornari – SQL Injection 10
11. Authentication bypass
• È uno scenario classico di attacco
• Lo script che si occupa del login è vulnerabile:
string sqlQuery = "SELECT id FROM Login WHERE
Username='" + UserTextBox.Text + "'AND
Password='" + PassowordTextBox.Text + "'";
dr=command.ExecuteReader();
if (dr.HasRows){/*login succesful*/}
else {/*login faild*/}
19 maggio Massimo Fornari – SQL Injection 11
12. Authentication bypass - continua
• Se il testo inserito è quello che l’applicazione ci si
aspetta tutto funziona.
• Se i parametri contengono caratteri propri del
linguaggio SQL si modifica la query di
autenticazione
• Inserendo ‘ OR ‘’=‘ sia come nome che come
pw otteniamo la seguente interrogazione:
select id from Login where Username=‘’ or ‘’=‘’ and Password=‘’ or ‘’=‘’
19 maggio Massimo Fornari – SQL Injection 12
13. Authentication bypass - continua
• A questo punto la query estrae tutte le righe
della tabella, in quanto la condizione WHERE è
sempre verificata.
• In tale modo si è avuto accesso ad un’area
riservata
19 maggio Massimo Fornari – SQL Injection 13
14. Altri scenari
• SQL injection può essere usata anche per altri
scopi:
– Ottenere dati “extra” da un’interrogazione
– Forzare l’inserimento di nuove tuple
• Uno scenario possibile è quello di concatenare
due query usando come separatore “;” oppure
usare UNION per fare l’unione di 2 query in
un’unica tabella
19 maggio Massimo Fornari – SQL Injection 14
15. Struttura del database
• Sfruttando il separatore “;” è possibile, per
esempio, inserire una query del tipo:
SELECT * FROM sys.tables; --
• Essa ha l’effetto di mostrare tutte le tabelle
presenti nel database (la sequenza “--” serve a
ignorare tutto ciò che viene dopo di essa”)
• L’informazione che se ne ricava permetterà
all’attaccante di accedere alle informazioni
desiderate.
19 maggio Massimo Fornari – SQL Injection 15
16. Considerazzioni
• È possibile inoltre sostituire la SELECT con una insert, al
fine di inserire nuove tuple (tipicamente per ottenere
un utente amministratore)
• Un attacco di questo tipo non è sempre possibile, in
quanto richiede che il risultato della query venga
visualizzato direttamente sullo schermo.
• Tuttavia è possibile comunque eseguire tali comandi
anche senza vederne direttamente i risultati, si parla di
BLIND SQL INJECTION in cui spesso si procede per
tentativi
19 maggio Massimo Fornari – SQL Injection 16
17. Come proteggersi
• L’applicazione dovrebbe SEMPRE controllare i
dati di input
• Rimuovere gli apici dalle query
• Convertire i parametri in formato URL
(sostituisce i caratteri speciali nel formato %n).
• Nell’input sostituire gli apici con “ ’ ”
• Utilizzo di query parametriche (disponibile in
tutti i linguaggi principali)
19 maggio Massimo Fornari – SQL Injection 17
18. Esempio query parametrica
OleDbCommand cm = new OleDbCommand("INSERT INTO Corrieri
([NomeSocietà], [Telefono]) VALUES (?, ?)", cn);
OleDbParameter prm = new OleDbParameter();
prm.Direction = ParameterDirection.Input;
prm.DbType = DbType.String;
prm.Value = "Dall'Ara Francescò";
cm.Parameters.Add(prm);
prm = new OleDbParameter();
prm.DbType = DbType.String;
prm.Value = "(555)123-456";
cm.Parameters.Add(prm);
19 maggio Massimo Fornari – SQL Injection 18
19. Query parametrica
• Si vede come questa strutturazione, porta a
forzare il tipo del parametro da inserire nella
query, in modo che al momento della
costruzione di quest’ultima venga controllata la
correttezza.
• Questo pattern oltre a evitare problemi di
sicurezza, risolve alcuni problemi di invio dei
parametri
19 maggio Massimo Fornari – SQL Injection 19
20. Injector software
• Esistono software che consentono di testare e
iniettare codice SQL senza passare dal browser
– SQL power injector
http://www.sqlpowerinjector.com/
– Priamos
http://www.priamos-project.com/
19 maggio Massimo Fornari – SQL Injection 20
21. Vulnerability tester
• Esistono inoltre software in grado di rilevare
vulnerabilita web (la cosa è legale solo sul
proprio sito oppure dopo aver ottenuto
l’autorizzazione) non solo di SQL injection
– Acunetix (versione trial oppure free limitata a XSS)
http://www.acunetix.com/
– Google skipfish
http://code.google.com/p/skipfish/
19 maggio Massimo Fornari – SQL Injection 21