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, fără îndoială vom găsi Injecție SQL. Acest vulnerabilitate poate chiar permite atacatorului să treacă de la listarea conținutului bazei de date la obținerea accesului complet la serverSă vedem în ce constă.
Termenul injecţie, se referă la injectarea sau adăugarea instrucțiunilor 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, ne referim direct la câmpuri, de exemplu, de formulare în cazul în care utilizatorul introduce anumite date, indirect ar putea fi parametri care sunt trimiși prin URL (GET). Obiectivul injectării instrucțiunilor SQL în interogare este de a modifica logica interogării menționate sau rezultatul care va fi returnat de baza de date.
Acesta este un formular tipic în care un nume de utilizator și o parolă sunt solicitate pentru a accesa o zonă privată. Codul din partea serverului care formează interogarea ar fi ceva de genul următor:
$ nume de utilizator = $ _POST ['nume de utilizator']; $ parolă = $ _POST ['parolă']; $ sql = "SELECT * FROM users WHERE username = '$ username' AND password = '$ password'";După cum putem vedea, mai întâi numele de utilizator și parola introduse în variabilele de nume de utilizator și parolă sunt stocate, apoi aceste valori sunt incluse în interogarea care va fi trimisă la baza de date pentru a verifica dacă respectivul utilizator există. Să presupunem că în exemplul nostru utilizatorul introduce ca nume de utilizator administrator și parolă trece123, când formularul este trimis, interogarea formată va fi următoarea:
SELECTAȚI * DE LA UTILIZATORII UNDE nume de utilizator = 'admin' ȘI parolă = 'pass123'După cum putem vedea, atunci când datele de intrare sunt plasate, acestea sunt între ghilimele unice pentru a reprezenta că este un șir de text. Această interogare va fi trimisă la baza de date și va returna un rezultat cu datele utilizatorului menționat, dacă există, iar accesul la zona privată va fi permis, altfel va returna un rezultat gol și accesul va fi refuzat.
După cum am menționat mai devreme, Injecție SQL Acesta constă în adăugarea unui cod SQL la o interogare, iar acest formular îl permite prin câmpurile de intrare, astfel încât să avem o aplicație vulnerabilă la injecția SQL.
Exploatarea vulnerabilității
Obiectivul exploatării acestei vulnerabilități este de a obține acces la zona privată fără a cunoaște numele de utilizator sau parola corectă și de a exploata vulnerabilitatea. 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 de parolă:
Când se formează interogarea, va fi după cum urmează:
SELECTAȚI * DE LA UTILIZATORII UNDE nume de utilizator = „hacker” ȘI parolă = ”sau 1 = 1 #”Trebuie acordată o atenție importantă faptului că codul inserat se află între ghilimelele unice care conțin parola, ghilimela unică de la începutul codului inserat este responsabilă pentru completarea ghilimelelor deschise în parola = 'parte din interogare, în acest mod obținem temporar următoarea interogare:
SELECT * DE LA UTILIZATORII UNDE nume de utilizator = 'hacker' ȘI parolă = ''Această interogare în acest moment nu va returna rezultate, deoarece nu există un astfel de utilizator cu acele acreditări, totuși să analizăm restul codului inserat:
sau 1 = 1 #Sentință sau 1 = 1 schimbă radical logica interogării, deoarece așa cum știm într-o interogare formată din condițional SAU Va reveni adevărat atunci când cel puțin una dintre cele două expresii este îndeplinită, în cazul nostru prima expresie este nume de utilizator = 'hacker' ȘI parolă = '' , iar al doilea sau 1 = 1 , acesta din urmă este întotdeauna adevărat, adică 1 este întotdeauna egal cu 1, deoarece interogarea va întoarce un rezultat valid.
În cele din urmă trebuie să scăpăm de ghilimela care închide propoziția, pentru aceasta putem folosi comentariile folosite în SQL: #, - (liniuță dublă), Bine /* */ . astfel interogarea completă este:
SELECTAȚI * DE LA UTILIZATORII UNDE nume de utilizator = „hacker” ȘI parolă = ”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 în cod pe care le putem insera, de exemplu: