Una delle minacce informatiche più importanti e significative porta il nome di SQL Injection. Vale a dire una delle tecniche di hacking malevolo volto a destabilizzare il funzionamento di un sito web o di un’applicazione sfruttando il funzionamento di un database relazionale grazie all’iniezione (da qui il nome della minaccia) di codice SQL adatto allo scopo dei malintenzionati.
Scopo che può essere differente. Ciò che rende veramente pericoloso un attacco SQL Injection è la sua versatilità: può essere effettuato senza grandi strumentazioni e su una gran varietà di siti web o altre strutture che utilizzano la tecnologia dei database.
Ci sono delle criticità specifiche e tutto porta alla stessa riflessione: chi investe poco in cybersicurezza rischi tanto. Soprattutto se parliamo di applicazioni aziendali dove si devono tutelare transazioni economiche, dati sensibili, attività svolte con i clienti che lasciano informazioni personali. Ecco perché è indispensabile approfondire questo argomento.
Indice dei contenuti
Cos’è una attacco SQL Injection, definizione
Un’operazione di SQL Injection (a volte definita SQL Inject o SQLi) è una tecnica di hacking che sfrutta le vulnerabilità nei database basati su SQL, ovvero Structured Query Language.
Nello specifico, parliamo di un attacco informatico che prevede l’inserimento (o iniezione) di codice dannoso attraverso stringhe che vengono passate a un’istanza del database di SQL Server. Il quale esegue qualsiasi tipo di comando sintatticamente corretto, a prescindere se sia danno o meno.
Un attacco SQL injection può essere molto pericoloso per le aziende che affrontano le sfide della propria attività attraverso l’uso di un database, e chi conosce questo mondo sa bene che una qualsiasi attività informatica (anche la semplice apertura di un sito web su WordPress) sfrutta queste dinamiche. Quindi è fondamentale iniziare a lavorare da subito sulla sicurezza e sulla prevenzione contro gli attacchi SQL Inject.
Anche perché, come riporta anche Statista, questa è una problematica molto diffusa. Anzi, nel 2023 è stata la più comune minaccia per le web application in tutto il mondo, prima ancora dell’upload dei file infetti e altro ancora. Anche se alcune fonti parlano di un decremento (seppur minimo) degli attacchi sia nei progetti open source che closed source, è fondamentale lavorare sul fronte della sicurezza per evitare accesso, furto e compromissione dei dati sensibili.
Come funziona l’attività di SQL Injection
Per capire bene come proteggere la propria attività da queste minacce dobbiamo anche conoscere le procedure di base. Che possono cambiare in base alla tipologia di attacco (leggi il prossimo paragrafo) ma per avere una visione d’insieme delle attività messe in atto dai malintenzionati e dai cybercriminali è utile definire i punti essenziali.
Ripetiamo, non è una guida per fare SQLi ma una dimostrazione, un esempio per capire quali sono le basi di questa minaccia. Tutto inizia con l’inserimento diretto di codice in campi input dedicati agli utenti per gestire comandi SQL malevoli.
Questo ti consente di manipolare le query SQL per accedere a dati sensibili o eludere l’autenticazione. Ad esempio, il classico ' OR '1'='1
ha un effetto concreto su un controllo password. E trasforma una query in modo da aprire le porte ai malintenzionati:
SELECT * FROM utenti WHERE username = 'admin' AND password = 'password';
SELECT * FROM utenti WHERE username = 'admin' AND password = '' OR '1'='1';
In pratica, in un’applicazione dove si chiede nome utente e password, l’attacco SQL Injection applica la condizione ‘1’=’1′ che sarà sempre vera, permettendo l’accesso al sistema senza conoscere la password. I danni che può provocare questa condizione li puoi facilmente immaginare: accesso non autorizzato a dati sensibili, modifica o eliminazione di dati, compromissione del sistema con esecuzione non consentita di comandi non previsti.
Ovviamente questo tutorial per SQL Injection è solo la base di partenza: le tutele si applicano e i malintenzionati aumentano la complessità degli attacchi. Ci possono essere delle alternative più articolate che troverai nel prossimo paragrafo.
Quali sono le tipologie di attacchi SQL Injection
Come puoi ben immaginare, ci possono essere diversi tipi di attacchi che rientrano nella categoria delle minacce SQL injection attacks. E per affrontare i possibili danni derivati da queste attività è utile conoscere i dettagli di questi strumenti in mano ai malintenzionati che minacciano la sicurezza delle tue infrastrutture IT.
Nell’SQL injection attacks di base, l’attaccante inserisce direttamente codice SQL malevolo nei campi di input. Ma questa è la base di partenza. Ecco una serie di evoluzioni che devi conoscere assolutamente per proteggere la tua azienda dai cybercriminali più avanzati e attenti nelle pratiche malevoli.
SQL Injection in PHP
Le minacce dell’SQL Injection in PHP si verificano quando le applicazioni progettate con questo linguaggio di programmazione si interfacciano con un database in modo non sicuro, consentendo ai cybercriminali di digitare combinazioni non validati che vengono eseguiti come comandi SQL. Oltre alla combinazione base, quella che ti consente di inserire testo diretto nel campo input, ci sono altre opzioni da prendere in considerazione.
Union-Based Injection
Questo esempio SQL Injection in PHP utilizza il comando UNION per combinare i risultati di più query. Obiettivo: estrarre dati sensibili da altre tabelle del database. Ecco come si delinea praticamente, il risultato è che il database restituisce i dati degli utenti insieme alle credenziali della tabella admin.
' UNION SELECT username, password FROM utenti --
Blind SQL Injection
Si usa quando l’attaccante non vede dei risultati diretti o dei feedback sulla pagina web. Nei Blind SQL Injection il contenuto della query non è visibile direttamente. Ma si può dedurre grazie a risposte indirette o comportamenti dell’applicazione. Questo può avvenire grazie all’approccio Boolean-Based Blind SQL Injection per ottenere un risultato booleano (vero o falso) e analizzare la risposta. Ecco un esempio:
SELECT * FROM utenti WHERE id = 1 AND 'a' = 'a'; -- Vero
SELECT * FROM utenti WHERE id = 1 AND 'a' = 'b'; -- Falso
Time-Based Injection
La seconda opzione è nota come Time-Based Blind SQL Injection. Ovvero, il malintenzionato che usa SQL Injection attacks sfrutta delle funzioni per ritardare la risposta del database (ad esempio SLEEP
) e osserva i tempi di caricamento. Ecco un altro esempio per chiarire come funziona questo tipo di SQL Injection:
SELECT * FROM utenti WHERE id = 1 AND IF('a' = 'a', SLEEP(5), 0); -- Ritardo di 5 secondi
Da questo esempio di codice SQL puoi facilmente capire di cosa stiamo parlando. Anche in questo caso, gli obiettivi sono simili all’SQL Injection di base: entrare nell’applicazione e fare danni di diversa natura come rubare dati, modificare funzionalità e mettere a rischio il lavoro dell’azienda.
Error-based SQL Injection
Questa è una tecnica avanzata di attacco informatico che sfrutta i messaggi di errore restituiti dal database per scoprire informazioni sulla struttura. Gli attaccanti comprendono l’inserimento di codice SQL malevolo in input – ad esempio un modulo web o un URL – non supervisionati. Questo porta a mostrare errori che rivelano dettagli utili per costruire ulteriori attacchi. Come, ad esempio, nomi di tabelle o Dettagli sulla sintassi SQL.
Facciamo un esempio partendo dalla classica query di verifica utente già vista in questo articolo: SELECT * FROM utenti WHERE username = 'admin' AND password = 'password';
se nel campo username aggiungiamo ' OR 1=1; --
il database non configurato bene ci porta a ottenere delle informazioni specifiche:
SQL syntax error near '1=1; --' at line 1
Questo è il punto di partenza che i malintenzionati che portano avanti attacchi Error-based SQL Injection usano per ulteriori interrogazioni utili ad approfondire la struttura del database.
SQL Server Injection
Gli attacchi SQL Server Injection utilizzano le vulnerabilità nelle applicazioni web per manipolare o compromettere un database SQL Server. Questi meccanismi permettono agli aggressori digitali di eseguire comandi SQL utili allo scopo malevolo inviando input tramite campi o URL, provocando danni di varia natura che vanno dal furto dati al caricamento di malware. Il tutto avviene attraverso l’uso di codice SQL progettato per alterare il comportamento della query. La categoria delle minacce SQL Server include a sua volta i Classic, Error, Union, Blind e Time-based SQL Injection.
Strumenti e tool per SQL Injection
Prima di analizzare i metodi per prevenire gli attacchi, è giusto fare una panoramica sugli strumenti disponibili per rilevare vulnerabilità SQL Injection e su come verificare l’efficacia delle attività svolte tramite siti per effettuare dei test. Ecco una lista di strumenti e software avanzati per il monitoraggio e la protezione dei sistemi da attacchi, inclusi i firewall per applicazioni web (WAF) e strumenti di scansione dei siti vulnerabili a SQL Injection.
- Sqlmap – Strumento open source che automatizza il rilevamento delle iniezioni SQL. È un tool creato in Python ed è utilizzato da esperti di sicurezza informatica per i test di penetrazione in grado di individuare problemi di sicurezza nei loro database. SQLmap analizza gli input di un’applicazione web per individuare punti vulnerabili e riproduce diverse tecniche come Union-based, Boolean-based blind, Time-based.
- The Mole – Presentato come Automatic SQL Injection Exploitation Tool, The Mole è un progetto gratuito e open source ospitato su SourceForge. Come funziona? Devi inserire l’URL che vuoi testare nello strumento. Questo tool può rilevare la vulnerabilità dall’URL utilizzando tecniche Union o Boolean.
- Sqlninja – Questo è un tool pensato per sfruttare le vulnerabilità su un’applicazione web che utilizza Microsoft SQL Server. Il suo obiettivo principale è fornire un accesso remoto, anche in un ambiente molto ostile. Rappresenta uno strumento essenziale quando viene utilizzato dai programmatori per effettuare test di penetrazione e scoprire eventuali vulnerabilità da sistemare e anticipare al meglio.
- Intruder – SQL Injection Scanner è una funzionalità legata a una piattaforma di cybersecurity (Intruder) per identificare e risolvere problemi di sicurezza nelle applicazioni web. È particolarmente efficace nel rilevare vulnerabilità comuni come SQL injection e cross-site scripting (XSS). Il tool esegue scansioni automatiche se vengono scoperte nuove vulnerabilità e avvisa il team per mitigare i rischi.
Come anticipato, è giusto citare anche difese in grado di anticipare e prevenire gli attacchi SQLi. Nello specifico, tra i Web Application Firewall – WAF utilizzati per proteggere le applicazioni web da attacchi come SQL injection e cross-site scripting XSS – ricordiamo che ci sono modelli sia commerciali che Open Source. Qualche esempio:
- NAXSI (Nginx Anti XSS and SQL Injection).
- Azure Web Application Firewall.
- ModSecurity
- AWS.
- Cloudflare WAF
- Oracle Cloud Infrastructure WAF (SaaS)
Citiamo anche Sucuri Firewall progettato per siti web, con protezione contro attacchi SQL e supporto DDoS, e Wallarm che combina WAF e RASP (Runtime Application Self-Protection).
Prevenzione e difesa contro la SQL Injection
Dopo aver analizzato i diversi tipi di attacchi SQL Injection e capito che ci sono delle minacce importanti da contrastare. Ed è giusto prendere delle precauzioni per evitare queste attività. Come avrai capito, l’attacco basato sulle tecniche di SQL Injection si basano sulla capacità del malintenzionato di carpire dettagli sulle azioni del database.
Validazione degli input
Uno dei primi punti da mettere in pratica per impedire che queste minacce diventino pericolose: bisogna validare tutti gli input degli utenti e rimuovere caratteri non validi o potenzialmente dannosi. In che modo puoi ottenere questo? Chiedi al programmatore di usare whitelist per i campi con valori predefiniti. Tipo per i numeri verifica che contengano solo cifre (is_numeric()
in PHP).
Sempre a proposito di input e campi da compilare: imposta dei limiti adeguati alla lunghezza dei dati che l’utente può scrivere. Per inserire un nome, ad esempio, non sono necessari centinaia di caratteri: non avere dei limiti in questi casi offre l’opportunità ai malintenzionati di operare come desiderano.
Query parametrizzate
Devi usare query parametrizzate (o prepared statements, anche noti come statement parametrizzati) che operano con dei parametri chiamati placeholder o bind variable. In questo modo è possibile memorizzare un valore del tipo specificato evitando l’iniezione di codice malevolo. Ecco un esempio di query parametrizzata con i dati dell’utente vengono separati dalla logica SQL.
// Connessione al database
$pdo = new PDO('mysql:host=localhost;dbname=miodatabase', 'user', 'password');
// Query parametrizzata
$sql = "SELECT * FROM utenti WHERE username = :username AND password = :password";
$stmt = $pdo->prepare($sql);
// Esegui la query con i parametri
$stmt->execute([
':username' => $_POST['username'],
':password' => $_POST['password']
]);
// Verifica i risultati
if ($stmt->rowCount() > 0) {
echo "Login riuscito!";
} else {
echo "Username o password errati.";
}
Altro dettaglio di buon senso: devi attivare il principio del privilegio minimo. Ogni utente che accede al database dovrebbe avere solo i privilegi necessari.
H3: Sfrutta le tecniche di escaping
L’escape nel campo della protezione dagli attacchi SQL permette di aggiungere un prefisso o una sequenza di caratteri speciali davanti ai simboli potenzialmente dannosi (ad esempio ‘, “, ;, –) per impedirne l’interpretazione come comando. Quindi, le stringhe inserite dagli utenti vengono trasformate in combinazioni sicure prima di essere aggiunte nelle query. Tipo con il PHP, puoi usare mysqli_real_escape_string()
per sanificare i dati prima di inserirli in una query. Ecco un esempio:
$mysqli = new mysqli("localhost", "user", "password", "database");
// Input non sicuro
$username = $_POST['username'];
// Escaping
$safe_username = $mysqli->real_escape_string($username);
// Query
$query = "SELECT * FROM utenti WHERE username = '$safe_username'";
$result = $mysqli->query($query);
Inoltre, la comunicazione degli errori database non devono essere dettagliati in pubblico: assicurati che non riveli informazioni all’utente e che si mostri solo un messaggio generico.
Un aiuto per ottimizzare il tutto
Prevenire SQL Injection vuol dire anche prendersi cura dell’infrastruttura, aggiornando tutto ciò che può essere soggetto ad attacchi, e valutare la competenza del personale interno che deve avere le conoscenze necessarie per evitare minacce. In questi casi, noi possiamo aiutarti a raggiungere il livello di sicurezza necessario per prevenire SQL Injection con l’uso di query parametrizzate, la validazione dell’input e tecniche di escape.
Desideri parlare con un nostro esperto? Contattaci
Ultime News Concetti di sicurezza informatica
-
Cos’è e come difendersi dallo sneaky phishing
20 Novembre 2024 -
Come prevenire gli attacchi ransomware
25 Maggio 2024 -
Ransomware: gestione avanzata, tendenze e futuro
16 Maggio 2024 -
Strategie avanzate contro il malware
2 Maggio 2024 -
Come prevenire, rilevare e analizzare il malware
29 Aprile 2024 -
Pharming: Cos’è, Tipologie e Come prevenirlo
21 Dicembre 2023 -
Phishing: cos’è e come prevenirlo
23 Ottobre 2023 -
La Cybersecurity prevista dall’UE: Direttiva NIS e Cybersecurity Act
26 Settembre 2023 -
Crittografia simmetrica e asimmetrica: significato e differenze
7 Settembre 2023
Sicurezza informatica e cybersecurity
-
NIS2, cosa significa e come inserire la direttiva in azienda
26 Ottobre 2024 -
Cos’è un Ransomware? Ecco come attacca e come puoi proteggerti
14 Ottobre 2024 -
Come implementare il penetration test?
6 Aprile 2024 -
Sangfor: Soluzioni HCI, Cyber e Cloud
9 Gennaio 2024