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.

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.
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.
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.
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 = 1LIMITE 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.
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.
Supponiamo che un attaccante fornisca il seguente input.
- Passaggio 1: inserisci xxx@xxx.xxx come indirizzo email
- Passaggio 2: immettere xxx') OPPURE 1 = 1 — ]
- 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.
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:
- Mappa SQL – http://sqlmap.org/
- Iniezione jSQL – https://www.kali.org/tools/jsql/
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.
Lo strumento sopra descritto può essere utilizzato per valutare la vulnerabilità di un sito web o di un'applicazione.








