1
INTRODUZIONE
L’iniezione di codice SQL
La SQL Injection (SQLI) è una tecnica di attacco informatico documentata da
almeno il 1998
1
, ma resta ancora oggi una delle maggiori minacce che
affliggono l’accesso remoto a una base dati. Gode di una certa notorietà come
veicolo d’attacco a siti web e in particolare ai web database attraverso le web
application, ma vessa in generale qualsiasi database SQL non adeguatamente
protetto.
Le tecniche ascrivibili alla famiglia SQLI permettono di fornire accesso non
autorizzato a informazioni riservate, consentono l’esecuzione di operazioni di
ogni sorta sul database e la manipolazione del server SQL, e agevolano
l’impiego di ulteriori tecniche di hacking. Lo studio di questo malware
2
e della
sua prevenzione interessa dunque sia aspetti di gestione dei database che di
sicurezza informatica.
Il termine injection evoca in maniera puntuale la modalità d’infezione: una
porzione di codice SQL viene surrettiziamente inserita (“iniettata”) da un client
1
Jeff Forristal, NT Web Technology Vulnerabilities, Phrack Magazine Volume 8, Issue 54, 25
December 1998, article 08 of 12, su http://phrack.org/issues/54/8.html, URL consultato il
07.04.2018.
2
« "Malware" is short for malicious software and is typically used as a catch-all term to refer to
any software designed to cause damage to a single computer, server, or computer network,
whether it's a virus, spyware, et al. », Robert Moir, Defining Malware: FAQ, Microsoft Technet,
15 October 2003, https://technet.microsoft.com/en-us/library/dd632948.aspx, URL consultato il
07.04.2018.
2
nel server dove risiede il sistema di gestione di basi di dati (Database
Management System, DBMS). Un attacco SQLI (SQLI Attack, SQLIA) prevede
infatti che del codice malevolo sia inserito in stringhe da passare a una istanza
di un server SQL per il parsing e l’esecuzione. Ogni procedura per la costruzione
di statements SQL dovrebbe quindi essere sottoposta a una revisione avente lo
scopo d’inibire potenziali SQLIA, considerato che il server SQL eseguirà tutte le
queries sintatticamente valide che riceve.
3
Nonostante la posizione preminente tra le vulnerabilità delle quali più
frequentemente soffrono le applicazioni di gestione dati, la SQLI è un problema
spesso sottostimato - quando non del tutto ignorato - in sede di
programmazione, sicurezza e ingegneria del software.
Alla luce della sua diffusione e potenziale pericolosità, la sottovalutazione di
questa minaccia mi colpì sin da quando, studiando le basi di dati e il linguaggio
di programmazione SQL/MySQL per sostenere l’esame di “Ingegneria del
software e basi di dati”, me ne interessai per la prima volta.
3
« SQL injection is an attack in which malicious code is inserted into strings that are later
passed to an instance of SQL Server for parsing and execution. Any procedure that constructs
SQL statements should be reviewed for injection vulnerabilities because SQL Server will execute
all syntactically valid queries that it receives. », Microsoft Technet, SQL Injection,
https://technet.microsoft.com/en-us/library/ms161953%28v=SQL.105%29.aspx, URL
consultato il 07.04.2018.
3
Argomenti affrontati nella tesi
L’intendimento di questa tesi è di presentare alcune tecniche esistenti di SQLI,
evidenziando l’attuale estensione e dannosità del fenomeno. La tesi si prefigge
altresì di proporre una classificazione delle SQLI e dei metodi di prevenzione.
Qualche semplice esempio di SQLIA sarà illustrato con degli esperimenti di
laboratorio e si indicheranno alcuni strumenti software a disposizione di chi si
occupa di sicurezza delle applicazioni web. Si cercherà infine di valutare possibili
scenari futuri.
Il primo capitolo, oltre a elencare gli acronimi utilizzati, introduce per sommi
capi le idee di base funzionali alla fruizione di questa dissertazione. Trattasi per
lo più di concetti che dovrebbero essere noti a un esperto del settore; per
questo motivo può essere saltato o eventualmente usato come compendio a
supporto della lettura dei capitoli seguenti, laddove alcuni termini non
risultassero chiari.
Nel secondo capitolo si contestualizza il problema delle vulnerabilità dovute a
tecniche di SQL injection, valutandone diffusione a livello mondiale e impatto
economico. Si propone inoltre una rassegna assolutamente non esaustiva di
casi balzati agli onori della cronaca nel corso degli ultimi anni.
Il terzo capitolo approfondisce aspetti salienti necessari alla comprensione delle
SQL injection. Sono esposte nozioni quali compilazione e interpretazione,
iniezione remota, applicazione web e SQL injection. In più si indica una possibile
4
tassonomia delle SQL injection e si accennano ulteriori metodi di classificazione.
Particolare spazio è dato alle SQL injection classiche.
Il quarto capitolo è principalmente il resoconto di personali esperienze di
laboratorio, effettuate per approfondire il meccanismo di funzionamento delle
SQL injection. Sono presentati gli strumenti informatici utilizzati per realizzare
gli esperimenti e si descrivono alcuni dei test eseguiti. Si espongono infine
alcuni degli strumenti a disposizione degli esperti di sicurezza informatica (e
degli hacker). A differenza degli altri capitoli, scritti impiegando un registro
impersonale, ho preferito redigere questo capitolo in prima persona, in quanto
tratta prove di laboratorio concepite ed eseguite da me personalmente.
Nel quinto capitolo si affronta il tema della prevenzione dalle SQL injection.
Sono proposte alcune classificazioni dei metodi di individuazione e si descrivono
le tecniche di difesa maggiormente utilizzate. In considerazione dell’importanza
che riveste per la sicurezza delle applicazioni, maggior rilievo è dato al metodo
dei prepared statements.
Il sesto capitolo espone le conclusioni di questa dissertazione. Si riassumono il
lavoro svolto e gli obiettivi raggiunti. Sono altresì indicate possibili linee di
sviluppo futuro per l’approfondimento della tematica delle SLI injection.
5
1. BREVI RICHIAMI DEI CONCETTI DI BASE,
DEFINIZIONI E ACRONIMI
Apache (o Apache HTTP Server)
Piattaforma server Web modulare più diffusa, in grado di operare con i più
utilizzati sistemi operativi, tra cui UNIX/Linux, Microsoft, OpenVMS. Apache è un
software che oltre a realizzare le funzioni di trasporto delle informazioni, di
internetwork e di collegamento, offre il vantaggio di offrire funzioni di controllo
per la sicurezza, e dispone anche di moduli che comprendono interpreti PHP,
PERL, ecc.
4
Architettura client-server
Una delle due principali tipologie di architetture di rete (l’altra è la peer-to-
peer). Uno o più client si collegano a un server per fruire dei servizi messi a
disposizione da quest’ultimo. La comunicazione client-server avviene tramite un
protocollo di rete. Il server gestisce la condivisione delle risorse fra i vari client,
evitando i conflitti, come quelli che si verificano quando più client richiedono
contemporaneamente di modificare il medesimo record di un database.
Figura 1 - Schema architettura client-server
4
Daniele Venditti, PHP+MYSQL Corso Facile di Programmazione Web, Amazon Distribution
GmbH, Leipzig, 2017, p. 10.
6
Architettura three-tier
Architettura a tre strati. Stile architetturale software che prevede tre layer
(strati): interface (interfaccia utente), business logic o application logic (logica
funzionale) e storage (dati). L’interface layer include tutti gli oggetti con cui
interagisce l’utente: finestre, moduli (forms), ecc. L’application layer elabora,
controlla e notifica le richieste dell’applicazione. Infine lo storage layer si occupa
di memorizzare, recuperare e interrogare i dati residenti nel DBMS.
Figura 2 - Three-tier architectural style (UML component diagram)
5
Figura 3 - Tier architecture message transfer model
6
5
Bernd Bruegge, Allen H. Dutoit, Object-Oriented Software Engineering Using UML, Patterns,
and Java, III ed., Pearson New International Edition, Pearson Education Limited, 2014, p. 239
7
Figura 4 - Architettura three-tier web based, una possibile implementazione
Attack
Attacco, aggressione, incursione, intrusione. Tecnica usata per sfruttare le
vulnerabilità delle applicazioni.
6
Regan Rajendran, Nithya Venkatachalam, A method to detect and prevent SQL injection
attack, Lambert Academic Publishing, 2012, p. 8.
8
Back-end e Front-end
Il front-end costituisce la parte visibile all'utente e con cui egli può interagire
(interfaccia utente), mentre la parte che permette l'effettivo funzionamento di
queste interazioni si chiama back-end. Il front-end è deputato all'acquisizione
dei dati di ingresso e della loro elaborazione con modalità tali da renderli
utilizzabili dal back-end.
Code Injection
Iniezione di codice. Termine generale per designare un attacco consistente
nell’inserire del codice di programmazione che sarà successivamente
interpretato ed eseguito dall’applicazione.
Cookie(s)
Un cookie è un file di testo memorizzato all’interno di un computer, utilizzato da
un web browser per tenere traccia di informazioni quali: login, pagine visitate,
preferenze utente come lingua e aspetto grafico, ecc. I cookies sono creati da
un server tramite protocollo HTPP e possono essere letti solo dal rispettivo
dominio.
7
Le applicazioni web lato server archiviano e all’occorrenza recuperano
le informazioni a lungo termine sul lato client dai cookies, per questo il loro
utilizzo è regolamentato nel codice in materia di protezione dei dati personali
(privacy).
7
Stefano Novelli, hackLOG, Manuale sulla Sicurezza Informatica & Hacking Etico, Volume 1
Anonimato, Independently published, 2017, p. 129.