Tutorial sull'iniezione SQL: impara con l'esempio

⚡ Riepilogo intelligente

L'SQL injection è un attacco che avvelena le istruzioni SQL dinamiche per aggirare l'autenticazione o esporre dati, sfruttando le applicazioni web che creano query a partire da input utente non sanificati. Questa pagina illustra il funzionamento dell'attacco e come prevenirlo.

  • ???? Definizione: L'iniezione SQL inserisce codice SQL dannoso in una query tramite un campo di input non convalidato.
  • 🔓 Impatto: Un attacco riuscito può aggirare le procedure di accesso e leggere, modificare o eliminare i record.
  • 🧪 Esempio: Una condizione sempre vera, unita a un commento, trasforma un controllo di accesso in un bypass.
  • Strumenti: SQLMap e jSQL automatizzano il rilevamento e lo sfruttamento dei parametri iniettabili.
  • 🛡️ Prevenzione: Query parametrizzate, convalida degli input e account con privilegi minimi colmano il divario.
  • 🤖 Aspetto moderno: Gli scanner e i firewall basati sull'intelligenza artificiale segnalano schemi di iniezione che le firme fisse non rilevano.

Tutorial sull'iniezione SQL

Cos'è un'iniezione SQL?

L'SQL Injection è un attacco che avvelena le istruzioni SQL dinamiche, commentando determinate parti dell'istruzione o aggiungendo una condizione che risulterà sempre vera. Sfrutta i difetti di progettazione delle applicazioni web mal progettate per eseguire codice SQL dannoso.

I dati sono una delle componenti più vitali dei sistemi informativi. Le applicazioni web basate su database vengono utilizzate dalle organizzazioni per ottenere dati dai clienti. SQL è l'acronimo di Structured Query LanguageViene utilizzato per recuperare e manipolare i dati nel database.

Schema che illustra come un'iniezione SQL manipola una query di database dinamica.

Come funziona un attacco di SQL injection?

Le tipologie di attacchi che possono essere eseguiti tramite SQL injection variano a seconda del tipo di motore di database. L'attacco si basa su istruzioni SQL dinamiche. Un'istruzione dinamica è un'istruzione generata in fase di esecuzione utilizzando parametri passati da un modulo web o da una stringa di query URI.

Esempio di iniezione SQL

Consideriamo una semplice applicazione web con un modulo di accesso. Il codice HTML del modulo è mostrato di seguito.

<form action=‘index.php’ method="post">

<input type="email" name="email" required="required"/>

<input type="password" name="password"/>

<input type="checkbox" name="remember_me" value="Remember me"/>

<input type="submit" value="Submit"/>

</form>

QUI,

  • Il modulo sopra riportato accetta l'indirizzo email e la password, quindi li invia a un PHP file denominato index.php.
  • Ha un'opzione per memorizzare la sessione di accesso in un cookie. Lo abbiamo dedotto dalla casella di controllo remember_me. Utilizza il metodo post per inviare i dati. Ciò significa che i valori non vengono visualizzati nel URL.

Supponiamo che l'istruzione nel backend per la verifica dell'ID utente sia la seguente.

SELECT * FROM users WHERE email = $_POST['email'] AND password = md5($_POST['password']);

QUI,

  • L'istruzione precedente utilizza direttamente i valori dell'array $_POST[] senza sanificarli.
  • La password viene crittografata utilizzando l'algoritmo MD5.

Illustreremo un attacco di iniezione SQL utilizzando SQL Fiddle. Apri il URL http://sqlfiddle.com/ nel tuo browser web. Otterrai la seguente finestra.

Nota: dovrai scrivere le istruzioni SQL.

Vuoto SQL Fiddle finestra pronta per lo schema e la query

Passo 1) Inserisci questo codice nel riquadro a sinistra.

CREATE TABLE `users` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `email` VARCHAR(45) NULL,
  `password` VARCHAR(45) NULL,
  PRIMARY KEY (`id`));
  
  
insert into users (email,password) values ('m@m.com',md5('abc'));

Passo 2) Fai clic su Crea schema.

Passo 3) Inserisci questo codice nel riquadro di destra.

select * from users;

Passo 4) Fai clic su Esegui SQL. Vedrai il seguente risultato.

SQL Fiddle risultato che mostra il singolo record utente restituito

