SQL Injection 101: Ce este SQLi și cum să preveniți atacurile
06 august 2022 • securitate
Ce este injecția SQL
Injecția SQL (SQLi) este un tip de atac care permite infractorilor să execute declarații SQL malițioase împotriva aplicațiilor web vulnerabile. Atacatorii pot accesa date sensibile, cum ar fi informațiile despre clienți, datele personale, secretele comerciale și altele, prin ocolirea măsurilor de securitate ale aplicației. Aici vom discuta despre injecția SQL, cum funcționează și cum puteți preveni atacurile.
Atacurile de injecție SQL pot avea loc pe orice site web care folosește o bază de date SQL. Acest tip de atac permite atacatorilor să obțină acces la datele dvs. esențiale. Ei pot vedea informații despre consumatori, date personale, secrete comerciale și proprietate intelectuală. Acesta este unul dintre cele mai grave tipuri de atacuri asupra aplicațiilor web, conform OWASP.
Tipuri de injecție SQL

SQLi în bandă
Injecția SQL în bandă este un atac în care atacatorul folosește același canal pentru a trimite și a primi interogări. În bandă înseamnă că răspunsul este obținut folosind același mediu de comunicație. Scopul atacatorului este de a obține răspunsul într-un browser web imediat, dacă este posibil, atunci când efectuează atacul manual cu un browser web.
Exemplu de injecție SQL în bandă
Cea mai comună modalitate pentru un atacator de a face o injecție SQL în bandă este să schimbe cererea astfel încât să poată vedea informațiile personale ale utilizatorului curent. Acest lucru se poate face prin schimbarea valorii trimise ca parte a cererii. De exemplu, dacă declarația trebuia să afișeze numele utilizatorului, atacatorul ar putea să o schimbe astfel încât să fie afișat numele său în schimb.
SELECT * FROM users WHERE user_id LIKE 'current_user'
SQLi bazat pe erori și SQLi bazat pe unire sunt cele două forme cele mai frecvente de injecție SQL în bandă.
SQLi bazat pe erori
O tehnică SQLi bazată pe erori este o abordare de injecție SQL în bandă care profită de mesajele de eroare ale serverului de baze de date pentru a descoperi arhitectura bazei de date. Injecția SQL bazată pe erori este cel mai comun tip de injecție SQL în bandă.
Exemplu de SQLi bazat pe erori:
Dacă un atacator încearcă să se autentifice cu următoarele date:
username: ' OR 'a'='apassword: anything
Baza de date va returna o eroare deoarece declarația este sintactic incorectă. Mesajul de eroare va dezvălui informații despre baza de date, pe care atacatorul le poate folosi în avantajul său.
SQLi bazat pe unire:
Injecția SQL în bandă este o modalitate de a obține informații de pe un site web folosind operatorul UNION pentru a combina rezultatele a două sau mai multe declarații SELECT.
Injecție SQL oarbă
Injecția SQL oarbă este un atac în care atacatorul încearcă să obțină răspunsuri de la baza de date punând întrebări care vor rezulta într-un răspuns adevărat sau fals. Atacatorul folosește mesajele de eroare pentru a vedea dacă aplicația răspunde diferit atunci când este folosit un cod specific.
Când un hacker folosește injecția SQL, aplicația web ar putea afișa mesaje critice de avertizare ale bazei de date care indică faptul că sintaxa interogării SQL este incorectă. Injecția SQL oarbă funcționează la fel ca injecția SQL tradițională, cu excepția modului în care datele sunt obținute din baza de date. Dacă o bază de date nu are suficiente informații pentru ca un atacator să le exploateze, un atacator trebuie să pună o serie de întrebări pentru a obține date.
Injecția SQL oarbă este împărțită în SQLi orb bazat pe boolean și SQLi orb bazat pe timp.
SQLi orb bazat pe boolean
Injecția SQL oarbă bazată pe boolean este un atac în care atacatorul încearcă să obțină răspunsuri de la baza de date punând întrebări care vor rezulta într-un răspuns adevărat sau fals. Atacatorul folosește mesajele de eroare pentru a vedea dacă aplicația răspunde diferit atunci când este folosit un cod specific.
Exemplu de SQLi orb bazat pe boolean:
Dacă un atacator dorește să afle tipul bazei de date, va folosi următoarea declarație:
SELECT * FROM users WHERE user_id LIKE 'current_user' and database() like '%type%'
Dacă baza de date este MySQL, rezultatul ar fi ceva de genul acesta:
Aveți o eroare în sintaxa SQL; verificați manualul care corespunde versiunii serverului MySQL pentru sintaxa corectă de utilizat lângă ‘and database() like ‘%type%” la linia
Injecție SQL oarbă bazată pe timp
Un atac orb bazat pe timp este atunci când o comandă SQL este trimisă serverului cu un cod care face ca interogările să se execute mai lent.
Atacurile oarbe bazate pe timp permit atacatorilor să extragă date pe baza timpului de acces. Un astfel de atac este cunoscut ca un atac de injecție orb sau inferențial. Acesta este un tip de atac în care nu există flux de date între atacator și baza de date, dar pentru că nu există un răspuns, este cunoscut și ca un atac de injecție orb.
Timpul de răspuns indică dacă răspunsul este corect sau incorect. Dacă răspunsul este negativ, intrusul va face o altă cerere. Această tehnică de atac este lentă deoarece hackerul trebuie să treacă prin fiecare caracter individual, mai ales atunci când atacă baze de date masive.
Exemplu de SQLi orb
În acest exemplu, atacatorul încearcă să determine dacă utilizatorul cu id=999 există în baza de date. Pentru a face acest lucru, folosește următoarea declarație:
IF(SUBSTRING((SELECT password FROM users WHERE user_id=999),0, LEN('secret'))='secret', SLEEP(30), 'false')
Dacă utilizatorul cu id 999 există în baza de date și parola sa este secretă, atunci aplicația va dormi timp de 30 de secunde. Aplicația va returna fals dacă utilizatorul nu există în baza de date.
SQLi în afara benzii
Cineva care dorește să fure date poate trimite cod SQL unui server de baze de date într-un mod care nu face parte din comunicarea obișnuită între server și alte calculatoare. Acest lucru se poate face trimițând informații către server prin cereri DNS sau HTTP.
Răspunsul aplicației nu va fi afectat de faptul că datele sunt sau nu returnate, dacă există sau nu o problemă cu baza de date sau cât timp durează executarea interogării. În afara benzii poate fi folosit în interacțiunile de rețea pentru a declanșa evenimente după bunul plac. În funcție de o condiție injectată, acestea pot fi activate condiționat pentru a obține cunoștințe un bit la un moment dat.
Datele pot, de asemenea, să se scurgă prin mai multe protocoale de rețea din interacțiunile de rețea. Vizualul reprezintă cererea trimisă de aplicația web către baza de date a aplicației.
Exemplu de SQLi în afara benzii
În acest exemplu, atacatorul încearcă să determine dacă un utilizator specific există în baza de date. Pentru a face acest lucru, folosește următoarea declarație:
SELECT user_id FROM users WHERE username='$username' AND password='$password' LIMIT 0,0 UNION SELECT NULL,'' INTO OUTFILE '/var/opt/databases/$filename.php'; --
Aplicația va returna ID-ul utilizatorului dacă utilizatorul există în baza de date. Dacă utilizatorul nu există în baza de date, atunci aplicația va crea un fișier care conține cod PHP care poate fi folosit pentru a executa comenzi de sistem. Atacatorul poate apoi să folosească acest fișier pentru a rula comenzi pe server.
Cum să preveniți o injecție SQL
Cea mai bună modalitate de a vă proteja împotriva atacurilor de injecție SQL este să folosiți validarea intrărilor, declarații pregătite și interogări parametrizate. Codul nu ar trebui să folosească niciodată direct intrările utilizatorului. Dezvoltatorii trebuie să igienizeze toate intrările, nu doar intrările din formularele web, cum ar fi formularele de autentificare. Ghiliemele simple ar trebui eliminate din orice componente de cod suspecte. De asemenea, este o idee bună să ascundeți problemele bazei de date pe site-urile live pentru a evita dezvăluirea lor accidentală. Injecția SQL poate oferi informații despre un sistem de baze de date pe care atacatorii le pot folosi în avantajul lor.
Dacă găsiți o problemă cu site-ul dvs., ar trebui să-l scoateți offline imediat și să contactați furnizorul dvs. de hosting. Ei vă pot ajuta să determinați dacă site-ul dvs. a fost compromis și ce pași trebuie să faceți pentru a rezolva problema. Între timp, asigurați-vă că toți utilizatorii site-ului dvs. sunt conștienți de problemă și își schimbă parolele cât mai curând posibil.
Sfaturi de prevenire pentru evitarea injecțiilor SQL
Există câteva modalități de a evita vulnerabilitățile de injecție SQL în limbajul dvs. de programare și configurarea bazei de date. Aceste tehnici pot fi folosite cu majoritatea bazelor de date, cum ar fi XML. Puteți folosi aceste tehnici pentru a face bazele dvs. de date mai sigure.
1) Utilizarea Procedurilor Stocate Corect Construite
Începătorii ar trebui să înceapă prin a învăța cum să creeze declarații cu variabile. Acest lucru este mai ușor decât crearea de interogări dinamice și este mai ușor de înțeles. Interogările parametrizate sunt acolo unde dezvoltatorul creează tot codul SQL și apoi furnizează fiecare parametru la o dată ulterioară. Această metodă permite bazei de date să identifice între codul sursă și informații.
Declarațiile pregătite ajută la asigurarea că scopul unei interogări nu este schimbat, chiar dacă cineva încearcă să ofere instrucțiuni SQL.
2) Validarea Intrărilor pe Lista Albă
Interogările SQL folosesc variabile de legare în locuri specifice pentru date. De exemplu, dacă folosiți Python, ați folosi %s un substituent. Puteți folosi o expresie regulată pentru a valida intrarea utilizatorului în raport cu lista albă pentru ce caractere sunt permise în fiecare variabilă de legare.
Dacă folosiți JavaScript, puteți folosi \w pentru a potrivi caractere alfanumerice și caractere de subliniere.
Lista albă ar trebui să fie cât mai specifică posibil pentru a evita pozitivele false.
De exemplu, dacă căutați un număr de telefon din SUA, ați folosi următoarea expresie regulată:
/^\d{11}$/
Aceasta ar potrivi un șir de 11 cifre care ar putea fi un număr de telefon. Dacă cineva ar încerca să trimită ceva de genul ‘abcdef‘, nu s-ar potrivi și intrarea ar fi invalidă.
Acest lucru va ajuta să vă asigurați că datele dvs. sunt sigure și sănătoase. Dacă trebuie să folosiți valori din cod în loc de parametri de utilizator, este și asta în regulă!
Totuși, dacă valorile parametrilor utilizatorului vizează nume specifice de tabele și coloane, atunci valorile parametrilor ar trebui să fie mapate la numele corespunzătoare de tabele și coloane pentru a asigura că intrarea nevalidată a utilizatorului nu intră în interogare.
3) Utilizați liste albe
Nu filtrați intrările utilizatorului pe baza listelor negre de caractere rele. Utilizarea listelor albe de caractere bune care sunt așteptate în câmpuri specifice este mult mai eficientă. Acest lucru va opri atacurile de injecție SQL înainte de a începe.
De exemplu, permiteți doar cifre și cratime în câmpul de intrare dacă așteptați un număr de telefon. Dacă așteptați o adresă de e-mail, permiteți doar caractere care sunt valabile într-o adresă de e-mail.
4) Utilizați cele mai actualizate platforme
PHP nu are protecție SQLi în platformele mai vechi de dezvoltare web. Folosiți cea mai actualizată ediție a mediului de programare, a limbajului și a tehnologiilor asociate disponibile. În loc de PHP, folosiți PDO în acest exemplu.
5) Scanați-vă aplicația web regulat
Injecțiile SQL pot fi foarte greu de observat. Este important să scanați aplicația web pentru vulnerabilități în mod regulat.
6) Aplicarea principiului privilegiului minim
Principiul privilegiului minim este un concept de securitate care restricționează utilizatorii la cantitatea minimă de acces de care au nevoie pentru a-și face treaba. Acest lucru include limitarea numărului de conturi pe care utilizatorii le au și privilegiile pe care le au acele conturi.
Restricția minimă a funcționalității (LRF) este practica și conceptul de a restricționa drepturile utilizatorului, conturile și procesele de calcul la doar acele resurse necesare pentru sarcini de bază, acceptabile. Acest lucru ajută la menținerea drepturilor minime ale utilizatorului sau a nivelurilor de autorizare, ceea ce este vital pentru ca oamenii să-și facă treaba eficient.
Privilegiul minim este un principiu de securitate care necesită ca aplicațiile, sistemele și dispozitivele să aibă doar permisiunile necesare pentru a îndeplini o sarcină specifică. În acest fel, impactul va fi limitat dacă cineva reușește să exploateze o vulnerabilitate și să facă daune. Acest lucru este în contrast cu oferirea utilizatorilor mai multe permisiuni decât au nevoie, ceea ce crește riscul de daune semnificative într-un atac SQL.
Injecție SQL – Întrebări frecvente
Injecția SQL în bandă este cel mai comun tip de atac de injecție SQL. Apare atunci când un atacator poate folosi același canal de comunicare pentru a livra sarcina utilă și a colecta rezultatele.
Cea mai bună apărare împotriva injecției SQL este utilizarea interogărilor parametrizate. Acest tip de interogare folosește valori de substituent pentru parametri, care sunt furnizate ulterior. Această metodă permite bazei de date să facă diferența între codul sursă și informații.
Injecția SQL poate fi detectată în mai multe moduri. O metodă este utilizarea unui firewall pentru aplicații web (WAF). Un WAF este un dispozitiv hardware sau software care se află între o aplicație web și internet. Acesta inspectează traficul pentru activități malițioase și poate bloca atacurile de injecție SQL.
Injecția SQL de ordinul doi apare atunci când un atacator poate injecta o sarcină utilă care este stocată de aplicația web și apoi executată ulterior. Acest tip de atac este mai dificil de realizat deoarece atacatorul trebuie să aibă o modalitate de a declanșa execuția sarcinii utile stocate.
Injecția SQL oarbă este un atac în care atacatorul nu vede direct rezultatele încărcăturii lor. În schimb, trebuie să folosească afirmații adevărate sau false pentru a deduce informații din baza de date. Acest tip de atac este mai dificil de executat, dar poate fi la fel de periculos ca și alte tipuri de injecție SQL.
O interogare stivuită este un tip de injecție SQL în care atacatorul folosește mai multe interogări pentru a extrage informații din baza de date. Acest tip de atac este mai dificil de executat, dar poate fi foarte periculos dacă reușește.
Injecția SQL bazată pe erori este un atac în care atacatorul folosește erorile bazei de date pentru a deduce informații din baza de date. Acest atac este mai dificil de executat, dar poate fi foarte periculos dacă reușește.
securitate
admin este redactor senior pentru Government Technology. Anterior a scris pentru PYMNTS și The Bay State Banner și deține o diplomă de licență în scriere creativă de la Carnegie Mellon. Ea locuiește în afara Bostonului.