This is an old revision of the document!
SQL injection
SQL injection je web ranjivost koja dopušta korisniku stvaranje upita koji se izvršavaju nad relacijskom bazom podataka, odnosno umetanje upita u dijelove koda pomoću kojih izvršava akcije nad bazom podataka koje inače ne bi smio izvršiti te posljedično dohvaća podatke koje ne smije vidjeti ili stvara,mijenja ili briše podatke na koje ne bi smio utjecati. Uzrok ranjivosti je neadekvatna implementacija ograničenja, provjera i/ili validacija koje se izvršavaju nad stvorenim SQL upitima koji se šalju bazi podataka.
Basic SQL injection je tip SQL injectiona kojim se dohvaćaju dodatne relacije ili atributi relacija (stupci i redci tablice) koji bi trebali biti nedohvatljivi, ali koji su unutar iste domene, odnosno tablice ili skupa tablica.
PRIMJER -Zadatak s Hacknite platforme - Pretraživanje
Petra mora za zadatak iz predmeta "Web stranice" napraviti svoju vlastitu web stranicu. S obzirom na to da je velika ljubiteljica životinja, odlučila je napraviti web stranicu sa zanimljivim činjenicama o životinjama poput lava, slona ili geparda. Odabrala je par životinja i odlučila je informacije o njima čuvati u bazi podataka. Do sada Petra nije nikada radila sa bazama podataka pa ih je napravila najbolje što zna. Na svojoj stranici je našravila mogućnost pretraživanja, i ako ponekad dolazi do greške, tražilica radi relativno dobro. Flag je u formatu CTF2021[brojevi] http.//chal.platforma.hacknite.hr:10005
Zadatak jasno upućuje na ranjivost baze podataka. Kada se otvori stranica, možemo pronaći tražilicu u koju se unose pojmovi koji se dohvaćaju iz baze podataka. To nas upućuje na basic SQL injection ili UNION SQL injection. Unosom vrijednosti „lav” u tražilicu, obaviješteni smo da se lav nalazi u bazi podataka. Unosom jednog navodnika „ ' „ , stranica vraća „ Uncaught Error”, što sugerira da upiti korisnika nisu ispravno validirani i provjereni.
Isprobajmo sad basic SQL injection kojim se dohvaćaju sve relacije iz tablice iz koje se dohvaćaju rezultati pretrage putem tražilice. Predviđeni oblik upita u koji se umeće korisnikov argument koji se unosi preko tražilice je sljedeći:
SELECT*FROM zivotinje WHERE ime= '<unos korisnika>'
Mi nećemo slijediti predviđeni unos. Umjesto toga pišemo:
SELECT*FROM zivotinje WHERE ime= ' ' OR 1 = 1 --
U ovom unosu, tekst prije jednostrukog navodnika je nebitan, navodnik služi za „izlaz” unesenih naredbi izvan predviđenog stringa koji se uspoređuje s nazivima životinja u tablici. Nakon što je upit „izašao” izvan predviđenog stringa, mogu se umetati, odnosno injektirati proizvoljne SQL naredbe. Drugi dio unosa, „or 1= 1” predstavlja injektiranu SQL naredbu kojom se bazi podataka govori da vrati sve relacije iz tablice koje imaju ime isto kao ili gdje je jedan jednako jedan, što jest tautologija, odnosno uvijek je istinito, čime je uvjet uvijek zadovoljen. Pojednostavljeno, dobivamo cijelu tablicu.. Zadnji dio unosa „–”, služi za pretvorbu ostatka SQL naredbe u koju se umeće korisnikov unos u komentar, kako bi se spriječile pogreške sustava i kako bi se rezultat upita uspješno vratio. Sljedeći upit je ekvivalentan:
SELECT*FROM zivotinje
Pokretanjem tražilice s takvim unosom, uspješno se izvršava SQL injekcija te se dobiva rješenje zadatka.