In questo articolo faremo una panoramica introduttiva sulle SQL injection, spiegando cosa sono e descrivendo esempi basilari di come un attaccante potrebbe compromettere il sistema.
Una SQLi è una vulnerabilità che consente ad un utente malintenzionato di interferire con le query, ovvero le richieste che un’applicazione effettua al proprio database. Con questa tecnica un attaccante può essere in grado di visualizzare, inserire o eliminare dati a cui normalmente non avrebbe accesso.
Un attacco di tipo SQL injection infatti può comportare un accesso non autorizzato a dati sensibili come password o dati personali degli utenti.
Esistono diverse tecniche e modalità per portare a termine con successo un attacco SQL injection. Alcuni esempi molto comuni sono gli “UNION ATTACK” che, attraverso l’operatore UNION, è possiile dumpare dati tra diverse tabelle, o gli “ERROR BASED” che sfruttano errori restituiti dal database per ricostruire i dati. Esistono anche metodi molto più difficili da individuare ed applicare, come le “SECOND ORDER SQL INJECTION“. In questo articolo vogliamo solo darvi un assaggio, ma non temete: queste e molte altre metodologie saranno spiegate in dettaglio nei prossimi articoli. Rimanete sintonizzati! 😉
Quando testiamo un’applicazione web possiamo cercare vulnerabilità SQL injection in molteplici sezioni del sito. In ambito di pentesting o bugbounty vengono testate principalmente pagine di autenticazione o campi di ricerca. Ma in realtà è possibile trovare SQLi anche in richieste GET/POST, negli headers HTTP oppure nei cookie.
Prima di addentrarci in una prova pratica, è buona norma studiare prima come funzionano i database e apprendere la loro sintassi. Queste sono alcune funzioni che sicuramente potranno tornarci utili quando iniziamo a studiare le SQLi:
SELECT | Seleziona i dati da leggere seguendo specifici criteri. |
INSERT | Inserisce dati nel database. |
UPDATE | Aggiorna i dati nel database. |
DELETE | Elimina i dati nel database. |
ORDER BY | Ordina i dati seguendo specifici criteri. |
Un’altra sintassi che deve esserci ben chiara è quella dei caratteri speciali, prendi appunti perché sono il fulcro delle SQL injection. Qui alcune delle sintassi possibili:
' oppure " | Questi caratteri identificano l’inizio e la fine di una stringa. |
/*…*/ | Questi caratteri servono per i commenti multi-linea. |
# oppure -- - | Commento in una singola linea. |
|| | Concatenazione. |
% | Wildcard. |
@variable | Variabile locale. |
@@variable | Variabile globale. |
waitfor delay ’00:00:05’ | Tempo di ritardo nella risposta del database. |
+ | Addizione, concatenazione (oppure spazio negli URL). |
Come ben sappiamo, esistono molti sistemi di gestione di database. Un attaccante può risalire al tipo di database semplicemente analizzando gli errori che quest’ultimo restituisce lato web, per poi meditare con più precisione sul vettore di attacco. Di seguito osserviamo gli errori che rappresentano MySQL
, Oracle
e MS SQL
.
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ”1” LIMIT 0,1′ at line 1
ORA-00933: SQL command not properly ended
Microsoft SQL Native Client error ‘80040e14’ Unclosed quotation mark after the character string
Di seguito trovate un laboratorio online dove anche voi potete esercitarvi a fare l’exploiting di questa vulnerabilità.
Lab: SQL injection vulnerability in WHERE clause allowing retrieval of hidden data | Web Security Academy (portswigger.net)
In questo laboratorio gli sviluppatori hanno implementato una funzionalità che permette all’utente di visualizzare ogni prodotto per categoria.
Clicchiamo su una categoria e notiamo che i prodotti vengono ordinati nella maniera corretta.
Possiamo immaginare che nel backend la query chiamata sia del tipo:SELECT * FROM products WHERE category='Pets' AND <altre condizioni>;
Il nostro obiettivo ora è mandare in errore il database, aggiungiamo quindi un semplice '
e notiamo infatti che la web app ci restituisce un Internal Server Error
.
Ora abbiamo un’idea di come la query funzioni, sappiamo che con '
ci viene restituito un errore.
Proviamo ad inserire nell’URL ?category=Pets'+OR+1=1--
e guardiamo l’output. Abbiamo dei nuovi articoli a cui prima non avevamo accesso!
Infatti, conoscendo la sintassi, possiamo immaginare che la query inviata sarà:SELECT * FROM products WHERE category = 'Pets' OR 1=1--' AND <altre condizioni>
;
La query restituirà quindi tutti gli elementi la cui categoria è ‘Pets‘ oppure 1=1, e poiché quest’ultima condizione è sempre vera, ci restituirà tutti gli elementi (ovvero tutti gli articoli, compresi quelli che non potevamo vedere di default).
Se l’articolo ti è piaciuto, puoi continuare a seguirci, oltre che su questo blog, anche sugli altri canali attivi e ricchi di contenuti: Twitch e YouTube.
Non esitare a lasciare feedback, domande o precisazioni nei commenti o sui nostri canali social di Telegram e Discord!
Entra a far parte della nostra community!
Registrati subito per commentare video e articoli.