Supponiamo che un utente inserisca admin@admin.sys e 1234 come password. L'istruzione eseguita sul database sarebbe:

SELECT * FROM users WHERE email = 'admin@admin.sys' AND password = md5('1234');

Il codice sopra riportato può essere sfruttato commentando la parte relativa alla password e aggiungendo una condizione che risulterà sempre vera. Supponiamo che un utente malintenzionato inserisca il seguente input nel campo dell'indirizzo email.

xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ]

xxx per la password.

L'istruzione dinamica generata sarà la seguente.

SELECT * FROM users WHERE email = 'xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ] AND password = md5('1234');

QUI,

  • xxx@xxx.xxx termina con un apice singolo che completa la citazione della stringa.
  • OR 1 = 1 LIMITE 1 è una condizione che sarà sempre vera e limita i risultati restituiti a un solo record.
  • — ' AND … è un commento SQL che elimina la parte relativa alla password.

Copia l'istruzione SQL sopra e incollala in SQL Fiddle Eseguire la query SQL nella casella di testo come mostrato di seguito.

SQL Fiddle restituzione del record dopo l'esecuzione della condizione iniettata

Attività di hacking: SQL Inject in un'applicazione Web

Abbiamo una semplice applicazione web su http://www.techpanda.org/ Questo codice HTML è vulnerabile agli attacchi di SQL Injection ed è utilizzato solo a scopo dimostrativo. Il codice HTML sopra riportato è tratto dalla pagina di login. L'applicazione offre funzionalità di sicurezza di base, come la sanificazione del campo email. Ciò significa che il codice sopra riportato non può essere utilizzato per aggirare la procedura di login.

Per aggirare questo problema, sfruttiamo invece il campo della password. Il diagramma seguente mostra i passaggi da seguire.

Diagramma di flusso dei passaggi per inserire il campo password nel modulo di accesso

Supponiamo che un attaccante fornisca il seguente input.

  • Passaggio 1: inserisci xxx@xxx.xxx come indirizzo email
  • Passaggio 2: immettere xxx') OPPURE 1 = 1 — ]

Modulo di accesso con la stringa di iniezione inserita nel campo password

  • Fai clic sul pulsante Invia.
  • Verrai indirizzato alla dashboard.

L'istruzione SQL generata sarà la seguente.

SELECT * FROM users WHERE email = 'xxx@xxx.xxx' AND password = md5('xxx') OR 1 = 1 -- ]');

Il diagramma seguente illustra come viene generata l'istruzione.

Spiegazione dettagliata di come viene generata l'istruzione SQL iniettata.

QUI,

  • L'affermazione presuppone, in modo intelligente, che venga utilizzata la crittografia MD5.
  • Completa l'apostrofo e la parentesi chiusa.
  • Aggiunge una condizione all'affermazione, che sarà sempre vera.

In generale, un attacco riuscito combina diverse tecniche come quelle illustrate sopra.

Altri tipi di attacchi SQL injection

Le iniezioni SQL possono causare danni ben più gravi del semplice aggiramento degli algoritmi di accesso. Alcuni esempi di attacchi includono:

  • Eliminazione dei dati
  • Aggiornamento dei dati
  • Inserimento dati
  • Esecuzione di comandi sul server che possono scaricare e installare programmi dannosi come trojan
  • Esportazione di dati preziosi come dettagli di carte di credito, e-mail e password sul server remoto dell'aggressore
  • Recupero dei dati di accesso dell'utente, ecc.
  • SQL injection basata sui cookie
  • Iniezione SQL basata su errori
  • Iniezione SQL cieca

L'elenco di cui sopra non è esaustivo; fornisce solo un'idea di cosa può fare l'SQL Injection.

Strumenti di automazione per SQL Injection

Nell'esempio precedente, abbiamo utilizzato tecniche di attacco manuali basate sulla nostra vasta conoscenza di SQL. Esistono strumenti automatizzati che possono aiutarti a eseguire gli attacchi in modo più efficiente e nel minor tempo possibile. Questi strumenti includono:

Come prevenire gli attacchi di SQL injection

