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.

  • ???? Definiție: Injecția SQL introduce cod SQL malițios într-o interogare printr-un câmp de intrare nevalidat.
  • 🔓 Impact: Un atac reușit poate ocoli autentificările și poate citi, modifica sau șterge înregistrări.
  • 🧪 Exemplu: O condiție mereu adevărată plus un comentariu transformă o verificare a autentificării într-o bypass.
  • 🛠️ Unelte: SQLMap și jSQL automatizează detectarea și exploatarea parametrilor injectabili.
  • 🛡️ prevenirea: Interogările parametrizate, validarea intrărilor și conturile cu cele mai puține privilegii elimină acest decalaj.
  • 🤖 Margine modernă: Scanerele și firewall-urile bazate pe inteligență artificială semnalează modelele de injectare pe care semnăturile fixe le ratează.

Tutorial de injecție SQL

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.

Diagramă a modului în care o injecție SQL manipulează o interogare dinamică a bazei 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.

Gol SQL Fiddle fereastră pregătită pentru schemă și interogare

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.

SQL Fiddle rezultat care arată înregistrarea unui singur utilizator returnată

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 = 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 lipiți-o în SQL Fiddle Executați caseta de text SQL așa cum se arată mai jos.

SQL Fiddle returnarea înregistrării după rularea condiției injectate

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.

Diagramă de flux a pașilor pentru injectarea câmpului pentru parolă în formularul de conectare

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 — ]

Formular de autentificare cu șirul de injectare introdus în câmpul parolei

  • 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.

Detalierea modului în care este generată instrucțiunea SQL injectată

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:

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.

Fereastra principală a instrumentului de injecție SQL Havij

Instrumentul de mai sus poate fi utilizat pentru a evalua vulnerabilitatea unui site web sau a unei aplicații.

Întrebări frecvente

Numai cu permisiunea scrisă a proprietarului site-ului. Testarea unei aplicații pe care nu o dețineți este ilegală conform unor legi precum Legea americană privind frauda și abuzul informatic. Domeniile de aplicare ale recompenselor pentru erori definesc ce este permis.

Da. În OWASP Top 10:2025, injecția se clasează pe locul A05, iar testarea încă găsește injecții în aproape fiecare aplicație. Cu mii de noi CVE-uri de injecție SQL pe an, rămâne un risc web important.

MD5 este un hash rapid, nu o criptare, iar atacatorii îl sparg rapid cu tabele rainbow și GPU-uri. Folosiți în schimb un algoritm lent, cu soluții sărate, cum ar fi bcrypt sau Argon2 pentru parole.

Orice bază de date interogată prin SQL construit dinamic — MySQL, PostgreSQL, Microsoft SQL Server, Oracle și SQLiteDefectul constă în modul în care aplicația concatenează datele introduse de utilizator în interogări, nu în motorul bazei de date.

Firewall-urile și scanerele bazate pe inteligență artificială învață tipare normale de trafic, apoi semnalează intrări anormale, cum ar fi condițiile injectate sau comentariile, în timp real. Modelele de învățare automată detectează sarcini utile ofuscate pe care semnăturile fixe le omit.

Asistenții AI, cum ar fi Copilotul GitHub pot sugera interogări parametrizate și validare de intrare, dar reproduc și modele nesigure. Tratați fiecare sugestie ca pe o schiță și asociați-o cu un linter de securitate și revizuiți-o.

Injecția SQL vizează baza de date prin injectarea de cod SQL în interogările de pe server. Scriptarea cross-site vizează alți utilizatori prin injectarea de scripturi care rulează în browserele lor. Unul expune datele; celălalt deturnează sesiunile.

Un ORM (mapător obiect-relațional) construiește interogări din obiecte de cod cu parametrizare implicită, prevenind majoritatea injecțiilor SQL. Nu este infailibil - interogările brute și metodele nesigure tot prezintă scurgeri, așa că validarea este în continuare importantă.

Rezumați această postare cu: