Cum funcționează atacul SQL Injection

{title}

Dacă enumerăm vulnerabilitățile din aplicațiile web care au avut cel mai mare impact datorită gradului de severitate pe care îl pot provoca, ne vom confrunta fără îndoială cu SQL Injection . Această vulnerabilitate poate permite atacatorului să enumere conținutul bazei de date pentru a obține acces complet la server, să vedem din ce constă.

Termenul injecție se referă la injectarea sau adăugarea de declarații SQL într-o interogare pe care aplicația o execută în baza de date, aceasta se realizează profitând de orice intrare de date pe care aplicația o solicită direct sau indirect de la utilizator, la care ne referim direct de exemplu, pentru a forma câmpuri în care utilizatorul introduce anumite date, în mod indirect acestea ar putea fi parametri care sunt trecuți prin URL (GET). Obiectivul injectării instrucțiunilor SQL în interogare este de a modifica logica acelei interogări ca o comoditate sau ca rezultat care va fi returnat de baza de date.

{title}

Acesta este un formular tipic care solicită un nume de utilizator și o parolă pentru a accesa o zonă privată. Codul din partea serverului care formează interogarea ar fi ca acesta:

 $ username = $ _POST ['nume utilizator']; $ parolă = $ _POST ['parolă']; $ sql = "SELECT * DE LA utilizatori WHERE username = '$ username' ȘI parolă = '$ parola'"; 
După cum putem vedea, numele de utilizator și parola introduse în variabilele de utilizator și parolă sunt stocate mai întâi, apoi aceste valori sunt incluse în interogarea care va fi trimisă bazei de date pentru a verifica dacă respectivul utilizator există. Presupunem că în exemplul nostru utilizatorul introduce ca nume de utilizator admin și parolă pass123, atunci când formularul este trimis, interogarea formată va fi următoarea:
 SELECTA * DE LA utilizatori WHERE username = 'admin' ȘI parola = 'pass123' 
După cum putem vedea, la introducerea datelor de intrare, acestea sunt lăsate în ghilimele unice pentru a reprezenta că este un șir de text. Această interogare va fi trimisă bazei de date și va returna un rezultat cu datele utilizatorului menționat, dacă există, iar accesul la spațiul privat va fi permis, în caz contrar, va returna un rezultat gol și accesul va fi refuzat.

După cum am menționat anterior, injecția SQL constă în adăugarea codului SQL la o interogare, iar acest formular îl permite prin câmpurile de intrare, astfel încât avem o aplicație vulnerabilă la injecția SQL.

Exploatarea vulnerabilității
Obiectivul exploatării acestei vulnerabilități este de a obține acces în zona privată fără a cunoaște utilizatorul sau parola corectă și exploatarea vulnerabilității. Deci, ceea ce trebuie să realizăm este să injectăm cod SQL pentru a forma o interogare care returnează un rezultat valid.

Să vedem cum se formează interogarea dacă injectăm următorul cod SQL în câmpul parolă:

{title}

Când se formează interogarea, va fi următoarea:

 SELECTA * DE LA utilizatori WHERE username = 'hacker' ȘI parola = '' sau 1 = 1 # ' 
Este important să fim atenți că codul introdus se află între ghilimelele unice care cuprind parola, cotația unică la începutul codului inserat este responsabilă de completarea ofertei în partea de parolă de interogare = ', în acest fel obținem Temporar următoarea interogare:
 SELECTA * DE LA utilizatori WHERE username = 'hacker' ȘI parolă = '' 
Această interogare nu va întoarce rezultatele în acest moment, deoarece nu există un astfel de utilizator cu acele credențiale, cu toate acestea, să analizăm restul codului introdus:
 sau 1 = 1 # 
Propoziția sau 1 = 1 schimbă radical logica interogării, întrucât așa cum știm într-o interogare formată prin OR condiționat, se va întoarce atunci când cel puțin una dintre cele două expresii este îndeplinită, în cazul nostru prima expresie este username = 'hacker' ȘI parola = '', iar a doua sau 1 = 1, aceasta din urmă este întotdeauna îndeplinită, adică 1 este întotdeauna egală cu 1, deoarece interogarea va returna un rezultat valid.

În cele din urmă, trebuie să scăpăm de ghilimele care închide propoziția, pentru aceasta putem folosi comentariile utilizate în SQL: #, - (cratima dublă) sau / * * / . În acest fel, interogarea completă este:

 SELECTA * DE LA utilizatori WHERE username = 'hacker' ȘI parola = '' sau 1 = 1 # ' 
Totul după # va fi luat în considerare ca un comentariu și nu va face parte din interogare.

Pentru a obține un rezultat valid, există multe alte variații ale codului pe care le putem insera, de exemplu:

{title}