3. SQL injekcija
SQL injekcija je tehnika koja omogućuje napadaču da izvršava neautorizirane SQL upite iskorištavajući neprovjeravanje ulaza u Web aplikacijama koje grade dinamičke SQL upite. Ranjivost je prisutna kod korisničkog unosa koji se nekorektno provjerava, i na taj način unesu podatci u koje su ubačeni u obliku SQL naredaba upiti koji vrše nedozvoljene radnje ili ako korisnički ulaz nije dovoljno provjeravan i time neočekivano je došlo do izvršavanja SQL upita.
3.1 Nepravilno filtrirani escape karakteri
Ovaj oblik SQL injekcije se događa kada korisnički ulaz nije filtriran za escape karaktere i zatim je ubačen u SQL prikaz. To rezultira potencijalnom manipulacijom naredbi i izvršavanje nepoželjnih upita nad bazom podataka od krajnjeg korisnika aplikacije.
Primjer:
statement := "SELECT * FROM users WHERE name = '" + userName + "';" |
Ako u userName varijablu zlonamjerni korisnik ubaci posebno oblikovani niz znakova, SQL upit kad se izvrši može rezultirati sasvim neočekivanim rezultatom. Tako posebno oblikovani niz znakova ili čak posebni upit, može se vrlo lako izvršiti bez obzira što napadač nema potrebne privilegije za izvršavanje. Na primjer, ako ubacimo u userName varijablu posebno oblikovan SQL niz znakova kao ovaj:
a' or 't'='t |
Tada će SQL ovaj unos reprezentirati na ovaj način
SELECT * FROM users WHERE name = 'a' or 't'='t'; |
Ako gore navedeni dio koda koristimo za autorizaciju korisnika , onda na ovaj način možemo dobiti neovlašten pristup jer ovaj primjer pokazuje kako umjesto korisničkog imena se može ubaciti tj. injektirati SQL segment koji kad se izvrši uvijek daje 't'='t' uvijek istinito, i na taj način se dobije pristup dijelu web stranice koja zahtjeva autorizaciju.
Teoretski bilo koju SQL naredbu možemo na ovaj način izigrati i injektirati preko ove metode, uključujući izvođenje višestrukih naredbi. Sljedeća vrijednost userName varijable u gornjoj naredbi bi uzrokovala brisanje users tablice i ispisivanje svih podataka i tablice data:
a';DROP TABLE users; SELECT * FROM data WHERE name LIKE '% |
Ovaj unos će SQL prikazati na sljedeći način:
SELECT * FROM users WHERE name = 'a';DROP TABLE users; SELECT * FROM data WHERE name LIKE '%'; |
3.2 Neispravno rukovanje tipovima podataka
Ovaj oblik SQL injekcije se dogodi kada korisničko predviđeno polje za unos nije strogo definirano koji tip podataka se treba unijeti. Primjer ovog oblika bi bio kad se treba unesti brojčana vrijednost a programer ne provjerava dali je korisnik stvarno unio broj ili je unio nešto drugo. Na primjer:
statement := "SELECT * FROM data WHERE id = " + a_variable + ";" |
Iz ovog primjera jasno se vidi da je programer namjeravao da varijabla a_variable prima broj, budući da reprezentira id identifikacijsko polje. Međutim, činjenica je da je to ustvari niz znakova kojim krajnji korisnik može manipulirati i na taj način ubacivati naredbe koje njemu odgovaraju. Na primjer, recimo da varijabla a_variable prihvati ovu vrijednost:
1;DROP TABLE users |
Ovaj kod će obrisati tablicu users iz baze podataka, a SQL će ovaj unos protumačiti na sljedeći način:
SELECT * FROM data WHERE id = 1;DROP TABLE users; |
SQL je ovo protumačio kao dvije naredbe, jedna je da ispiše sve podatke iz tablice
users za zapise za koje vrijedi da je id=1, a druga naredba je da izbriše tablicu users.
3.3 Ranjivosti unutar samog servera baze podataka
Ponekad ranjivosti mogu postojati unutar poslužitelja baze podataka softverske prirode, kao u slučaj s MySQL poslužitelja real_escape_chars funkcije. Moguće je da sam server ima propuste pri svojoj implementaciji i da na neadekvatan način obrađuje SQL upite, te time narušava sigurnost samog servera. Takvi propusti mogu rezultirati kompromitiranjem ne samo zapisa u bazi podataka, već manipulacijom cijelog računala.