Menu
Menu
Contattaci
Il nostro settore richiede uno studio continuo e una forte attenzione all’innovazione. Incentiviamo quindi dei programmi formativi annuali per tutti i componenti del team, con ore dedicate (durante l’orario di lavoro) e serate formative sia online che in presenza. Sponsorizziamo eventi, sia come partner che semplicemente come partecipanti, e scriviamo articoli su quello che abbiamo imparato per essere, a nostra volta, dei divulgatori.
Vai alla sezione TeamLa SQL injection è una tecnica di code injection che aggredisce applicazioni web facenti utilizzo di un database SQL: andando ad inserire frammenti malevoli di codice SQL all’interno di campi di input si va modificare il comportamento delle query sul database all’insaputa dello sviluppatore.
La SQL injection sfrutta, nella maggioranza dei casi, vulnerabilità del codice dell’applicazione, come: una mancata validazione degli input, un mancato filtraggio dei dati mandati da un client al server, oppure una costruzione errata di query all’interno della nostra applicazione, con parametri non fortemente tipizzati.
Il suo utilizzo è, per quanto appena detto, spesso veicolato da applicazioni web, ma in realtà può essere usato per attaccare qualsiasi tipo di database SQL.
Questa tecnica è stata considerata da Open Web Application Security Project una delle 10 maggiori vulnerabilità delle applicazioni web nel 2007 e nel 2010, mentre dal 2013 ad oggi è stato considerato il numero uno degli attacchi sulla OWASP top 10.
Il “primato” è dovuto sostanzialmente a 3 fattori:
Negli ultimi anni alcuni attacchi di questo tipo dimostratosi particolarmente gravi hanno messo in luce come, pur avendo a disposizione strumenti sempre più avanzati per ovviare a tale vulnerabilità, tantissimi software tuttora non utilizzino soluzioni allo stato dell’arte per garantire sicurezza sotto questo aspetto.
Come detto precedentemente, una delle principali fonti di preoccupazione verso un attacco SQL Injection è la sua pericolosità e di seguito sono riportati gli ambiti in cui un attacco come questo può agire:
Un aspetto fondamentale da conoscere in materia di SQL Injection è che non esiste solo una tipologia di attacco, ma questi si dividono in principalmente 3 categorie:
Un tipo di attacco basato su errori sfrutta la scarsa gestione di quest’ultimi in un’applicazione, infatti consiste nell’attivare di proposito errori nel database trasmettendo valori di input non validi.
In molti casi infatti le eccezioni generate dal database SQL possono essere molto parlanti per quanto riguarda la struttura dello stesso ed il tipo di dati salvati.
Affinando ed arricchendo sempre di più la query malevola, in base alle informazioni che siamo riusciti a reperire dalle eccezioni precedenti, potremmo avvicinarci ad ottenere una stringa iniettabile capace di estrapolare o manomettere dati.
Questo tipo di approccio può portare al risultato atteso in relativamente poco tempo, ma necessita obbligatoriamente che l’applicazione sia configurata in modo da visualizzare (o comunque ritornare al client in un qualche modo intelligibile) gli errori generati dal database.
L’iniezione SQL basata su unione consente di estrarre informazioni dal database estendendo i risultati restituiti dalla query originale.
In questa modalità viene fatto utilizzo dell’operatore UNION per combinare il risultato di due o più istruzioni SELECT in un singolo risultato che viene poi restituito come parte della risposta al client.
Il principale vincolo di questo tipo di attacco è dovuto al dover conoscere esattamente la struttura della query originale e replicarla su quella “aggiuntiva”.
Proprio per quest’ultimo motivo è spesso preceduta da vari attacchi “error based” per cercar di capire la struttura della query originale.
Nelle due precedenti modalità è necessario che alcune condizioni, quali l’abilitazione degli errori a video o la possibilità di utilizzare l’operatore UNION nelle query, siano soddisfatte per poter essere eseguiti.
Quando ciò non è possibile c’è un’ultima tipologia di attacco nella quale un attaccante può fare affidamento: la Blind Injection.
Questa variante è la più efficace ma al contempo la più difficile da effettuare, infatti, come suggerisce il nome (“iniezione cieca”), si procede alla cieca.
In questo caso è più che utile un esempio:
Consideriamo di avere un indirizzo costruito in questo modo:
localhost/Alunni?orderBy=nome
possiamo immaginare che la query eseguita possa essere qualcosa del tipo
select * from alunni order by nome
l’attaccante potrebbe manomettere il parametro in query string per ottenere informazioni non desiderate
localhost/Alunni?orderBy=case when(select top 1 from sys.tables)='foo' then nome else cognome end
In questo semplice modo a seconda di come verranno ordinati gli elementi restituiti, l’attaccante sarà a conoscenza della presenza o meno della tabella che sta cercando nel frammento di query iniettato.
Con l’aumentare dei tentativi effettuati aumenteranno sempre più anche le informazioni in possesso dell’attaccante.
Come è facile intuire il principale limite di quest’ultima metodologia è il tempo impiegato per ottenere le informazioni ma, anche in questo caso, ci sono una grande quantità di tool gratuiti in grado di automatizzare il processo.
Fortunatamente esistono varie tecniche che possono essere utilizzate per prevenire attacchi di SQL Injection, ma per far sì che siano realmente efficaci dobbiamo occuparci di tutti i componenti coinvolti: il server, le singole applicazioni ed il Database Management System.
Segui Giuneco sui social