sql_injection
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
sql_injection [2023/09/27 11:38] – katarina | sql_injection [2023/09/27 13:01] (current) – done katarina | ||
---|---|---|---|
Line 20: | Line 20: | ||
</ | </ | ||
- | Zadatak | + | Zadatak |
{{ :: | {{ :: | ||
Line 40: | Line 40: | ||
Pokretanjem tražilice s takvim unosom, uspješno se izvršava SQL injekcija te se dobiva rješenje zadatka. | Pokretanjem tražilice s takvim unosom, uspješno se izvršava SQL injekcija te se dobiva 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:// | ||
+ | </ | ||
+ | |||
+ | 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. | ||
+ | |||
+ | {{ :: | ||
+ | |||
+ | 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. | ||
+ | |||
+ | {{ :: | ||
+ | |||
+ | 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. | ||
+ | < | ||
+ | / | ||
+ | </ | ||
+ | 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: | ||
+ | <code sql> | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | Primjećujemo, | ||
+ | |||
+ | Tako je znak razmaka, enkodiran kao „%20” te se sada jasno vidi kako dio URL-a enkodiran kao „? | ||
+ | |||
+ | 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: | ||
+ | <code sql> | ||
+ | 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. | ||
+ | |||
+ | {{ :: | ||
+ | |||
+ | 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 „ / | ||
+ | |||
+ | |||
+ | ====Database fingerprinting==== | ||
+ | Kada se uspije pronaći „rupa“ kroz koju se može izvršavati SQL injection, vrlo je korisno izvršiti postupak prikupljanja što više podataka o samoj bazi. Prvi korak bi bio pronalazak točnog sustava koji se koristi za podržavanje baze podataka (PostgreSQL, | ||
+ | |||
+ | Uz pristup bazi podataka putem pronađene ranjivosti, izvršavaju se specifične naredbe pojedinih sustava. Pošto se error baze podataka prikazuje na stranici u originalnom obliku, lako se mogu pratiti odgovori baze dok se ne pronađe specifična za neki sustav. Iako za ovaj postupak postoje alati koji ga vrše automatski, ovdje će postupak biti proveden ručno radi bolje demonstracije. | ||
+ | |||
+ | Dani su primjeri specifičnih naredbi različitih sustava: | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | Ove naredbe se kombiniraju sa SQL injectionom te izvršavaju na stranici uz praćenje odgovora kroz errore. Primjer kombinacije druge naredbe sa SQL injectionom, | ||
+ | <code sql> | ||
+ | / | ||
+ | </ | ||
+ | {{ :: | ||
+ | |||
+ | Analizom vraćene pogreške koja navodi da ne postoji tablica „v$version” možemo zaključiti da se ne koristi sustav Oracle. Izvršavanjem prve naredbe u SQL injection dobiva se error koji navodi da je netočna sintaksa naredbe, radi korištenih „@“ znakova čime se zaključuje da se ne koristi ni MySQL kao sustav za bazu podataka. | ||
+ | |||
+ | Pokušajmo sad izvršiti naredbu sa sintaksom specifičnom za SQLite: | ||
+ | <code sql> | ||
+ | / | ||
+ | </ | ||
+ | {{ :: | ||
+ | Ovaj error kaže da postoji naredba koju smo iskoristili, | ||
+ | <code sql> | ||
+ | / | ||
+ | AS version-- | ||
+ | </ | ||
+ | |||
+ | {{ :: | ||
+ | |||
+ | Sada kada je potvrđeno da se koristi sqlite, mogu se dalje proučiti specifične naredbe sqlite sustava za dohvat informacija o bazi podataka. Sqlite baze podataka imaju tablicu „sqlite_schema“ sa podatcima o samoj bazi i definiranim nazivima atributa stupaca tablice. Pomoću ovih informacija može se sastaviti SQL injekcija koja će dohvatiti podatke iz sheme baze podataka kako bismo saznali imena tablica i stupaca u tablicama. Sastavljena naredba SQL injekcije je: | ||
+ | <code sql> | ||
+ | / | ||
+ | </ | ||
+ | {{ :: | ||
+ | |||
+ | Sada su prikupljene sve potrebne informacije pomoću kojih se lako mogu sastaviti odgovarajuće SQL injekcije. | ||
+ | |||
+ | |||
+ | ====Bruteforcing==== | ||
+ | Nekad se database fingerprinting može preskočiti tako da se prije njega pokuša grubom silom (bruteforce) pokušati pogoditi nazive ciljanih tablica i stupaca, što može, ali i ne mora biti uspješno. | ||
+ | |||
+ | Proučimo primjer ovakvog postupka na Hacknite zadatku " | ||
+ | |||
+ | U slučaju nije izvršen database fingerprinting, | ||
+ | |||
+ | VAŽNO!!! | ||
+ | U tablici lektire prisutna su 3 stupca, dok su u tablici zadaće prisutna 4 stupca. To znači da kada će se raditi UNION SELECT tih dviju tablica, pošto se rezultati prikazuju u tablici s 3 stupca, ne smije se koristiti SELECT * FROM zadaće jer bi nastao error pokušajem prikazivanja dohvaćenih podataka s 4 stupca u tablici s 3 stupca. Umjesto toga, treba odabrati 3 ili manje stupaca iz tablice zadaća, pri čemu ukoliko ih se dohvaća manje od 3, mora se naznačiti da se prazni stupac puni NULL vrijednostima. | ||
+ | |||
+ | Pokušajmo sada provesti takav UNION SQL injection: | ||
+ | <code sql> | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | {{ :: | ||
+ | |||
+ | Ovim UNION SQL injectionom dobili smo rješenje zadatka te vidimo da se flag nalazi u stupcu „Opis” tablice zadaće. Nazivi stupaca i vrijednosti u tablici za relacije dohvaćene iz tablice zadaće nisu sukladne jer su se podatci iz baze podataka dohvatili na nepredviđen način te zajedno čine skup podataka za koji tablica u kojoj se prikazuju nije namijenjena. | ||
+ | |||
+ | ===Izvori=== | ||
+ | [1]https:// | ||
+ | [2]https:// | ||
+ | [3]https:// | ||
+ | [4]https:// | ||
+ | [5]https:// | ||
+ | [6]https:// | ||
+ | [7]https:// | ||
+ | [8]https:// | ||
+ | [9]https:// | ||
+ | [10]https:// | ||
sql_injection.1695814734.txt.gz · Last modified: 2025/06/03 10:22 (external edit)