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 12:14] katarinasql_injection [2023/09/27 13:01] (current) – done katarina
Line 100: Line 100:
  
  
 +====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.
 +
 +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:
 +   *SELECT@@version (MySQL)
 +   *SELECT*FROM v$version (Oracle)
 +   *SELECT version() (PostgreSQL)
 +   *SELECT * FROM information_schema.tables (razni sustavi)
 +
 +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, kakav bismo mogli izvršiti u Hacknite zadatku "napredne baze podataka", je:  
 +<code sql>
 +/skola.php?ocjena=nedovoljan' UNION SELECT * FROM v$version –
 +</code>
 +{{ ::db_fingerprinting.png?nolink&600 | Vraćen je error}}
 +
 +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>
 +/skola.php?ocjena=nedovoljan' UNION SELECT sqlite_version() AS version—
 +</code>
 +{{ ::db_fingerprinting2.png?nolink&600 | Novi error}}
 +Ovaj error kaže da postoji naredba koju smo iskoristili, ali brojevi redaka u jednoj i drugoj SELECT naredbi unije ne odgovaraju. Sada znamo da se koristi sqlite sustav baze podataka. Kako bismo uspješno izvršili naredbu, uzevši u obzir da se rezultati u tablici prikazuju s tri stupca, ponavljamo „sqlite_version()“ dio naredbe tri puta kako bi brojevi odabranih stupaca odgovarali i izvršavamo SQL injection naredbu:
 +<code sql>
 +/skola.php?ocjena=nedovoljan' UNION SELECT sqlite_version(),sqlite_version() , sqlite_version()  
 +                              AS version--
 +</code>
 +
 +{{ ::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ć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>
 +/skola.php?ocjena=nedovoljan' UNION SELECT tbl_name,type,sql FROM sqlite_schema --
 +</code>
 +{{ ::db_fingerprinting4.png?nolink&600 | Dohvaćene informacije iz sheme baze podataka}}
 +
 +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 "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.
 +
 +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>
 +/skola.php?ocjena=odličan' UNION SELECT predmet,opis,datum FROM zadace --
 +</code>
 +
 +{{ ::bruteforce_sql_inj.png?nolink&600 | Uspijeh!}}
 +
 +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://aws.amazon.com/what-is/sql/\\
 +[2]https://support.microsoft.com/en-us/office/access-sql-basic-concepts-vocabulary-and-syntax-444d0303-cde1-424e-9a74-e8dc3e460671\\
 +[3]https://www.dofactory.com/sql/syntax\\
 +[4]https://portswigger.net/web-security/sql-injection\\
 +[5]https://portswigger.net/web-security/sql-injection/examining-the-database\\
 +[6]https://portswigger.net/web-security/sql-injection/union-attacks\\
 +[7]https://www.invicti.com/blog/web-security/sql-injection-cheat-sheet/\\
 +[8]https://www.w3schools.com/html/html_urlencode.asp\\
 +[9]https://portswigger.net/web-security/sql-injection/examining-the-database\\
 +[10]https://www2.sqlite.org/cvstrac/wiki?p=InformationSchema
  
sql_injection.1695816891.txt.gz · Last modified: 2025/06/03 10:22 (external edit)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki