SQL Injection - Ghidul celei mai utilizate metode de atac

SQL_Injection_.jpg

În ultima vreme SQL Injection a devenit cea mai preferată armă a hackerilor atunci când vor să compromită un site. Site-uri cu nume grele ca Microsoft sau Yahoo au căzut atunci când au fost atacate cu interogări menite să descopere secretele bazelor de date.

 

Menționez de la început că acest articol este confecționat astfel încât să vă ofere o idee asupra ce înseamnă SQL Injection și de ce este periculos. În cazul în care veți lucra sau deja lucrați în domeniul dezvoltării de site-uri este obligatorie o lectură mult mai detaliată privind acest subiect. Până la urmă de asta depinde siguranța unui site și a datelor pe care le stochează. Vă voi oferi și câteva legături unde veți găsi informațiile necesare.

 


Ce este SQL Injection?

Acest tip de atac constă în inserarea unui script de tip SQL (Structured Query Language) într-o anumită aplicație prin intermediul unei căsuțe de input. Mai simplu, dacă un hacker găsește pe un site un formular de înscriere el va încerca să introducă acolo o comandă SQL care poate citi informații din baza de date.

Un atac de succes va putea face orice cu baza de date: inserare, actualizare, ștergere. Poate să execute operații de administrator și chiar să șteargă întreaga bază de date. Lucruri serioase, nu glumă.

În esență, atacul se realizează prin plasarea unui meta caracter într-o zonă de input pentru ca apoi să apară în panoul de control o comandă SQL care nu exista acolo.

Principiul de bază al acestei tehnici de hacking este sugerat în gluma următoare.

SQL_Injection_gluma_.png

 


Cauze.

SQL Injection poate fi efectuat utilizând mai multe metode. Unele presupun combinarea cu alte tipuri de atacuri, de exemplu DDoS sau DNS hijacking. SQL Injection de tip clasic apare atunci când inputul unui utilizator (spre exemplu textul introdus la username sau parolă) nu este curățat de caractere de tip escape (' ; “ &). Astfel pot fi manipulate comenzile date asupra bazei de date.

 



Modul de acțiune.

Imediat ce un hacker a introdus, spre exemplu, un username care conține caractere escape  (vasile'), baza de date va returna un mesaj de eroare. Mesajul de eroare arată că inputul utilizatorului a fost integrat în sintaxa SQL. Asta arată că aplicația nu capabilă să curețe textul și că baza de date este vulnerabilă.

Un răspuns corect la introducerea unui astfel de username ar fi că nu sunt permise asemenea caractere. Și mai bine ar fi fost ca username-ul să fie afișat cu caracterele escape șterse.

După ce hackerul a văzut că site-ul nu are cea mai bună protecție împotriva SQL Injection va trece la introducerea unor scripturi mai complexe, capabile să manipuleze baza de date. Este doar o chestiune de încercări până ce toate informațiile vor fi compromise.


Exemplu.

Acesta este cel mai simplu exemplu de SQL Injection clasic.
Să presupunem că în codul site-ului sau aplicației se află următoarea comandă:

SELECT * FROM Users WHERE Username='$username' AND Password='$password'

Această comandă verifică dacă în baza de date se află o înregistrare cu un anumit user și o parolă. Este scriptul clasic de autentificare. În cazul în care acel utilizator există, i se va acorda accesul la sistem, altfel nu.

Să presupunem că se vor introduce următoarele date în câmpurile Usename și Parolă:

$username = 1' sau '1' = '1

$password = 1' sau '1' = '1

Atunci interogarea va avea următoarea formă:

SELECT * FROM Users WHERE Username='1' OR '1' = '1' AND Password='1' OR '1' = '1'

Mai departe, dacă datele vor fi trecute către site-ul www.exemplu.ro, cererea de logare va avea următoarea formă:

http://www.examplu.ro/index.php?username=1'%20or%20'1'%20=%20'1&password=1'%20or%20'1'%20=%20'1
 
Această interogare va returna o valoarea sau un set de valori deoarece condiția 1=1 va fi întodeauna adevărată.
Rezultă că un utilizator se poate loga la site chiar dacă nu a oferit userul sau parola corespunzătoare.

 



Cum detectăm vulnerabilitățile SQL Injection?

Primul lucru pe care trebuie să îl faceți este să aflați când și unde site-ul sau aplicația interacționează cu baza de date. Este important să faceți o listă cu toate câmpurile de input și să le testați pe fiecare în parte. Aveți grijă că există și câmpuri ascunse.
De obicei aplicații ca:

  • formularele de contact
  • motoarele de căutare de pe site
  • site-urile de cumpărături online

sunt cele care interoghează baza de date.

Cel mai simplu test este să includeți în caracterele (') sau (;) în formular pe care îl testați. Dacă aceste caractere nu sunt filtrate, atunci se va returna un mesaj de eroare.
Cam așa arată mesajul de eroaer returnat de Microsoft SQL Server.

Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]Unclosed quotation mark before the
character string ''.


Un alt test pe care îl puteți face este să introduceți user-ul și parola din exemplul de mai sus.

Hacker-ul pe lângă a descoperi dacă site-ul sau aplicația sunt vulnerabile la SQL Injection, trebuie să verifice și ce fel de bază de date se utilizează. Chiar dacă limbajul SQL este standard, fiecare sistem de baze de date are ceva specific. Pentru a trece la un Sql Injection mai avansat, cu comenzi mai complexe, trebuie să știm care sunt acele funcții sau metode specifice de a interoga baza.

Tot mesajul de eroare ne arată care este sistemul de bază de dată. De exemplu:

ORACLE va returna un mesaj de genul ORA-00933
MySQL - check the manual that corresponds to your MySQL server version
Microsoft -  Microsoft SQL Native Client error

 


Cele mai răsunătoare ”succese” ale tehnicii SQL Injection.

Oricât de precauți ar fi programatorii, întotdeauna rămân breșe de securitate. Firme de renume mondial care investesc sume enorme în aplicații au picat în fața acestei tehnici de hacking.

  • În 2009 Departamentul American de Justiție a acuzat un cetățean american și doi de ruși de furtul a 130 de milioane de numere de card utilizând un atack SQL.
  • În 2010 site-ul Marinei Regale Britanice a fost compromis de un român pe nume TinKode.
  • În 2011 de pe site-ul Sony au fost furate parolele a milione de conturi obținând accesul la informațiile utilizatorilor.
  • În 2012 au fost furate 450.000 de user și parole pentru accesul la Yahoo!



Mai multe informații.

Pentru un programator este absolut necesar ca acest subiect să fie studiat în detaliu. Aveți mai jos o listă de link-uri unde puteți găsi mai multe informații despre de unde a plecat și unde a ajuns în acest moment tehnica SQL injection.

https://www.owasp.org/index.php/SQL_Injection
https://www.owasp.org/index.php/Testing_for_SQL_Injection_(OTG-INPVAL-005)
http://www.unixwiz.net/techtips/sql-injection.html
http://www.esecurityplanet.com/hackers/how-to-prevent-sql-injection-attacks.html

Dacă v-a plăcut acest articol, vă recomandăm și Paradimele în programare - Scurt ghid.

 

 

Articol de Oprescu Gabriel

  • 02.12.2014 10:27

Comentariu