User Tools

Site Tools


sql_injection

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
sql_injection [2023/09/27 13:01] – done katarinasql_injection [2025/12/01 11:40] (current) – external edit 127.0.0.1
Line 1: Line 1:
 ====SQL injection==== ====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ć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|SQL]] upitima koji se šalju bazi podataka.+**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 uz pomoć 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|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. **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.
Line 11: Line 11:
 je velika ljubiteljica životinja, odlučila je napraviti web stranicu sa zanimljivim činjenicama o  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 ž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 +čuvati u bazi podataka. Do sada Petra nije nikada radila 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, +što zna. Na svojoj stranici je napravila mogućnost pretraživanja, i ako ponekad dolazi do greške, 
 tražilica radi relativno dobro. tražilica radi relativno dobro.
  
Line 60: Line 60:
 {{ ::nbp_zad_1.png?nolink&500 |Tablice lektire i zadaće}} {{ ::nbp_zad_1.png?nolink&500 |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.+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. Ako 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. 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.
Line 84: Line 84:
  
 Sada možemo nastaviti s manipulacijom URL parametra s ciljem izvršavanja SQL injekcije. 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ćoperatora UNION. Pa pokušajmo:+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 uz pomoć operatora UNION. Pa pokušajmo:
 <code sql> <code sql>
 SELECT ime, prezime FROM Studenti UNION SELECT ime, prezime FROM Profesori SELECT ime, prezime FROM Studenti UNION SELECT ime, prezime FROM Profesori
 </code> </code>
  
-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ć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.+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. Uz pomoć 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. 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.
Line 101: Line 101:
  
 ====Database fingerprinting==== ====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, MySQL, Sqlite, …) kako bismo saznali posebne SQL naredbe tog sustava koje se dalje mogu iskoristiti za dohvaćanje više informacija o bazi podataka, npr. relacijskaih shema, popisa svih tablica, detalja i naziva stupaca pojedine tablice, itd.+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, MySQL, Sqlite, …) kako bismo saznali posebne SQL naredbe tog sustava koje se dalje mogu iskoristiti za dohvaćanje više informacija o bazi podataka, npr. relacijskih shema, popisa svih tablica, detalja i naziva stupaca pojedine tablice, itd.
  
 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. 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.
Line 132: Line 132:
 {{ ::db_fingerprinting3.png?nolink&600 | Uspijeh!}} {{ ::db_fingerprinting3.png?nolink&600 | Uspijeh!}}
  
-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ć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:+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. Uz pomoć 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> <code sql>
 /skola.php?ocjena=nedovoljan' UNION SELECT tbl_name,type,sql FROM sqlite_schema -- /skola.php?ocjena=nedovoljan' UNION SELECT tbl_name,type,sql FROM sqlite_schema --
Line 138: Line 138:
 {{ ::db_fingerprinting4.png?nolink&600 | Dohvaćene informacije iz sheme baze podataka}} {{ ::db_fingerprinting4.png?nolink&600 | Dohvaćene informacije iz sheme baze podataka}}
  
-Sada su prikupljene sve potrebne informacije pomoćkojih se lako mogu sastaviti odgovarajuće SQL injekcije.+Sada su prikupljene sve potrebne informacije uz pomoć kojih se lako mogu sastaviti odgovarajuće SQL injekcije.
  
  
Line 146: Line 146:
 Proučimo primjer ovakvog postupka na Hacknite zadatku "napredne baze podataka". Proučimo primjer ovakvog postupka na Hacknite zadatku "napredne baze podataka".
  
-U slučaju nije izvršen database fingerprinting, nego se na slijepo pokušava nešto iskopati, za prva tri imena stupaca tablice zadaće mpožemo jednostavno pretpostaviti da su ista kao što je i prikazano, što je manje vjerojatno za zadnji stupac naziva „Je li zadaća riješena:” pa će se prva 3 stupca koristiti za UNION SELECT.+U slučaju nije izvršen database fingerprinting, nego se na slijepo pokušava nešto iskopati, za prva tri imena stupaca tablice zadaće možemo jednostavno pretpostaviti da su ista kao što je i prikazano, što je manje vjerojatno za zadnji stupac naziva „Je li zadaća riješena:” pa će se prva 3 stupca koristiti za UNION SELECT.
  
 VAŽNO!!! 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.+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 ako 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: Pokušajmo sada provesti takav UNION SQL injection:
sql_injection.1695819661.txt.gz · Last modified: 2025/12/01 11:40 (external edit)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki