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.

Cos’è una SQL injection (SQLi)?

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.

Alcuni esempi di SQL injection!

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! 😉

Dove cercare SQL injection?

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.

Funzioni SQL da conoscere!

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:

SELECTSeleziona i dati da leggere seguendo specifici criteri.
INSERTInserisce dati nel database.
UPDATEAggiorna i dati nel database.
DELETEElimina i dati nel database.
ORDER BYOrdina i dati seguendo specifici criteri.
0.1 Tabella funzioni SQL

Caratteri speciali per SQL!

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.
 @variableVariabile locale.
 @@variableVariabile globale.
 waitfor delay ’00:00:05’Tempo di ritardo nella risposta del database.
+Addizione, concatenazione (oppure spazio negli URL).
0.2 Caratteri speciali per SQL

Come riconosco uno specifico database?

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.

  • MySQL
  • 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
  • Oracle
  • ORA-00933: SQL command not properly ended
  • MS SQL
  • Microsoft SQL Native Client error ‘80040e14’ Unclosed quotation mark after the character string

Come sfruttare una vulnerabilità di tipo SQLi [LABORATORIO]

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.

0.3

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 è ‘Petsoppure 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).

Conclusioni

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!

Donato Di Pasquale
Donato Di Pasquale
@dipa996 | eWPT | CyberSecurity Enthusiast | Blog writer per PentestingMadeSimple

Lascia un commento