Abbiamo visto come creare una tabella in database e, tramite i driver JDBC, come leggere e manipolare i dati via Java. Vediamo come integrare queste nuove conoscenze nel web service che stiamo sviluppando imparando a non esporci ad attacchi di tipo SQL Injection
Nelle ultime esercitazioni abbiamo sviluppato un Web Service di un negozio online che implementa alcune operazioni per la gestione degli Ordini. Nell'archivio che viene fornito e' incluso il progetto Eclipse con lo scheletro di tale Web Service
Scompattare l'archivio
In eclipse, selezionare
File > Import > General > Existing Project Into Workspace
Nella finestra che compare, inserire nel campo
Select an archive file..
il jar appena scaricatoAggiungere al progetto le librerie necessarie (CXF)
Il progetto contiene gia' un fuitore del Web Service, nella classe org.negozio.client.OrdiniClient
, che
invoca le due operazioni esposte, addOrdine
e listaOrdini
, e ne stampa il risultato. Per eseguirlo
selezionare Run > Run As...> Java Application
.
Oltre al client e' incluso il Web Service, di cui occorre completare l'implementazione della classe
org.negozio.OrdiniImpl
, deployabile in tomcat con il comando File > Export > Web > WAR File
Il Web Service richiede un database, lo stesso creato nella lezione precedente. Nel caso non fosse stato gia' fatto, creare la tabella per memorizzare gli ordini:
CREATE TABLE ordini( codfiscale VARCHAR(255) NOT NULL, idordine VARCHAR(255) NOT NULL );
Completare quindi l'implementazione del Web Service implementando il metodo addOrdine
.
L'implementazione delle operazioni fornita è vulnerabile agli attacchi basati su SQL Injection. L'attacco è suddiviso in step di cui forniamo la spiegazione e le informazioni raccolte.
SQL Injection: step 1. L'operazione getListaOrdini cerca gli ordini di un utente a partire dal suo codice fiscale. Cominciamo eseguendo una normale richiesta passando come parametro un codice fiscale. Se ci sono ordini questi verranno correttamente restituiti al cliente.
SQL Injection: step 2.
Verifichiamo se il codice che implementa l'operazione ` attaccabile. Passiamo come parametro
xxxx'
.
Il messaggio di errore contiene: unterminated quoted string at or near "'xxxx''" il che ci conferma
che il codice ` attaccabile dal momento che il cofice fiscale non viene controllato, ma semplicemente inserito in una query
come stringa.
SQL Injection: step 3.
Cominciamo a modificare la query operando sul parametro passato all'operazione.
Visualizziamo il contenuto della tabella: xxxx' OR 1='1
.
la seconda parte dell'OR ` sempre vera rendendo vera tutta la condizione.
La conseguenza e' che ci verranno listati tutti gli ordini presenti in tabella
SQL Injection: step 4. Per poter spingerci oltre e manipolare i dati oltre che visualizzarli abbiamo bisogno di maggiori informazioni sulla struttura del database. Dobbiamo trovare il nome di una tabella su cui eseguire le nostre operazioni. Eseguiamo una serie SELECT count(*) inserendo nomi di tabelle che hanno senso nel constesto dell'operazione finch` non ne troviamo una che non da errore.
xxxx' AND 1<>(SELECT COUNT(*) FROM listini) --
xxxx' AND 1<>(SELECT COUNT(*) FROM magazzino) --
xxxx' AND 1<>(SELECT COUNT(*) FROM ordini) --
Utilizzando la tabella listino
non abbiamo errori SQL,
quindi abbiamo trovato il nome di una tabella.
Nota | |
---|---|
I caratteri '-- ' messi alla fine commentano il |
SQL Injection: step 5. Adesso che abbiamo il nome della tabella 'ordini' tentiamo di inserirci un nuovo record. Cominciamo provando
xxxx'; INSERT INTO ordini VALUES (2); --
dall'errore capiamo che una colonna si chiama idordine.
SQL Injection: step 6. Usiamo la nuova informazione per la nostra Insert
xxxx'; INSERT INTO ordini (idordine) VALUES ('esempio'); --
l'errore ci informa che dobbiamo aggiungere anche codfiscale
SQL Injection: step 7. Aggiungiamo il codfiscale alla query:
xxxx'; INSERT INTO ordini (idordine, codfiscale) VALUES ('esempio','aaa'); --
Viene restituito un l'errore. Questo accade perch` la query modificata restituisce un risultato imprevisto per la logica del servizio che non sa gestirlo.
SQL Injection: step 8.
A questo punto vediamo se la nostra INSERT ha sortito qualche effetto eseguendo la query del punto 3
che mostra tutti gli ordini: xxxx' OR 1='1
E' apparso in listino il nostro ordine fasullo!! Adesso possiamo effettuare qualsiasi operazione su questa tabella.
SQL Injection: step 9.
Se l'utente con cui si accede al DB ha i diritti necessari ` possibile addirittura eseguire un DROP e cancellare intere
tabelle: xxxx'; DROP TABLE ordini CASCADE; --