Tutorial de injecție SQL: Învățați cu un exemplu
⚡ Rezumat inteligent
Injecția SQL este un atac care otrăvește instrucțiunile SQL dinamice pentru a ocoli autentificarea sau a expune datele, exploatând aplicațiile web care construiesc interogări pe baza datelor introduse de utilizator neconsolidate. Această pagină arată cum funcționează atacul și cum să îl preveniți.

Ce este o injecție SQL?
Injecția SQL este un atac care afectează instrucțiunile SQL dinamice pentru a comenta anumite părți ale instrucțiunii sau pentru a adăuga o condiție care va fi întotdeauna adevărată. Aceasta profită de defectele de design ale aplicațiilor web prost concepute pentru a exploata instrucțiunile SQL în scopul executării de cod SQL malițios.
Datele sunt una dintre cele mai vitale componente ale sistemelor informatice. Aplicațiile web bazate pe baze de date sunt utilizate de organizații pentru a obține date de la clienți. SQL este acronimul pentru Limbaj de interogare structuratEste utilizat pentru a recupera și manipula date din baza de date.
Cum funcționează un atac de tip SQL Injection?
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 generată la momentul execuției folosind parametri transmiși dintr-un formular web sau un șir de interogare URI.
Exemplu de injectare SQL
Să luăm în considerare o aplicație web simplă cu un formular de autentificare. Codul pentru formularul HTML este prezentat 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 și parola, apoi le trimite către un PHP fișier 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 post pentru a trimite date. Aceasta înseamnă că valorile nu sunt afișate în URL.
Să presupunem că instrucțiunea din backend pentru verificarea ID-ului utilizatorului este următoarea.
SELECT * FROM users WHERE email = $_POST['email'] AND password = md5($_POST['password']);
AICI,
- Declarația de mai sus utilizează direct valorile matricei $_POST[], fără a le dezinfecta.
- Parola este criptată folosind algoritmul MD5.
Vom ilustra un atac SQL injection folosind SQL Fiddle. Deschide 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 Creare schemă.
Pas 3) Introduceți acest cod în panoul din dreapta.
select * from users;
Pas 4) Faceți clic pe Executare SQL. Veți vedea următorul rezultat.
Să presupunem că un utilizator furnizează admin@admin.sys și parola 1234. Instrucțiunea executată asupra bazei de date ar fi:
SELECT * FROM users WHERE email = 'admin@admin.sys' AND password = md5('1234');
Codul de mai sus poate fi exploatat prin comentarea părții cu parola și adăugarea unei condiții care va fi întotdeauna adevărată. Să presupunem că un atacator introduce următoarele date î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 o singură apostrofă care completează apostroful de șir.
OR 1 = 1LIMIT 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 lipiți-o în SQL Fiddle Executaț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 atacuri SQL Injection, doar în scop demonstrativ. Codul formularului HTML de mai sus este preluat de pe 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 utilizat pentru a ocoli autentificarea.
Pentru a rezolva această problemă, exploatăm în schimb câmpul parolei. Diagrama de mai jos arată pașii de urmat.
Să presupunem că un atacator furnizează următoarele date de 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.
- Vei fi direcționat către tabloul de bord.
Instrucțiunea SQL generată va fi următoarea.
SELECT * FROM users WHERE email = 'xxx@xxx.xxx' AND password = md5('xxx') OR 1 = 1 -- ]');
Diagrama de mai jos ilustrează modul în care este generată afirmația.
AICI,
- Instrucțiunea presupune în mod inteligent că se utilizează criptarea md5.
- Completează apostroful simplu și paranteza de închidere.
- Adaugă la afirmație o condiție care va fi întotdeauna adevărată.
În general, un atac reușit combină mai multe tehnici precum cele prezentate mai sus.
Alte tipuri de atacuri cu injecție SQL
Injecțiile SQL pot face mai mult rău decât simpla ocolire a algoritmilor de conectare. Printre atacuri se numără:
- Ș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 ale utilizatorilor etc.
- Injectare SQL bazată pe cookie-uri
- Injecție SQL bazată pe erori
- Blind SQL Injection
Lista de mai sus nu este exhaustivă; vă oferă doar o idee despre ce poate face SQL Injection.
Instrumente de automatizare pentru injectare 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:
- SQLMap - http://sqlmap.org/
- Injecție jSQL – https://www.kali.org/tools/jsql/
Cum să previi atacurile de tip SQL Injection
O organizație poate adopta următoarea politică pentru a se proteja împotriva atacurilor SQL Injection.
- Introducerea datelor de către utilizator nu ar trebui niciodată considerată de încredere – Trebuie întotdeauna igienizat î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 pregătite – instrucțiunile pregătite funcționează prin crearea mai întâi a instrucțiunii SQL, apoi tratarea tuturor datelor utilizatorului trimise ca parametri. Acest lucru nu are niciun efect asupra sintaxei instrucțiunii SQL.
- Expresii obisnuite – acestea pot fi folosite pentru a detecta cod potențial dăunător și a-l elimina înainte de executarea instrucțiunilor SQL.
- Drepturi de acces ale utilizatorilor pentru conexiunea la baza de date – conturilor utilizate pentru 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 sau locul exact în care s-a produs o eroare. În loc să se afișeze instrucțiunile SQL care au cauzat eroarea, se pot folosi 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”.
Activitate de piratare: Utilizați Havij pentru injectarea SQL
În acest scenariu practic, folosim programul Havij Advanced SQL Injection pentru a scana un site web în căutare de vulnerabilități.
Notă: Havij este un oraș vechi, neîntreținut Windows instrument — SQLMap de mai sus este standardul open-source actual.
Notă: programul antivirus îl poate semnala datorită naturii sale. Ar trebui să îl adăugați la lista de excluderi sau să întrerupeți program antivirus.
Imaginea de mai jos prezintă fereastra principală pentru Havij.
Instrumentul de mai sus poate fi utilizat pentru a evalua vulnerabilitatea unui site web sau a unei aplicații.








