Situatie
SQL injection este una dintre cele mai devastatoare vulnerabilităŃi, deoarece poate avea un impact sever şi poate duce la pierderea autentificări sau poate duce la compromiterea completă a bazei de date.
Solutie
SQL injecțiune este o vulnerabilitate care rezultă atunci când i se dă unui atacator capacitatea de a influența interogările SQL și ceea ce trece spre baza de date. În cazul în care datele furnizate de utilizator nu sunt corect curățate și validate, un utilizator rău intenționat poate injecta date artizanale pentru a schimba semantica, interogările sau a comanda, ceea ce poate conduce la consecințe nedorite.
SQL injection nu este o vulnerabilitate care afectează exclusiv aplicațiile WEB; orice cod care acceptă ca intrare declarațiile SQL poate fi vulnerabil.
Există patru categorii principale de atacuri SQL injection împotriva bazelor de date :
- Manipulare SQL,
- Injecție de cod,
- Injecție de funcții,
- Umplerea
Manipularea SQL
Manipulare SQL implică modificarea declarației SQL prin intermediul operatorilor pe mulțimi (de exemplu, uniunea, intersecția, etc), sau modificarea clauzei WHERE pentru a returna un rezultat diferit. Multe atacuri SQL injection demonstrate sunt de acest tip.
Atacul cel mai bine cunoscut este de a modifica clauza WHERE în situația autentificării unui utilizator, astfel încât această clauza WHERE să fie întotdeauna adevarată.
Ex: O aplicație poate verifica autentificarea unui utilizator prin executarea următoarei interogări şi verificarea dacă există răspuns de la server.
SELECT * FROM tabel_utilizatori WHERE nume = ‘admin’and parola = ‘parola’
Atacatorul încearcă să manipuleze instrucțiunea SQL astfel încât să execute următoarea sintaxa: SELECT * FROM tabel_utilizatori
WHERE nume = ‘admin’ and parola = ‘parola’ or ‘a’ = ‘a‘
Datorită priorității operatorilor clauza WHERE devine adevarată şi atacatorul dobândeşte în acest fel accesul.
Operatorul UNIUN este de asemenea utilizat în atacuri SQL injection. Scopul este de a manipula o declarație SQL astfel încât să returneze şi coloane din alte tabele. Un formular care execută următoarea interogare pentru a returna o listă de cărți disponibile este:
SELECT nume_carte FROM carti WHERE nume_carte like’%BAZE%’
Atacatorul încearcă să manipuleze instrucțiunea SQL astfel incât să execute următoarea sintaxă:
SELECT nume_carte FROM carti WHERE nume_carte like ‘%BAZE%’UNION SELECT nume FROM dba_users WHERE nume like ‘%‘
Lista returnată de server va include toate cărțile selectate, dar, de asemenea și toți utilizatorii bazei de date.
Injecție de cod
Atacurile prin injecția de cod încearcă să adauge declarații suplimentare sau alte comenzi SQL la comanda SQL trimisă către server.
Acest tip de atac este frecvent utilizat împotriva aplicaților Microsoft SQL Server, dar uneori se întâlnește și asupra bazelor de date Oracle. Declarația EXECUTE din SQL Server este o țintă frecventă a atacurilor de tip SQL injection. Oracle nu suporta mai multe declarații SQL trimise pe aceeaşi cerere către baza de date de aceea următorul atac nu va avea nici un rezultat asupra bazelor de date Oracle. Următoarea declarație va duce la o eroare:
SELECT * FROM tabel_utilizatori WHERE nume = ‘alice’
and
parola = ‘parola’;
DELETE FROM tabel_utilizatori
WHERE nume = ‘admin‘;
Cu toate acestea, unele limbaje de programare sau API-uri permit situațiile în care să fie executate mai multe instrucțiuni. PL/SQL şi aplicațiile Java pot executa dinamic mai multe blocuri PL/SQL, blocuri care sunt vulnerabile la injecție de cod.
Ex: BEGIN ENCRYPT_PASSWORD (‘alice’, ‘parola’); END;
Exemplul de mai sus de bloc PL/SQL execută o procedură care criptează şi salvează parola şi utilizatorul. Un atacator va încerca să manipuleze acest bloc PL/SQL astfel încât să execute următorul cod:
BEGIN ENCRYPT_PASSWORD (‘alice’, ‘parola’); DELETE FROM tabel_utilizatori WHERE upper(nume) = upper(‘admin‘); END;
Injecție de funcții
Baza de date Oracle permite funcții sau funcții în pachete să fie executate ca parte a unei declarații SQL. Deși Oracle deține peste 1.000 de funcții în aproximativ 175 de pachete de date standard, doar câteva dintre aceste funcții pot fi utilizate
Funcțiile executate ca parte a unei declarații SQL SELECT nu pot întotdeauna modifica baza de date, excepție făcând cazul în care funcția este marcat ca “TRANSACTION PRAGMA”. Nici una dintre funcțiile standard Oracle nu sunt executate ca tranzacții autonome; doar funcțiile ca INSERT, UPDATE, DELETE sunt în măsură să modifice datele dintr-o baza de date. De asemenea, multe pachete Oracle sau pachete personalizate pot fi exploatate de un atacator. Aceste pachete personalizate pot include funcții pentru a modifica parolele sau alte operațiuni.
Problema legata de injectia de funcții este că orice generare dinamica de, declarații SQL este vulnerabilă. Chiar cele mai simple, declarațiile SQL pot fi exploatate în mod eficient.
Următorul exemplu demonstrează, că şi cele mai simple declarații SQL pot fi vulnerabile. Problema este că toți dezvoltatori de aplicații trebuie să folosească funcții predefinite ale bazelor de date pentru a efectua diferite task-uri în loc de cod nativ.
In următorul caz nu există nici o funcție care să facă translația, deci programatorul este decis să folosească o declarație SQL:
SELECT TRANSLATE(
‘intrare‘, ‘02468ABCDEFG’, ‘02468’)
FROM dual;
Această declarație SQL nu este vulnerabilă la alte tipuri de atacuri SQL injection, dar este ușor de manipulat printr-un atac de injectare de funcție. Atacatorul încearcă să manipuleze declarația SQL în următorul mod:
SELECT TRANSLATE( ‘‘||UTL_HTTP.REQUEST(‘http://192.168.1.1/’) || ‘‘, ‘02468ABCDEFG’,’02468′)FROM dual;
Schimbând declarația SQL se va solicita o pagina de la un server WEB. Atacatorul ar putea manipula șirul de caractere și URL-ul pentru a include alte funcții în scopul de a obține informații utile de pe serverul de baze de date. Având în vedere că serverul de baze de date este cel mai probabil în spatele unui firewall, ar putea fi de asemenea folosit pentru a ataca și alte servere din rețeaua internă.
Un alt exmplu ar fi o aplicație particularizată care are funcția SET_UTIL în pachetul MYAPPADMIN.Dezvoltatorul marchează funcția ca “PRAGMA TRANSACTION”, astfel încât să poată fi executată în orice circumstanțe speciale pe care aplicația le-ar putea întâmpina. Din moment ce este marcată” PRAGMA TRANSACTION”, atacatorul poate scrie în baza de date chiar într-o declarație de tip SELECT.
SELECT TRANSLATE(
” || myappadmin.set_util(‘admin’, ‘parola’) || ”,’02468ABCDEFG’, ‘02468’)FROM dual;
Executând declarația SQL de mai sus, atacatorul este capabil sa creeze noi utilizatori.
Umplerea
Umplerea bufferului a fost identificată printre funcțiile standard ale mai multor baze de date. Câteva funcții ale bazei de date Oracle sunt susceptibile la umplerea bufferului, de aceea ele pot fi exploatate în scopul de a permite un atac SQL injection asupra bazei de date.
Unele dintre aceste funcții :
- tz_offset,
- to_timestamp_tz,
Cele mai multe servere de aplicații web nu se ocupă grațios de pierderea unei conexiuni la baza de date din cauza unei umplere a bufferului de memorie. De obicei în timpul unei cereri web conexiunea la client va fi menținută până în momentul rezilierii; ceea ce face un bun moment de atac.
În continuare pentru a putea executa instrucțiunile SQL se folosesc tehnicile descrise mai sus.
Există mai multe tehnici pentru a preveni atacurile SQL injection
- Validarea intrărilor
Una dintre aceste tehnici este validarea intrărilor astfel încât să conțină numai date alfanumerice (fara spații, semne de punctuație, etc).
În mod similar, trebuie verificat dacă valoarea introdusă se încadreză între un minim şi un maxim definit pentru respectivul câmp. Multe platforme oferă o facilitate cunoscută sub numele de “SQL preparat”. Acesta facilitate utilizează ca tehnică împotriva atacurilor SQL injection verificări de tip precompilate. Din păcate nu există nici un astfel de produs comercial. Aceasta înseamnă că noi trebuie să creem manual facilități pentru a fi utilizate în analiza şi execuția comenzilor SQL.
SQL injection este doar un exemplu dintr-o clasa largă de defecte software care pot compromite securitatea unei aplicații.
- Variabile locale
Cea mai puternică protecție împotriva atacurilor SQL injection este utilizarea de variabile locale. Utilizând variabile locale se va îmbunătăți de asemenea şi perfomanța aplicațiilor. Aplicațiile de codificare standard ar trebui să solicite utilizarea de variabile locale în toate declarațiile SQL. Nici o declarație SQL nu ar trebui sa fie creată prin concatenarea împreună a şirurilor de caractere şi a parametrilor.
Variabilele locale ar trebui utilizate pentru fiecare declarație SQL indiferent de momentul sau locul unde declarația SQL este executată. Un complex atac SQL injection ar putea exploata o aplicație prin stocarea unui şir de caractere în baza de date, şir care ulterior să fie executat de o instrucțiune SQL dinamică.
- Funcții de securitate
Atât funcțiile standard cât şi cele definite pot fi exploatate în atacuri SQL injection. Multe dintre aceste funcții pot fi utilizate în mod eficient într-un atac. De exemplu Oracle are sute de funcții standard şi implicit toate sunt setate cu dreptul de a fi accesate de orice utilizator( PUBLIC). În general aplicațiile au funcții suplimentare care efectuează operații precum schimbarea de parole sau crearea de utilizatori care ar putea fi exploatate în mod negativ.
Toate funcțiile care nu sunt absolut necesare pentru o aplicație ar trebui restricționate.
- Mesaje de eroare
Dacă un atacator nu poate obține codul sursă pentru o aplicație, mesajele de eroare pot deveni extrem de importante pentru un atac de succes. Cele mai multe aplicații Java nu returnează mesaje de eroare detaliate. Testarea şi analiza pentru o aplicație trebuie să fie efectuate foarte amănunțit pentru a observa dacă aplicația întoarce mesaje de eroare detaliate sau nu.
Leave A Comment?