Ako navedemo ranjivosti u web aplikacijama koje su imale najveći utjecaj zbog stupnja ozbiljnosti koju mogu uzrokovati, bez sumnje ćemo otkriti SQL Injection. Ovaj ranjivost čak može omogućiti napadaču da s popisa sadržaja baze podataka dobije potpuni pristup poslužiteljuPogledajmo od čega se sastoji.
Uvjet injekcija, odnosi se na ubacivanje ili dodavanje SQL izraza u upit koji aplikacija izvršava u bazi podataka, to se provodi iskorištavanjem svakog unosa podataka koje aplikacija izravno ili neizravno traži od korisnika, upućujemo izravno na polja, na primjer obrasce gdje korisnik unosi određene podatke, neizravno bi to mogli biti parametri koji se prosljeđuju putem URL -a (GET). Cilj ubrizgavanja SQL izraza u upit je izmijeniti logiku navedenog upita ili rezultat koji će baza podataka vratiti.
Ovo je tipičan oblik u kojem se od korisnika i lozinke traži pristup privatnom području. Kôd na strani poslužitelja koji formira upit bio bi otprilike sljedeći:
$ username = $ _POST ['korisničko ime']; $ lozinka = $ _POST ['lozinka']; $ sql = "SELECT * FROM users WHERE username = '$ username' AND password = '$ password'";Kao što vidimo, prvo se pohranjuju korisničko ime i lozinka unešeni u varijable korisničko ime i zaporka, zatim se te vrijednosti uključuju u upit koji će biti poslan u bazu podataka da provjeri postoji li navedeni korisnik. Pretpostavimo da u našem primjeru korisnik unese kao korisničko ime administrator i lozinku proći123, prilikom slanja obrasca, formirani upit bit će sljedeći:
SELECT * FROM users WHERE username = 'admin' AND password = 'pass123'Kao što vidimo, kada se ulazni podaci postave, oni se nalaze između pojedinačnih navodnika kako bi predstavljali da se radi o tekstualnom nizu. Ovaj će upit biti poslan u bazu podataka i vratit će rezultat s podacima o navedenom korisniku, ako postoji, a pristup privatnom području bit će dopušten, u suprotnom će vratiti prazan rezultat i pristup će biti odbijen.
Kao što smo ranije spomenuli, SQL injekcija Sastoji se od dodavanja SQL koda upitu, a ovaj obrazac to dopušta kroz polja za unos, tako da imamo aplikaciju koja je osjetljiva na SQL injekciju.
Iskorištavanje ranjivosti
Cilj iskorištavanja ove ranjivosti je pristup privatnom području bez poznavanja ispravnog korisničkog imena ili lozinke te iskorištavanje ranjivosti. Dakle, ono što moramo postići je ubrizgati SQL kod kako bismo formirali upit koji vraća valjani rezultat.
Pogledajmo kako se formira upit ako u polje za lozinku unesemo sljedeći SQL kôd:
Kada se upit formira, to će biti sljedeće:
SELECT * FROM users WHERE username = 'hacker' AND password = '' or 1 = 1 # 'Važnu pozornost treba obratiti na činjenicu da se umetnuti kôd nalazi između pojedinačnih navodnika koji sadrže lozinku, pojedinačni navodnik na početku umetnutog koda je odgovoran za dovršavanje otvorenog navodnika u dijelu lozinke = ' upit, na ovaj način privremeno dobivamo sljedeći upit:
SELECT * FROM users WHERE username = 'hacker' AND password = ''Ovaj upit trenutno neće vratiti rezultate budući da nema takvog korisnika s tim vjerodajnicama, no analizirajmo ostatak umetnutog koda:
ili 1 = 1 #Rečenica ili 1 = 1 radikalno mijenja logiku upita, budući da kao što znamo u upitu formiranom uvjetno ILI Vratit će se kao istina kada je ispunjen barem jedan od dva izraza, u našem slučaju prvi izraz je korisničko ime = 'haker' I lozinka = '' , i drugi ili 1 = 1 , potonje je uvijek točno, odnosno 1 je uvijek jednako 1, jer će upit vratiti valjani rezultat.
Konačno, moramo se riješiti navodnika koji zatvara rečenicu, za to se možemo poslužiti komentarima koji se koriste u SQL: #, - (dvostruka crtica), O dobro /* */ . stoga je potpuni upit:
SELECT * FROM users WHERE username = 'hacker' AND password = '' or 1 = 1 # 'Sve nakon # bit će uzeto u obzir kao komentar i neće biti dio upita.
Za dobivanje valjanog rezultata postoje mnoge druge varijacije koda koje možemo umetnuti, na primjer: