Cos'è l'SQL Injection? Come prevenire gli attacchi SQLi
Pubblicato: 2023-09-15Le applicazioni Web alimentano la nostra esperienza online giorno dopo giorno. Ci connettiamo, interagiamo, facciamo acquisti e guardiamo video divertenti di gatti, il tutto utilizzando app web. Forniscono servizi aziendali vitali e conservano dati sensibili, ma più utilizziamo qualcosa, più diventa soggetto ad attacchi.
Un attacco informatico a cui prestare attenzione sulle app che sfruttano le vulnerabilità nel linguaggio di query strutturato (SQL) è la comune e pericolosa SQL injection.
Cos'è l'iniezione SQL?
SQL injection (SQLi) è una tecnica di iniezione di codice dannosa utilizzata dagli aggressori informatici per sfruttare le vulnerabilità nelle applicazioni web. Sfruttano i punti deboli per ottenere l'accesso non autorizzato aggiungendo una stringa di codice dannoso a una query del database.
Gli attacchi SQL injection portano ad accesso improprio ai dati, manipolazione, furto di identità, perdite finanziarie, danni alla reputazione e conseguenze legali. Gli sviluppatori e le organizzazioni devono comprenderne i rischi e implementare misure di sicurezza complete. Strumenti come il software WAF (Web Application Firewall) e il software di analisi forense digitale sono progettati per proteggersi dagli attacchi SQL injection. Le aziende possono anche fare affidamento su suite complete di sicurezza dei siti Web per proteggere le proprie app.
Leggi questo cheat sheet di SQL injection per sapere come vengono eseguiti gli attacchi SQL con esempi, le loro varianti e come prevenire tali attacchi.
Perché gli attacchi SQL injection sono pericolosi?
SQL injection è da anni nella top 10 dei rischi per la sicurezza delle applicazioni web stilata dall'Open Worldwide Application Security Project (OWASP). Solo nel 2022, OWASP ha riscontrato oltre 274.000 casi di qualche forma di iniezione nelle app testate; SQL injection e cross-site scripting (XSS) erano i più comuni.
Gli aggressori possono utilizzare SQL injection per causare:
- Errori nelle applicazioni web modificando o eliminando informazioni all'interno di un database.
- Violazioni dei dati se gli hacker ottengono l'accesso non autorizzato ai dati sensibili archiviati nei database, come informazioni personali, documenti finanziari o password.
- Sistemi compromessi accedendo a sistemi aggiuntivi non autorizzati che utilizzano gli stessi database condivisi. Ciò consente agli aggressori di estendere i propri attacchi ad altri sistemi sulla stessa rete o eseguire un Denial of Service distribuito (DDoS).
Queste azioni distruttive danneggiano irrevocabilmente le imprese. I reati compromettono la privacy e l’integrità dei dati, portando alla perdita della fiducia dei clienti e della reputazione aziendale. Inoltre, aggiunge un onere finanziario alla società che deve affrontare le conseguenze.
Esempi di attacchi SQL injection reali
Sono passati più di due decenni da quando l'SQL injection è entrata in scena per la prima volta. Venti anni dopo, rimane noto, come evidenziato dai seguenti importanti incidenti di SQL injection.
- Heartland Payments Systems: nel 2008, Heartland Payments Systems ha subito quella che è stata una delle più grandi violazioni di dati della storia, esponendo oltre 130 milioni di dettagli di carte di credito e debito attraverso un attacco SQLi. Heartland ha pagato milioni di multe.
- Yahoo : nel 2012, un attacco SQL injection ha compromesso i dettagli degli account di quasi 5 milioni di utenti Yahoo, inclusi indirizzi e-mail e password.
- Freepik: gli hacker hanno rubato le e-mail e le password di 8,3 milioni di utenti Freepik e Flaticon nel 2020 durante un attacco SQL injection contro il sito Web Flaticon dell'azienda.
- WooCommerce: il popolare plugin WordPress ha risolto una vulnerabilità SQL injection che esponeva 5 milioni di siti al furto di dati.
- BillQuick: i criminali informatici hanno sfruttato una vulnerabilità Blind SQL nella popolare piattaforma di fatturazione per diffondere ransomware.
- MOVEit: nel maggio 2023, il gruppo di ransomware Cl0p ha utilizzato una vulnerabilità SQL injection nello strumento software di trasferimento file gestito MOVEit, colpendo oltre 1.000 organizzazioni e almeno 60 milioni di individui, rendendola la più grande violazione di dati avvenuta finora nell'anno.
Come funziona un attacco SQL injection?
Diamo un'occhiata alle basi dei database e delle query SQL che utilizziamo nelle moderne applicazioni web. Questo ci aiuterà a comprendere meglio il funzionamento interno dell'SQL injection.
Tutti i siti Web utilizzano database relazionali, chiamati anche database SQL, per archiviare dati sui propri utenti e app. Potrebbero essere informazioni sull'utente, credenziali di accesso, informazioni di pagamento o qualsiasi altra cosa relativa all'azienda. Prendiamo ad esempio un sito di e-commerce. Memorizza i dati dei prodotti, gli account utente, i dati degli ordini e le informazioni di pagamento nel suo database.
I siti Web quindi prendono i dati da questi database e forniscono contenuti o servizi specifici per gli utenti. Questo processo avviene grazie a SQL, un linguaggio di programmazione standardizzato utilizzato per la gestione dei database. Ogni volta che hai bisogno di ottenere qualcosa da un'app, ad esempio la cronologia degli acquisti, stai, infatti, effettuando una richiesta al database utilizzando query SQL, un comando che istruisce un database a eseguire un'azione specifica.
Nel tentativo di rendere fluide le interazioni web, molti siti Web consentono agli utenti di inserire dati per eseguire query SQL. Ciò può includere elementi come termini di ricerca, nomi utente o dettagli di pagamento.
Consideriamo l'esempio del sito web di e-commerce. Una semplice query SQL per visualizzare la cronologia degli ordini dal database con la tabella "ordini" (o) e una tabella "prodotti" (p) sarà la seguente:
SELEZIONA o.id_ordine, o.data_ordine, p.nome_prodotto, p.prezzo
DA ordini o
UNISCITI ai prodotti p ON o.product_id = p.product_id
DOVE o.user_id = 12345;
Questo codice SQL preleva l'ID ordine e la data dalla tabella degli ordini, insieme al nome del prodotto e al prezzo dalla tabella dei prodotti per l'ID UTENTE 12345 dal database del sito web. In genere, l'ID sarà basato sull'input dell'utente. I problemi sorgono quando l'input non viene adeguatamente controllato e controllato. Gli aggressori sfruttano questa vulnerabilità per effettuare un attacco SQL injection.
Ecco come si svolge in genere.
- Identificazione dei campi di input vulnerabili: gli aggressori iniziano trovando i campi di input nell'applicazione web in cui possono potenzialmente iniettare codice dannoso. Inviano valori diversi e vedono come risponde l'app. per scoprire se. Se l'applicazione non convalida o disinfetta correttamente l'input dell'utente, l'applicazione lo elabora come codice SQL. Questa potenziale vulnerabilità viene utilizzata per l'iniezione di codice.
- Iniezione di codice tramite input dell'utente: dopo aver compreso come l'applicazione gestisce l'input, gli aggressori costruiscono un payload, ovvero un pezzo di codice SQL dannoso che sfrutta la vulnerabilità. Ciò include l'aggiunta di caratteri di controllo SQL come virgolette singole ('), virgolette doppie (“) o uguali (=) per modificare la struttura della query SQL. L'utilizzo di questi caratteri di controllo con comandi SQL comuni come SELECT e FROM consente agli aggressori di accedere o recuperare dati dal server del database.
Quindi inviano input appositamente predisposti insieme a richieste legittime, inducendo l'applicazione a considerare il codice ombreggiato come una parte legittima della query. - Esecuzione: il database, ignaro dell'attacco, elabora la query ed esegue il codice inserito come se fosse una richiesta legittima.
- Sfruttamento: a seconda delle intenzioni dell'aggressore, il codice SQL inserito potrebbe recuperare dati sensibili, modificare o eliminare informazioni o persino garantire l'accesso non autorizzato. Ciò compromette la sicurezza dell'applicazione, esponendo potenzialmente informazioni sensibili.
Esempio di iniezione SQL
Considera un'applicazione web che utilizza un parametro URL per recuperare i dettagli del prodotto in base a un ID prodotto, come questo:
http://example.com/products?id=1
Un utente malintenzionato potrebbe provare a inserire codice SQL dannoso per causare un errore e recuperare informazioni come queste: http://example.com/products?id=1' OR 1=1; –
Se l'applicazione non riesce a convalidare e disinfettare adeguatamente l'input dell'utente, la query SQL potrebbe essere manipolata come segue:
SELEZIONA * DA prodotti DOVE OPPURE 1=1; - -';
In questo caso, la query originale era progettata per recuperare un prodotto con ID 1, ma l'input dell'utente malintenzionato modifica la query per restituire tutti i prodotti a causa dell'aggiunta di 1=1 e del doppio trattino aggiunto (- -). Annulla le virgolette singole di chiusura originali e porta a conseguenze che mostrano tutti i dettagli del prodotto o rivelano messaggi di errore che gli aggressori possono sfruttare.
33%
delle vulnerabilità critiche delle applicazioni web nel 2022 erano dovute a SQL injection.
Fonte: Statista
La diffusa prevalenza delle vulnerabilità SQL e l’attrattiva del database delle app Web con tutti i suoi dati critici per l’azienda rendono l’SQL injection uno degli attacchi informatici più persistenti.
Fonte: Spiceworks
Tipi di attacchi SQL injection
Esistono tre tipi principali di attacchi SQL injection basati sul modo in cui gli aggressori recuperano informazioni o interagiscono con il database:
- SQLi classico o in banda
- SQLi cieco o inferenziale
- SQLi fuori banda
1. SQLi classico o in banda
In banda è il tipo più comune di attacco SQL injection. L'hacker classico utilizza lo stesso canale di comunicazione (in banda) per iniettare codice SQL dannoso e recuperare i risultati. Le due principali varianti di SQLi in banda sono:
SQLi in banda basato sull'Unione
Questo attacco sfrutta l'operatore UNION SQL, utilizzato per combinare i dati dal risultato di due o più istruzioni SELECT. In questo modo, gli aggressori possono recuperare dati da tabelle a cui non hanno accesso diretto.
SQLi in banda basato su errori
Con questa tecnica, un utente malintenzionato attiva intenzionalmente errori in una query SQL per sfruttare i messaggi di errore restituiti dal database. Gli errori possono rivelare informazioni preziose sulla struttura del database, sui nomi delle tabelle, sui nomi delle colonne e talvolta sui dati stessi. L'SQLi basato sugli errori può essere eseguito anche come SQLi fuori banda.
2. SQLi inferenziale (cieco).
In un SQLi cieco, l'aggressore non può vedere direttamente i risultati del suo attacco. Invece, deducono informazioni osservando il comportamento dell'applicazione o i messaggi di errore che rispondono alle loro query. Questo tipo di attacco richiede molto tempo poiché gli hacker devono effettuare una serie di query SQL per trovare potenziali vulnerabilità da sfruttare. Due varianti di SQLi cieco sono:
SQLi cieco basato sul tempo
In questo caso, gli aggressori pongono domande che fanno ritardare la risposta del database prima di reagire. Deducono informazioni sul database prestando attenzione ai tempi di risposta.
SQLi cieco booleano
Per Boolean Blind SQLi, gli aggressori sfruttano il modo in cui un'applicazione risponde a condizioni vere o false nelle query SQL. In base alle risposte dell'applicazione web, deducono informazioni sul database, anche se non viene restituito alcun dato dal database.
3. SQLi fuori banda
Un attacco SQLi fuori banda fa sì che l'applicazione invii dati a un endpoint remoto controllato dagli hacker. Un attacco come questo richiede che i server SQL dispongano di determinate funzionalità, come la capacità di avviare richieste di rete esterne come le richieste HTTP (Hypertext Transfer Protocol).
Come prevenire gli attacchi SQL injection: un cheat sheet
Prevenire l’SQL injection richiede un approccio a più livelli che coinvolga pratiche di codifica sicure e monitoraggio continuo. Ecco un foglietto illustrativo con i passaggi essenziali per proteggerti dagli attacchi SQL injection.
Utilizzare dichiarazioni preparate
La difesa principale contro gli attacchi SQL injection è costituita da istruzioni preparate con query parametrizzate. Le istruzioni preparate garantiscono che gli input dell'utente vengano trattati come dati anziché come codice eseguibile.
Gli sviluppatori compilano in anticipo i codici SQL per le query come modelli con segnaposto per i valori di input dell'utente. Al momento dell'esecuzione della query, le istruzioni preparate associano i valori effettivi anziché i segnaposto. Ciò interrompe l'esecuzione di codice dannoso.
Le istruzioni preparate sono preferite rispetto alle istruzioni SQL dinamiche. Scrivono query SQL durante il tempo di esecuzione, il che li indebolisce contro gli attacchi injection.
Dichiarazioni preparate nei linguaggi di programmazione più diffusi:
Di seguito sono riportati i consigli specifici del linguaggio per l'utilizzo di istruzioni preparate (query parametrizzate) nella programmazione di database più diffusa:
- Java Enterprise Edition (EE): utilizzare la classe PreparedStatement dal pacchetto java.sql. Associa i parametri utilizzando metodi come setString , setInt , ecc.
- Python (SQLite3) : utilizza i segnaposto ( ? ) nelle query. Associa i parametri utilizzando una tupla o una lista .
- PHP: utilizza l'estensione PHP Data Objects (PDO) . Utilizza istruzioni preparate con segnaposto (:). Associare i parametri con bindValue o bindParam .
- .NET : utilizza l'oggetto MySqlCommand . Associare i parametri utilizzando Parametri.AddWithValue .
Un altro metodo di prevenzione dell'SQL injection è l'uso di procedure memorizzate o di un gruppo di codici SQL precompilati che possono essere utilizzati più e più volte.
Esercitati nella convalida degli input
La convalida dell'input prevede il controllo dell'input dell'utente per assicurarsi che soddisfi criteri specifici prima dell'elaborazione. Una lista consentita, nota anche come lista bianca, è un aspetto chiave della convalida dell'input. Qui, solo valori o modelli predefiniti e sicuri vengono accettati come parte delle query SQL. Qualsiasi input che non corrisponde ai criteri impostati viene rifiutato. Ciò impedisce attivamente l'ingresso di input maligni o imprevisti nel sistema.
Utilizzare librerie di mapping relazionale a oggetti
Le librerie ORM (Object-Relational Mapping) sono strumenti preziosi per gli sviluppatori che lavorano con database relazionali. Consentono agli sviluppatori di interagire con i database utilizzando il linguaggio di programmazione di loro scelta, riducendo così la necessità di scrivere query SQL non elaborate. Le librerie ORM forniscono protezione integrata contro gli attacchi SQL injection.
Formare gli sviluppatori e i team IT sulle pratiche di codifica sicure. Assicurati di eseguire controlli di sicurezza regolari e test di penetrazione per individuare le vulnerabilità.
Suggerimento: aiuta i tuoi programmatori e sviluppatori ad apprendere più velocemente la codifica sicura con strumenti di formazione sul codice sicuro.
Applicare il principio del privilegio minimo
Il principio del privilegio minimo fornisce agli utenti del database solo il permesso minimo richiesto per svolgere il proprio lavoro. Seguendo questo principio si riduce l’impatto di potenziali attacchi SQL injection o di qualsiasi attacco informatico. Inoltre, applica un rigoroso controllo degli accessi al tuo database.
Distribuire un firewall per applicazioni Web (WAF)
Un WAF monitora il traffico di rete in entrata delle applicazioni e blocca il potenziale traffico dannoso in base a un elenco di firme di attacco ben note.
I 5 principali strumenti Web Application Firewall (WAF):
- Firewall applicazione Web di Azure
- AWSWAF
- Firewall per applicazioni Web Imperva (WAF)
- Spettro di Cloudflare
- Symantec Web Application Firewall e proxy inverso
* Sopra sono riportate le cinque principali soluzioni WAF del Grid Report dell'estate 2023 di G2.
Un WAF utilizza regole predefinite per rilevare modelli sospetti e anomalie nel traffico in entrata, come parole chiave SQL e payload dannosi. Disinfetta e convalida gli input dell'utente e blocca o filtra le richieste dannose. Ciò aiuta a bloccare le query SQL pericolose quando entrano nel sistema.
I moderni WAF si adattano ai nuovi metodi di attacco utilizzando l’apprendimento automatico.
Altri strumenti di sicurezza per prevenire attacchi SQL injection
Oltre a WAF, diverse altre piattaforme di sicurezza impediscono gli attacchi SQL injection.
- Gli scanner delle vulnerabilità cercano vulnerabilità note e sconosciute nelle applicazioni web.
- Gli strumenti SAST (Static Application Security Testing) e il software di analisi statica del codice rilevano le vulnerabilità della sicurezza senza eseguire effettivamente il codice.
- Il software di test dinamico della sicurezza delle applicazioni simula gli attacchi alle applicazioni in esecuzione e identifica i punti deboli.
- I sistemi di rilevamento e prevenzione delle intrusioni e i software di analisi forense digitale indagano sulle anomalie e sugli attacchi alle applicazioni in tempo reale.
Proteggi le tue fortezze di dati
Gli attacchi SQL injection rappresentano una grave minaccia per la sicurezza delle app Web. Se gli attacchi hanno successo, le aziende rischiano di perdere dati preziosi, la privacy degli utenti e la loro buona reputazione.
Anche se nessuna soluzione singola garantisce la sicurezza assoluta contro l’SQL injection, la combinazione delle misure preventive di cui abbiamo parlato qui riduce significativamente la possibilità di attacchi. Gli sviluppatori Web e gli amministratori di database dovrebbero adottare difese rigorose e rafforzare le proprie app Web contro potenziali sfruttamenti.
Desideri una soluzione completa per proteggere il tuo sito web? Esplora il software di sicurezza web e il modo in cui aiuta contro gli attacchi informatici che portano alla violazione dei dati.