Tutorial de injecție SQL: Cum să învățați cu un exemplu
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 pentru a adăuga o condiție care va fi întotdeauna adevărată. Profită de defectele de proiectare ale aplicațiilor web prost proiectate pentru a exploata instrucțiunile SQL pentru a executa cod SQL rău intenționat.
Datele sunt una dintre cele mai importante componente ale sistemelor informatice. Aplicațiile web bazate pe baze de date sunt folosite 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 din baza de date.
Cum funcționează atacul cu injecție SQL?
Tipurile de atacuri care pot fi efectuate folosind injecția SQL variază în funcție de tipul de motor al 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 folosind parametrii parola dintr-un formular web sau șirul de interogare URI.
Exemplu de injectare SQL
Să luăm în considerare o aplicație web simplă cu un formular de conectare. Codul pentru formularul HTML este afișat mai jos.
<form action=‘index.php’ method="post"> <input type="email" name="email" required="required"/> <input type="password" name="password"/> <input type="checkbox" name="remember_me" value="Remember me"/> <input type="submit" value="Submit"/> </form>
AICI,
- Formularul de mai sus acceptă adresa de e-mail, iar parola le trimite apoi către a PHP fișier numit index.php.
- Are opțiunea de stocare a sesiunii de conectare într-un cookie. Am dedus acest lucru din caseta de selectare reamintiți-mă. Folosește metoda post pentru a trimite date. Aceasta înseamnă că valorile nu sunt afișate în URL.
Să presupunem că declarația de la backend pentru verificarea ID-ului utilizatorului este după cum urmează
SELECT * FROM users WHERE email = $_POST['email'] AND password = md5($_POST['password']);
AICI,
- Declarația de mai sus folosește valorile lui
$_POST[]
matrice direct fără a le igieniza. - Parola este criptată folosind algoritmul MD5.
Vom ilustra atacul cu 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
Pas 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 ('m@m.com',md5('abc'));
Pas 2) Faceți clic pe Build Schema
Pas 3) Introduceți acest cod în panoul din dreapta
select * from users;
Pas 4) Faceți clic pe Run SQL. Veți vedea următorul rezultat
Să presupunem consumabile pentru utilizator admin@admin.sys si 1234 ca parola. Declarația care urmează să fie executată împotriva bazei de date ar fi
SELECT * FROM users WHERE email = 'admin@admin.sys' AND password = md5('1234');
Codul de mai sus poate fi exploatat comentând partea cu 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 adresei de e-mail.
xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ]
xxx pentru parola.
Instrucțiunea dinamică generată va fi după cum urmează.
SELECT * FROM users WHERE email = 'xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ] AND password = md5('1234');
AICI,
- xxx@xxx.xxx se termină cu un singur ghilimele care completează ghilimelele
OR 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 cu parolă.
Copiați instrucțiunea SQL de mai sus și inserați-o SQL FiddleRulați caseta de text 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 numai în scop demonstrativ. Codul formularului HTML de mai sus este preluat din pagina de conectare. 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 folosit pentru a ocoli autentificarea.
Pentru a ocoli asta, putem exploata în schimb 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 xxx@xxx.xxx 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 = 'xxx@xxx.xxx' AND password = md5('xxx') OR 1 = 1 -- ]');
Diagrama de mai jos ilustrează declarația care a fost generată.
AICI,
- Declarația presupune în mod inteligent că se utilizează criptarea md5
- Completează ghilimele unice și paranteza de închidere
- Adaugă o condiție la afirmație care va fi întotdeauna adevărată
În general, un atac cu injecție SQL de succes încearcă o serie de tehnici diferite, cum ar fi cele demonstrate mai sus, pentru a efectua un atac cu succes.
Alte tipuri de atacuri cu injecție SQL
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
- Inserarea datelor
- Executarea comenzilor pe server care pot descărca și instala programe rău intenționate, cum ar fi troienii
- Exportarea datelor valoroase, cum ar fi detaliile cardului de credit, e-mailul și parolele, către serverul de la distanță al atacatorului
- Obținerea detaliilor de conectare a utilizatorului etc
- Injectare SQL bazată pe cookie-uri
- Injecție SQL bazată pe erori
- Blind SQL Injection
Lista de mai sus nu este exhaustivă; doar vă oferă o idee despre ce injecție SQL
Instrumente de automatizare pentru injectare SQL
În exemplul de mai sus, am folosit tehnici de atac manual bazate pe cunoștințele noastre vaste 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
- SQLMap - http://sqlmap.org/
- Injecție JSQL - https://tools.kali.org/vulnerability-analysis/jsql
Cum să preveniți atacurile prin injecție SQL
O organizație poate adopta următoarea politică pentru a se proteja împotriva atacurilor SQL Injection.
- Intrările utilizatorului nu ar trebui să fie niciodată de încredere - Trebuie să fie întotdeauna dezinfectat înainte de a fi utilizat în instrucțiuni SQL dinamice.
- Proceduri stocate - acestea pot încapsula instrucțiunile SQL și pot trata toate intrările ca parametri.
- Declarații întocmite - a pregătit instrucțiunile să funcționeze prin crearea instrucțiunii SQL mai întâi, apoi tratând toate datele utilizatorului trimise ca parametri. Acest lucru nu are niciun efect asupra sintaxei instrucțiunii SQL.
- Expresii obisnuite - acestea pot fi folosite pentru a detecta un potențial cod dăunător și pentru a-l elimina înainte de a executa instrucțiunile SQL.
- Drepturi de acces utilizator conexiunea bazei de date – numai drepturile de acces necesare ar trebui acordate conturilor utilizate conectați-vă la baza de date. Acest lucru poate ajuta la reducerea a ceea ce instrucțiunile SQL pot efectua pe server.
- Mesaje de eroare - acestea nu ar trebui să dezvăluie informații sensibile și unde a apărut exact o eroare. Mesaje de eroare personalizate simple, cum ar fi „Ne pare rău, întâmpinăm erori tehnice. Echipa tehnică a fost contactată. Vă rugăm să încercați din nou mai târziu” poate fi folosit în loc de a afișa instrucțiunile SQL care au cauzat eroarea.
Activitate de piratare: Utilizați Havij pentru injectarea SQL
În acest scenariu practic, vom folosi programul Havij Advanced SQL Injection pentru a scana un site web pentru vulnerabilități.
Notă: dvs program antivirus îl poate semnala datorită 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 folosit pentru a evalua vulnerabilitatea unui site/aplicație web.
Rezumat
- SQL Injection este un tip de atac care exploatează instrucțiunile SQL proaste
- Injecția SQL poate fi utilizată pentru a ocoli algoritmii de conectare, pentru a prelua, insera și actualiza și șterge date.
- Instrumentele de injectare SQL includ SQLMap, SQLPing și SQLSmack etc.
- O bună politică de securitate atunci când scrieți instrucțiuni SQL poate ajuta la reducerea atacurilor de injecție SQL.