User Tools

Site Tools


sql_injection

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.  Navodnik

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.  Rješenje zadatka

PRIMJER - Zadatak s Hacknite platforme - Napredene baze podataka

Na temelju prethodnog iskustva, Ivica je odlučio da još treba raditi na svojim vještinama s bazama 
podataka.Kako bi dosegao nove razine znanja, Ivica je napravio web stranicu na kojoj je moguće
pretraživati lektire koje je pročitao i gledati najnovije zadaće koje je dobio. Uvjeren kako je ovaj put
stranica sigurna, Ivicu ne brine što je u tablicu sa zadaćama pohranio još neke tajne podatke.

Možeš li demonstrirati Ivici da ipak treba biti oprezniji u radu s bazama podataka?

FLAG je u formatu CTF2020[brojevi]

http://chal.platforma.hacknite.hr:11011

Otvaranjem zadatka, odabirom stranice označene kao „Škola” u navigaciji, prikazuju se dvije tablice, jedna s nazivom lektire, druga s nazivom zadaće. Svaka tablica ima različite nazive stupaca, te par relacija.

Tablice lektire i zadaće

Može se zaključiti da su informacije u tablicama izvadci iz baze podataka te da u bazi podataka postoje barem dvije različite tablice, iz kojih se vade prikazane relacije. Imena tablica i stupaca u tablicama mogu, ali ne moraju biti ista kao što su prikazana na stranici. Ukoliko isprobamo SQL injection s nepoznatim imenima tablica i stupaca, vrijedi u par pokušaja zaključujemo da su nazivi isti kao što su i prikazani na stranici.

Isto tako, osim tablica, na stranici se mogu primijetiti linkovi koji učitavaju stranicu s različitim URL argumentom „ocjena” te se sukladno tome tablica „lektire” puni drugačijim relacijama koje odgovaraju odabranoj ocjeni.

 Linkovi

Važna stvar na koju treba obratiti pozornost jest URL parametar ili „query string” ocjena koji se mijenja odabirom različitih linkova.Proizvoljnim upisivanjem teksta „dovoljan” kao vrijednost parametra stringa ocjena, također se dobivaju neke relacije u tablici lektire.

/skola.php?ocjena=dovoljan

Ovo je dobar trag, koji usmjerava na manipulaciju URL parametra za rješavanje zadatka.

Ajmo vidjeti što će se dogoditi pokušamo li umetnuti basic SQL injection u URL parametar ocjena:

/skola.php?ocjena=odličan OR 1 = 1

Primjećujemo, kao prvo, da ovo ne radi. OSim toga, primjećujemo da se uneseni tekst „?ocjena=odličan or 1 = 1” pretvorio u „?ocjena=odličan%20or%201%20=%201” u linku. To je zato što se unutar URL-a koristi ASCII enkodiranje pa se znakovi u URL-u koji se nalaze izvan ASCII kodova, moraju posebno enkodirati. Posebni znakovi kojima se ne mogu pridijeliti ASCII kodovi se enkodiraju tako da se umjesto njih upisuje znak postotka „%” i heksadecimalna vrijednost odgovarajućeg znaka u URL enkodiranju.

Tako je znak razmaka, enkodiran kao „%20” te se sada jasno vidi kako dio URL-a enkodiran kao „?ocjena=odličan%20or%201%20=%201” odgovara proizvoljno unesenom URL-u „?ocjena=odličan or 1 = 1”. Važno je primijetiti da zadnji dio URL-a „%201” nije znak s kodom 201, nego enkodirani razmak i jedinica, odnosno „%20” i „1”.

Pri unošenju vrijednosti mogu se unositi ili URL kodovi znakova, ili sami znakovi, koje će onda browser sam pretvoriti u URL kodove umjesto korisnika, oba načina su „ispravna” no jedan je očigledno jednostavniji.

Sada možemo nastaviti s manipulacijom URL parametra s ciljem izvršavanja SQL injekcije. Pošto basic SQL injection ne radi te je prethodno zaključeno da su prisutne barem dvije tablice unutar baze podataka, sljedeće što ćemo isprobati je UNION SQL injection, gdje je cilj manipulirati unos kako bi se stvorio SQL upit koji dohvaća relacije iz više tablica pomoću operatora UNION. Pa pokušajmo:

SELECT ime, prezime FROM Studenti UNION SELECT ime, prezime FROM Profesori

Za izvršenje uspješnog UNION SQL injectiona, trebaju biti poznata imena tablica iz kojih se žele dohvatiti informacije koje se ne nalaze u predviđenoj tablici za koju se pretpostavlja da se izvršava upit. Pomoću posebnih naredbi se mogu izvući imena tablice u bazi podataka, imena stupaca u tablicama, te drugi podatci i metapodatci o bazi podataka, no te naredbe ovise o samoj programskoj podršci koja se koristi kao baza podataka te se razlikuju za, na primjer, MySQL, PostgreSQL, Oracle, SQLite, i druge. Zato je vrijedno i saznati koja je okolina i koju programsku podršku koristi meta kako bi se moglo bolje razmotriti daljnje opcije. Prije ovog postupka, često je korisno pokušati, na slijepo pretpostaviti i pogoditi imena tablica u kojima bi se mogle nalaziti željene informacije.

Na stranici zadatka, odabirom stranice „O meni” u navigaciji mogu se vidjeti neke informacije o okolini u kojoj se nalazi meta zadatka. Saznajemo da se web stranica poslužuje s računala koje koristi Linux s verzijom jezgre 5.15.0-78-generic.

 Informacije o sustavu

I dalje nije poznato koji točno software služi kao programska podrška za bazu podataka, pa ćemo samo pokušati izvršiti SQL injection pod pretpostavkom da su nazivi tablica i stupaca u tablicama isti kao što je prikazano na stranici.

Unošenjem vrijednosti „ /skola.php?ocjena=odličan' UNION SELECT * FROM lektire – „ za URL parametar ocjena, uspješno se dobivaju sve relacije tablice lektire. Sada je jasno da je moguće izvršavati UNION SQL injekcije. Sljedeće što treba pokušati je dohvaćanje svih relacije iz druge tablice za koju pretpostavljamo da se također zove kao što je i prikazano na stranici, „zadaće”. I to je to!

sql_injection.1695816753.txt.gz · Last modified: 2025/06/03 10:22 (external edit)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki