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;