Injecții SQL
Așa-numitele „injecții SQL” sunt un tip de atac asupra unei aplicații care exploatează defectele de securitate din baza de date. În această lecție, vom vedea exemple de injecții SQL. Această lecție se bazează pe articolul lui Steve Friedl SQL Injection Attacks by Example pe care vă recomand să îl citiți sau pe foaia de trucuri cu injecție SQL. Desigur, obiectivul acestei lecții este de a crește gradul de conștientizare a necesității de a proteja orice aplicație web de acest tip de atac.
Exemplu de aplicație
Vom folosi ca exemplu o aplicație similară cu cea din exercițiile Baze de date 1.
- Această aplicație are un meniu cu trei opțiuni:
- Ștergeți totul, pentru a șterge și a crea tabelul utilizatorului, care conține doar două câmpuri (numele și parola utilizatorului).
- Adăugați utilizatori, pentru a adăuga nume de utilizatori și parolele acestora în tabelul utilizatorilor.
- Intrați în sistem, care simulează o pagină de autentificare într-o aplicație web, solicitând un nume de utilizator și o parolă, verificând dacă este în tabelul utilizatorilor și răspunde
- numele de utilizator și parola sunt corecte.
- numele de utilizator este corect, dar parola nu este corectă.
- numele de utilizator nu este corect.
- Această aplicație este vulnerabilă la unele atacuri de injecție SQL deoarece datele trimise de utilizator sunt incluse în interogările către baza de date fără niciun tratament anterior.
- Această aplicație nu este vulnerabilă la toate atacurile de injecție SQL discutate în această lecție, deoarece folosește extensia PDO. Dacă doriți să testați o aplicație similară vulnerabilă la toate atacurile discutate în această lecție pe computer, puteți descărca acest fișier (injection_sql_2.zip) și testați-l pe computerul dvs.
SQL Injection 1 - Accesați aplicația fără a avea un nume de utilizator sau o parolă
Când utilizatorul tastează un nume de utilizator și o parolă, aplicația răspunde la unul dintre cele trei mesaje:
Pentru a intra în sistem, introduceți numele de utilizator și parola:
| Utilizator: |
| Parola: |
Corectați numele de utilizator și parola.
Nume de utilizator incorect.
Pentru a verifica dacă aplicația include datele trimise de utilizator fără niciun tratament anterior, putem trimite o ofertă (simplă sau dublă) ca date.
Pentru a intra în sistem, introduceți numele de utilizator și parola:
| Utilizator: |
| Parola: |
Nume de utilizator incorect.
Pentru a intra în sistem, introduceți numele de utilizator și parola:
| Utilizator: |
| Parola: |
Eroare de interogare.
Acest ultim mesaj („Eroare la interogare”) ne anunță că datele nu sunt procesate și că interogările sunt, de asemenea, delimitate prin ghilimele duble. De ce?
Probabil că codul aplicației dvs. arată cam așa:
Punând un ghilimel dublu la începutul numelui de utilizator, interogarea devine
Această interogare este corectă (nu conține erori de sintaxă) și atunci când rulați baza de date returnează doar 0.
Cu toate acestea, introducerea unei singure citate la începutul numelui de utilizator transformă interogarea în
Această interogare nu este corectă (conține o eroare de sintaxă din cauza ghilimelelor din ghilimele celei de-a doua linii și când este executată, baza de date dă o eroare.
Acum, că știm că interogarea este delimitată de ghilimele duble, putem scrie câteva date care vor modifica interogarea și vor face aplicația să creadă că am introdus date de la un utilizator înregistrat.
Pentru a intra în sistem, introduceți numele de utilizator și parola:
| Utilizator: |
| Parola: |
Corectați numele de utilizator și parola.
În acest caz, interogarea bazei de date va fi ceva de genul acesta:
Această interogare este corectă și, atunci când este rulată, baza de date returnează numărul total de înregistrări din tabel, deoarece condiția este întotdeauna îndeplinită, chiar dacă numele de utilizator și parola sunt incorecte, deoarece condiția finală SAU '1' = '1 'este întotdeauna adevărat.
SQL Injection 2 - Aflați numele câmpurilor
Numele câmpurilor pot fi găsite prin încercare și eroare. Ideea este de a introduce date care creează interogări în care apar posibile nume ale câmpurilor. În cazul în care interogările dau o eroare, înseamnă că numele este incorect, dacă nu, înseamnă că am primit numele câmpurilor corect.
De exemplu, vom testa dacă numele unuia dintre câmpuri este „utilizator”.