SQL Injections 101

Cosa sono e come funzionano.

Posted by Cariomax on April 06, 2020

SQL Injections

SQL injection è una tecnica di code injection che potrebbe distruggere il tuo database.

SQL injection è una delle tecniche di hacking web più comuni.

SQL injection è il posizionamento di codice dannoso nelle istruzioni SQL, tramite input di pagine Web

SQL in Pagine Web

La SQL injection di solito si verifica quando si richiede un input all'utente, come il nome utente / ID utente, e invece di un nome / ID, l'utente fornisce un'istruzione SQL che verrà eseguita inconsapevolmente sul database.

Guarda il seguente esempio che crea un'istruzione SELECT aggiungendo una variabile (txtUserId) a una stringa select. La variabile viene recuperata dall'input dell'utente (getRequestString):

txtUserId = getRequestString("UserId");

txtSQL = "SELECT * FROM Users WHERE UserId = " + txtUserId;

Il resto di questo capitolo descrive i potenziali pericoli derivanti dall'uso dell'input dell'utente nelle istruzioni SQL.

SQL Injection basata su 1=1 è sempre vera

Guarda di nuovo l'esempio sopra. Lo scopo originale del codice era quello di creare un'istruzione SQL per selezionare un utente, con un determinato ID utente.

Se non c'è nulla che impedisca a un utente di inserire input "errati", l'utente può inserire alcuni input "intelligenti" in questo modo:

ID utente: 105 OPPURE 1 = 1

Quindi, l'istruzione SQL sarà simile a questa:

SELECT * FROM Users WHERE UserId = 105 OR 1=1;

L'SQL sopra è valido e restituirà TUTTE le righe dalla tabella "Utenti", poiché OR 1 = 1 è sempre VERO.

L'esempio sopra sembra pericoloso? Cosa succede se la tabella "Utenti" contiene nomi e password?

L'istruzione SQL sopra è molto simile a questa:

SELECT UserId, Name, Password FROM Users WHERE UserId = 105 or 1=1;

Un malintenzionato potrebbe ottenere l'accesso a tutti i nomi utente e le password in un database, semplicemente inserendo 105 O 1 = 1 nel campo di input.

SQL Injection basata su ""="" è sempre vera

Here is an example of a user login on a web site:

Username: John Doe

Password: myPass

uName = getRequestString("username");

uPass = getRequestString("userpassword");

sql = 'SELECT * FROM Users WHERE Name ="' + uName + '" AND Pass ="' + uPass + '"'

Risultato

SELECT * FROM Users WHERE Name ="John Doe" AND Pass ="myPass"

Un malintezionato potrebbe accedere a nomi utente e password in un database semplicemente inserendo "OR" "=" nella casella di testo nome utente o password:

Nome utente:"or""="

Password:"or""="

Il codice sul server creerà un'istruzione SQL valida come questa:

Risultato

SELECT * FROM Users WHERE Name ="" or ""="" AND Pass ="" or ""=""

L'istruzione SQL sopra è valida e restituirà tutte le righe dalla tabella "Users", poiché OR "" = "" è sempre VERO.

SQL Injection su istruzioni SQL in batch

La maggior parte dei database supporta istruzioni SQL in batch.

Un batch di istruzioni SQL è un gruppo di due o più istruzioni SQL, separate da punti e virgola.

L'istruzione SQL seguente restituirà tutte le righe dalla tabella "Utenti", quindi eliminerà la tabella "Fornitori".

Esempio

SELECT * FROM Users; DROP TABLE Suppliers

Guarda invece questo altro esempio:

Esempio

txtUserId = getRequestString("UserId");

txtSQL = "SELECT * FROM Users WHERE UserId = " + txtUserId;

E il seguente input:

User id: 105; DROP TABLE Suppliers

Lo statement valido per l'SQL generato sarà il seguente:

Esempio

SELECT * FROM Users WHERE UserId = 105; DROP TABLE Suppliers;