Tutorial sull'iniezione SQL: come imparare con l'esempio

Cos'è un'iniezione SQL?

SQL Injection è un attacco che avvelena le istruzioni SQL dinamiche per commentare alcune parti dell'istruzione o aggiungere una condizione che sarà sempre vera. Sfrutta i difetti di progettazione delle applicazioni Web mal progettate per sfruttare le istruzioni SQL per eseguire codice SQL dannoso.

I dati sono uno dei componenti più vitali dei sistemi informativi. Le applicazioni Web basate su database vengono utilizzate dall'organizzazione per ottenere dati dai clienti. SQL è l'acronimo di Structured Query Language. Viene utilizzato per recuperare e manipolare i dati nel database.

SQL Injection

Come funziona l'attacco SQL Injection?

I tipi di attacchi che possono essere eseguiti utilizzando SQL injection variano a seconda del tipo di motore di database. L'attacco funziona su istruzioni SQL dinamiche. Un'istruzione dinamica è un'istruzione generata in fase di esecuzione utilizzando la password dei parametri da un modulo Web o una stringa di query URI.

Esempio di iniezione SQL

Consideriamo una semplice applicazione web con un modulo di accesso. Il codice per il modulo HTML è 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 soprastante accetta l'indirizzo e-mail e la password, quindi li invia a un PHP file denominato index.php.
  • Ha un'opzione per memorizzare la sessione di login 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 nell'URL.

Supponiamo che l'istruzione nel backend per il controllo dell'ID utente sia la seguente

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

QUI,

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

Illustreremo l'attacco SQL injection utilizzando sqlfiddle. Apri l'URL http://sqlfiddle.com/ nel tuo browser web. Otterrai la seguente finestra.

Nota: dovrai scrivere le istruzioni SQL

L'iniezione SQL funziona

Passo 1) Inserisci questo codice nel riquadro di 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) Fare 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

L'iniezione SQL funziona

Supponiamo che le forniture dell'utente admin@admin.sys e a 1234 come password. L'istruzione da eseguire sul database sarebbe

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

Il codice sopra può essere sfruttato commentando la parte della password e aggiungendo una condizione che sarà sempre vera. Supponiamo che un aggressore fornisca il seguente input nel campo 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 una virgoletta singola che completa la virgoletta 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 SQL FiddleEsegui la casella di testo SQL come mostrato di seguito

L'iniezione SQL funziona

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

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

Per aggirare questo problema possiamo invece sfruttare il campo password. Il diagramma seguente mostra i passaggi da seguire

SQL Iniettare un'applicazione Web

Supponiamo che un aggressore fornisca il seguente input

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

SQL Iniettare un'applicazione Web

  • Fare 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 la generazione della dichiarazione.

SQL Iniettare un'applicazione Web

QUI,

  • La dichiarazione presuppone in modo intelligente che venga utilizzata la crittografia MD5
  • Completa la virgoletta singola e la parentesi di chiusura
  • Aggiunge una condizione all'affermazione che sarà sempre vera

In generale, un attacco SQL Injection riuscito tenta una serie di tecniche diverse come quelle mostrate sopra per eseguire un attacco riuscito.

Altri tipi di attacchi SQL injection

Le SQL Injection possono causare più danni che semplicemente passando gli algoritmi di accesso. Alcuni degli 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
  • Ottenere i dettagli di accesso dell'utente ecc.
  • SQL injection basata sui cookie
  • Iniezione SQL basata su errori
  • Iniezione SQL cieca

L'elenco sopra riportato non è esaustivo; ti dà solo un'idea di cosa sia SQL Injection

Strumenti di automazione per SQL Injection

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

Come prevenire gli attacchi SQL Injection

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

  • L’input dell’utente non dovrebbe mai essere considerato attendibile – Deve essere sempre ripulito prima di essere utilizzato nelle istruzioni SQL dinamiche.
  • Procedura di archiviazione - questi possono incapsulare le istruzioni SQL e trattare tutti gli input come parametri.
  • Dichiarazioni preparate – istruzioni preparate per funzionare creando prima l'istruzione SQL e poi trattando tutti i dati utente inviati come parametri. Ciò non ha alcun effetto sulla sintassi dell'istruzione SQL.
  • Espressioni regolari - questi possono essere utilizzati per rilevare potenziale codice dannoso e rimuoverlo prima di eseguire le istruzioni SQL.
  • Diritti di accesso utente per la connessione al database – agli account utilizzati dovrebbero essere concessi solo i diritti di accesso necessari connettersi al database. Ciò può aiutare a ridurre ciò che le istruzioni SQL possono eseguire sul server.
  • Messaggio di errore - questi non dovrebbero rivelare informazioni sensibili e dove esattamente si è verificato un errore. Semplici messaggi di errore personalizzati come "Spiacenti, stiamo riscontrando errori tecnici. Il team tecnico è stato contattato. Riprova più tardi" possono essere utilizzati invece di visualizzare le istruzioni SQL che hanno causato l'errore.

Attività di hacking: utilizzare Havij per SQL Injection

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

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

L'immagine sotto mostra la finestra principale di Havij

Utilizzare Havij per SQL Injection

Lo strumento di cui sopra può essere utilizzato per valutare la vulnerabilità di un sito/applicazione web.

Sommario

  • SQL Injection è un tipo di attacco che sfrutta istruzioni SQL errate
  • L'iniezione SQL può essere utilizzata per bypassare gli algoritmi di accesso, recuperare, inserire, aggiornare ed eliminare dati.
  • Gli strumenti di iniezione SQL includono SQLMap, SQLPing e SQLSmack, ecc.
  • Una buona politica di sicurezza durante la scrittura dell'istruzione SQL può aiutare a ridurre gli attacchi SQL injection.