Datele sunt una dintre cele mai vitale componente ale sistemelor informatice. Aplicațiile web bazate pe baze de date sunt utilizate de organizație pentru a obține date de la clienți. SQL este acronimul pentru Structured Query Language. Este folosit pentru a prelua și manipula date în baza de date.
Ce este o injecție SQL?
SQL Injection este un atac care otrăvește instrucțiunile SQL dinamice pentru a comenta anumite părți ale declarației sau a adăuga o condiție care va fi întotdeauna adevărată. Acesta profită de defectele de proiectare din aplicațiile web slab proiectate pentru a exploata instrucțiunile SQL pentru a executa cod SQL rău intenționat.
În acest tutorial, veți afla tehnici SQL Injection și cum puteți proteja aplicațiile web de astfel de atacuri.
- Cum funcționează injecția SQL
- Activitate de piratare: SQL Injectează o aplicație web
- Alte tipuri de atac SQL Injection
- Instrumente de automatizare pentru injecție SQL
- Cum să preveniți atacurile cu injecție SQL
- Activitate de piratare: utilizați Havji pentru injecție SQL
Cum funcționează injecția SQL
Tipurile de atacuri care pot fi efectuate folosind injecția SQL variază în funcție de tipul motorului bazei de date. Atacul funcționează pe instrucțiuni SQL dinamice . O instrucțiune dinamică este o instrucțiune care este generată în timpul rulării utilizând parametri parola dintr-un formular web sau un șir de interogare URI.
Să luăm în considerare o aplicație web simplă cu un formular de autentificare. Codul pentru formularul HTML este prezentat mai jos.
AICI,
- Formularul de mai sus acceptă adresa de e-mail, iar parola le trimite apoi la un fișier PHP numit index.php.
- Are opțiunea de a stoca sesiunea de conectare într-un cookie. Am dedus acest lucru din caseta de selectare Remember_me. Folosește metoda de postare pentru a trimite date. Aceasta înseamnă că valorile nu sunt afișate în adresa URL.
Să presupunem că declarația din backend pentru verificarea ID-ului de utilizator este după cum urmează
SELECTAȚI * DE LA UTILIZATORII UNDE e-mail = $ _POST ['e-mail'] ȘI parolă = md5 ($ _ POST ['parolă']);
AICI,
- Instrucțiunea de mai sus utilizează valorile matricei $ _POST [] direct fără a le igieniza.
- Parola este criptată folosind algoritmul MD5.
Vom ilustra atacul de injecție SQL folosind sqlfiddle. Deschideți adresa URL http://sqlfiddle.com/ în browserul dvs. web. Veți obține următoarea fereastră.
Notă: va trebui să scrieți instrucțiunile SQL
Pasul 1) Introduceți acest cod în panoul din stânga
CREATE TABLE `users` (`id` INT NOT NULL AUTO_INCREMENT,`email` VARCHAR(45) NULL,`password` VARCHAR(45) NULL,PRIMARY KEY (`id`));insert into users (email,password) values ('This email address is being protected from spambots. You need JavaScript enabled to view it.',md5('abc'));
Pasul 2) Faceți clic pe Build Schema
Pasul 3) Introduceți acest cod în panoul din dreapta
selectați * dintre utilizatori;
Pasul 4) Faceți clic pe Executare SQL. Veți vedea următorul rezultat
Să presupunem că consumatorul furnizează Această adresă de e-mail este protejată de spamboți. Aveți nevoie de JavaScript activat pentru ao vizualiza. și 1234 ca parolă. Declarația care trebuie executată împotriva bazei de date ar fi
SELECT * FROM users WHERE email = ' Această adresă de e-mail este protejată de spamboți. Aveți nevoie de JavaScript activat pentru ao vizualiza. ' ȘI parolă = md5 ('1234');
Codul de mai sus poate fi exploatat comentând partea de parolă și adăugând o condiție care va fi întotdeauna adevărată. Să presupunem că un atacator oferă următoarea intrare în câmpul de adresă de e-mail.
Această adresă de e-mail este protejată de spamboți. Aveți nevoie de JavaScript activat pentru ao vizualiza. ' SAU 1 = 1 LIMIT 1 - ']
xxx pentru parola.
Declarația dinamică generată va fi după cum urmează.
SELECT * FROM users WHERE email = ' Această adresă de e-mail este protejată de spamboți. Aveți nevoie de JavaScript activat pentru ao vizualiza. ' SAU 1 = 1 LIMIT 1 - '] ȘI parolă = md5 (' 1234 ');
AICI,
- Această adresă de e-mail este protejată de spamboți. Aveți nevoie de JavaScript activat pentru ao vizualiza. se încheie cu un singur ghilimel care completează ghilimele șirului
- SAU 1 = 1 LIMIT 1 este o condiție care va fi întotdeauna adevărată și limitează rezultatele returnate la o singură înregistrare.
- - „ȘI… este un comentariu SQL care elimină partea de parolă.
Copiați declarația SQL de mai sus și lipiți-o în caseta de text SQL FiddleRun SQL așa cum se arată mai jos
Activitate de piratare: SQL Injectează o aplicație web
Avem o aplicație web simplă la http://www.techpanda.org/ care este vulnerabilă la atacurile SQL Injection doar în scop demonstrativ. Codul formularului HTML de mai sus este preluat din pagina de autentificare. Aplicația oferă securitate de bază, cum ar fi igienizarea câmpului de e-mail. Aceasta înseamnă că codul nostru de mai sus nu poate fi utilizat pentru a ocoli datele de conectare.
Pentru a rezolva acest lucru, putem în schimb să exploatăm câmpul de parolă. Diagrama de mai jos prezintă pașii pe care trebuie să îi urmați
Să presupunem că un atacator oferă următoarea intrare
- Pasul 1: Introduceți Această adresă de e-mail este protejată de spamboți. Aveți nevoie de JavaScript activat pentru ao vizualiza. ca adresă de e-mail
- Pasul 2: Introduceți xxx ') SAU 1 = 1 -]
- Faceți clic pe butonul Trimiteți
- Veți fi direcționat către tabloul de bord
Instrucțiunea SQL generată va fi după cum urmează
SELECT * FROM users WHERE email = ' Această adresă de e-mail este protejată de spamboți. Aveți nevoie de JavaScript activat pentru ao vizualiza. ' ȘI parolă = md5 ('xxx') SAU 1 = 1 -] ');
Diagrama de mai jos ilustrează declarația a fost generată.
AICI,
- Declarația presupune în mod inteligent că se utilizează criptarea md5
- Finalizează ghidajul unic și parantezele de închidere
- Adaugă o afecțiune la enunț care va fi întotdeauna adevărată
În general, un atac SQL Injection de succes încearcă o serie de tehnici diferite, cum ar fi cele demonstrate mai sus, pentru a efectua un atac de succes.
Alte tipuri de atac SQL Injection
Injecțiile SQL pot face mai mult rău decât prin simpla trecere a algoritmilor de conectare. Unele dintre atacuri includ
- Ștergerea datelor
- Actualizarea datelor
- Introducerea datelor
- Executarea comenzilor pe server care pot descărca și instala programe rău intenționate, cum ar fi troieni
- Exportul de date valoroase, cum ar fi detaliile cardului de credit, e-mail și parole pe serverul la distanță al atacatorului
- Obținerea detaliilor de conectare a utilizatorului etc.
Lista de mai sus nu este exhaustivă; vă oferă doar o idee despre ceea ce SQL Injection
Instrumente de automatizare pentru injecție SQL
În exemplul de mai sus, am folosit tehnici de atac manual bazate pe vastele noastre cunoștințe despre SQL. Există instrumente automate care vă pot ajuta să efectuați atacurile mai eficient și în cel mai scurt timp posibil. Aceste instrumente includ
- SQLSmack - https://securiteam.com/tools/5GP081P75C
- SQLPing 2 - http://www.sqlsecurity.com/downloads/sqlping2.zip?attredirects=0&d=1
- SQLMap - http://sqlmap.org/
Cum să preveniți atacurile cu injecție SQL
O organizație poate adopta următoarea politică pentru a se proteja împotriva atacurilor SQL Injection.
- Intrarea utilizatorului nu trebuie să fie niciodată de încredere - trebuie întotdeauna igienizată înainte de a fi utilizată în instrucțiunile SQL dinamice.
- Proceduri stocate - acestea pot încapsula instrucțiunile SQL și pot trata toate intrările ca parametri.
- Instrucțiuni pregătite - instrucțiuni pregătite pentru a funcționa creând mai întâi instrucțiunea SQL, apoi tratând toate datele utilizatorului trimise ca parametri. Acest lucru nu are niciun efect asupra sintaxei instrucțiunii SQL.
- Expresii regulate - acestea pot fi utilizate pentru a detecta potențialul cod dăunător și a-l elimina înainte de a executa instrucțiunile SQL.
- Drepturile de acces ale utilizatorului pentru conexiunea la baza de date - ar trebui acordate numai drepturile de acces necesare conturilor utilizate pentru conectarea la baza de date. Acest lucru poate ajuta la reducerea a ceea ce pot efectua instrucțiunile SQL pe server.
- Mesaje de eroare - acestea nu ar trebui să dezvăluie informații sensibile și unde s-a produs exact o eroare. Mesaje de eroare personalizate simple, cum ar fi „Ne pare rău, ne confruntăm cu erori tehnice. Echipa tehnică a fost contactată. Vă rugăm să încercați din nou mai târziu ”poate fi utilizat în loc să afișați instrucțiunile SQL care au cauzat eroarea.
Activitate de piratare: utilizați Havij pentru injecție SQL
În acest scenariu practic, vom folosi programul Havij Advanced SQL Injection pentru a scana un site web pentru a detecta vulnerabilitățile.
Notă: programul dvs. antivirus poate să îl semnaleze din cauza naturii sale. Ar trebui să-l adăugați la lista de excluderi sau să întrerupeți software-ul antivirus.
Imaginea de mai jos arată fereastra principală pentru Havij
Instrumentul de mai sus poate fi utilizat pentru a evalua vulnerabilitatea unui site web / aplicație.
rezumat
- SQL Injection este un tip de atac care exploatează instrucțiunile SQL greșite
- Injecția SQL poate fi utilizată pentru a ocoli algoritmii de conectare, pentru a prelua, insera și actualiza și șterge date.
- Instrumentele de injecție SQL includ SQLMap, SQLPing și SQLSmack etc.
- O politică bună de securitate la scrierea declarației SQL poate ajuta la reducerea atacurilor de injecție SQL.