Esercitazione Database - Parte 2


1. Introduzione

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

2. Scenario

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

Negozio.tar.gz

  1. Scompattare l'archivio

  2. In eclipse, selezionare File > Import > General > Existing Project Into Workspace

  3. Nella finestra che compare, inserire nel campo Select an archive file.. il jar appena scaricato

  4. Aggiungere 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.

3. SQL Injection

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] Nota

I caratteri '-- ' messi alla fine commentano il ' utilizzato nella SQL query dell'applicazione

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; --

4. Evitare l'injection

Modificare l'implementazione dell'operazione getListaOrdini affinche utilizzi il PreparedStatement e verificare che le tecniche di SQL Injection risultano inefficaci.

Footer BGFooter BG
Tito Flagella - © 2007-2015