Un'organizzazione può adottare la seguente politica per proteggersi dagli attacchi SQL Injection.

  • Non bisogna mai fidarsi dell'input dell'utente. – Deve essere sempre sanificato prima di essere utilizzato in istruzioni SQL dinamiche.
  • Procedura di archiviazione – questi possono incapsulare le istruzioni SQL e trattare tutti gli input come parametri.
  • Dichiarazioni preparate – Le istruzioni preparate funzionano creando prima l'istruzione SQL e poi trattando tutti i dati inviati dall'utente come parametri. Ciò non ha alcun effetto sulla sintassi dell'istruzione SQL.
  • Espressioni regolari – questi strumenti possono essere utilizzati per rilevare codice potenzialmente dannoso e rimuoverlo prima dell'esecuzione delle istruzioni SQL.
  • diritti di accesso dell'utente alla connessione al database – solo i diritti di accesso necessari devono essere concessi agli account utilizzati per connettersi al database. Ciò può aiutare a ridurre ciò che le istruzioni SQL possono eseguire sul server.
  • Messaggio di errore – questi messaggi non devono rivelare informazioni sensibili o il punto esatto in cui si è verificato l'errore. Invece di visualizzare le istruzioni SQL che hanno causato l'errore, è possibile utilizzare semplici messaggi di errore personalizzati come "Siamo spiacenti, si stanno verificando errori tecnici. Il team di assistenza è stato contattato. Riprova più tardi".

Attività di hacking: utilizzare Havij per SQL Injection

In questo scenario pratico, utilizziamo il programma Havij Advanced SQL Injection per scansionare un sito web alla ricerca di vulnerabilità.

Nota: Havij è un sito datato e non mantenuto Windows Lo strumento SQLMap menzionato sopra rappresenta l'attuale standard open-source.

Nota: il tuo programma antivirus potrebbe segnalarlo a causa della sua natura. Dovresti aggiungerlo all'elenco delle esclusioni o sospendere il tuo programma antivirus.

L'immagine qui sotto mostra la finestra principale di Havij.

Finestra principale dello strumento di iniezione SQL Havij

Lo strumento sopra descritto può essere utilizzato per valutare la vulnerabilità di un sito web o di un'applicazione.

DOMANDE FREQUENTI

Solo con l'autorizzazione scritta del proprietario del sito. Testare un'applicazione di cui non si è proprietari è illegale ai sensi di leggi come il Computer Fraud and Abuse Act statunitense. Gli ambiti dei programmi di bug bounty definiscono ciò che è consentito.

Sì. Nella OWASP Top 10:2025, l'iniezione SQL è classificata A05 e i test continuano a rilevarla in quasi tutte le applicazioni. Con migliaia di nuove vulnerabilità CVE relative all'iniezione SQL ogni anno, rimane uno dei principali rischi per il web.

MD5 è un algoritmo di hashing veloce, non di crittografia, e gli hacker possono decifrarlo rapidamente con tabelle arcobaleno e GPU. Per le password, è preferibile utilizzare un algoritmo più lento e con salt, come bcrypt o Argon2.

Qualsiasi database interrogato tramite SQL generato dinamicamente — MySQL, PostgreSQL, Microsoft SQL Server, Oraclee SQLiteIl problema risiede nel modo in cui l'applicazione concatena l'input dell'utente nelle query, non nel motore del database.

I firewall e gli scanner basati sull'intelligenza artificiale apprendono i modelli di traffico normali e segnalano in tempo reale input anomali, come condizioni o commenti iniettati. I modelli di apprendimento automatico individuano payload offuscati che le firme predefinite non riescono a rilevare.

Assistenti AI come Copilota GitHub Possono suggerire query parametrizzate e convalida dell'input, ma riproducono anche schemi non sicuri. Considera ogni suggerimento come una bozza e abbinalo a un linter di sicurezza per una revisione.

L'SQL injection prende di mira il database iniettando codice SQL nelle query lato server. Il cross-site scripting prende di mira altri utenti iniettando script che vengono eseguiti nei loro browser. Il primo espone i dati; il secondo dirotta le sessioni.

Un ORM (object-relational mapper) costruisce query a partire da oggetti di codice con parametrizzazione predefinita, prevenendo la maggior parte delle iniezioni SQL. Non è infallibile: le query non elaborate e i metodi non sicuri possono comunque causare vulnerabilità, quindi la validazione rimane fondamentale.

Riassumi questo post con: