second_order_sqli
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| second_order_sqli [2023/12/04 14:45] – lss | second_order_sqli [2026/06/18 17:52] (current) – mbunic | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====Second order SQL injection==== | ====Second order SQL injection==== | ||
| - | Second order SQL injection je podskup SQL injection ranjivosti, koji je kompliciraniji za izvršiti, ali je i razvojnim programerima | + | **Second order SQL injection** je podskup |
| - | Jednostavan primjer bi bio aplikacija, gdje je forma za registraciju korisnika zaštićena od SQL injectiona | + | Uobičajeni SQL injection se pojavljuje kada se korisnički unos direktno koristi za konstrukciju SQL upita, dok se second order SQL injection izvršava tako da se neki korisnički |
| - | Primjer nezaštićenog koda za izmjenu lozinke | + | Jednostavan primjer bila bi aplikacija u kojoj se unos iz forme za registraciju korisnika koristi u SQL upitu za dodavanje korisnika u bazu na siguran način, ali se taj unos pri kasnijem korištenju ne koristi ispravno. |
| + | |||
| + | Aplikacija pri registraciji ispravno interpretira unos korisničkog imena kao string, te konstrukcija SQL upita za stvaranje korisnika nije ranjiva na SQL injection. | ||
| + | |||
| + | Pri registraciji napadač kao korisničko ime unosi vrijednost: | ||
| + | |||
| + | < | ||
| + | |||
| + | čime se samo u bazi stvara novi korisnik s tim korisničkim imenom. | ||
| + | |||
| + | Ako postoji funkcionalnost za promjenu lozinke, gdje se koristi SQL upit u koji se ubacuje korisničko ime korisnika kojemu se mijenja lozinka, bez adekvatnih zaštita, može doći do SQL injectiona. | ||
| + | |||
| + | Primjer ranjivog | ||
| < | < | ||
| - | "UPDATE users SET password=" | + | UPDATE users SET password = '" + novi_password + "' |
| </ | </ | ||
| - | (pretpostavka je da je korisnikov | + | (pretpostavka je da je unos lozinke |
| - | Pri pokretanju ovog koda za prethodno registriranog korisnika | + | Kada bi napadač |
| - | < | ||
| - | No, uzimajući u obzir da je </code>—</ | + | < |
| + | UPDATE users SET password = ' | ||
| + | </ | ||
| - | < | + | Dvije crtice koje se pojavljuju u upitu su oznaka za početak komentara u mnogim relacijskim bazama podataka. |
| + | |||
| + | < | ||
| + | |||
| + | Radi toga se dio upita nakon pojave te oznake više ne tretira kao SQL kod, pa je zato prethodni upit ekvivalentan sljedećem: | ||
| + | |||
| + | < | ||
| + | |||
| + | Ovaj upit bi promijenio | ||
| + | |||
| + | |||
| + | < | ||
| __**Primjer**__ - **Zadatak s Hacknite platforme** - **e-Trgovina Union** | __**Primjer**__ - **Zadatak s Hacknite platforme** - **e-Trgovina Union** | ||
| - | **TODO: ubaci opis zadatka ovdje** | + | < |
| + | Lokalna trgovina je odlučila napraviti svoju web stranicu na kojoj kupci mogu pratiti svoju povijest kupovine. Korisnici se mogu sami registrirati na tu stranicu, i pri svakoj fizičkoj kupnji u trgovini mogu dati svoje korisničko ime kako bi se njihova povijest kupovine unijela u bazu podatka. Stranica bi mogla biti korisna svim sadašnjim i budućim kupcima trgovine! | ||
| + | |||
| + | Flag je u formatu CTF2021[brojevi] | ||
| + | |||
| + | http:// | ||
| + | </ | ||
| Pri rješavanju zadatka, prvo što nam se nudi je forma za registraciju. | Pri rješavanju zadatka, prvo što nam se nudi je forma za registraciju. | ||
| - | **TODO: slika ovdje** | + | {{second_order_1.png}} |
| Analizom izvornog koda ovog zadatka, koji je također dostupan u zadatku, vidimo da se SQL upit tako formiran da se nad njime ne mogu izvršavati SQL injekcije, što je prikazano u slici ispod. | Analizom izvornog koda ovog zadatka, koji je također dostupan u zadatku, vidimo da se SQL upit tako formiran da se nad njime ne mogu izvršavati SQL injekcije, što je prikazano u slici ispod. | ||
| - | **TODO: slika ovdje** | + | {{second_order_2.png}} |
| Naime, kod koristi tzv. parametrizirane upite koji onemogućavaju SQL injekciju. | Naime, kod koristi tzv. parametrizirane upite koji onemogućavaju SQL injekciju. | ||
| Line 37: | Line 67: | ||
| Analizom ostalih dijelova koda, može se vidjeti da se parametrizirani upiti koriste na svim mjestima, osim u funkciji // | Analizom ostalih dijelova koda, može se vidjeti da se parametrizirani upiti koriste na svim mjestima, osim u funkciji // | ||
| - | **TODO: slika ovdje** | + | {{second_order_3.png}} |
| Ovdje vidimo da se parametar < | Ovdje vidimo da se parametar < | ||
| Line 47: | Line 77: | ||
| Kao prvi pokušaj iskorištavanja ranjivosti možemo probati napraviti korisnički račun kojemu će korisničko ime biti | Kao prvi pokušaj iskorištavanja ranjivosti možemo probati napraviti korisnički račun kojemu će korisničko ime biti | ||
| - | < | + | < |
| - | Nakon stvaranja korisničkog računa | + | Nakon stvaranja korisničkog računa |
| - | **TODO: slika ovdje** | + | {{second_order_4.png}} |
| - | Ovo znači da smo uspjeli izvršiti SQL injekciju nad sustavom i da sada znamo iskoristiti ranjivost. Sada još samo moramo pronaći način kako napraviti SQL injekciju | + | Ovo znači da smo uspjeli izvršiti SQL injekciju nad sustavom i da sada znamo iskoristiti ranjivost. Sada još samo moramo pronaći način kako napraviti SQL injekciju |
| - | Iz koda znamo da u bazi postoji tablica // | + | Iz koda znamo da u bazi postoji tablica // |
| Sada možemo pokušati izvršiti SQL injection, gdje će korisničko ime biti: | Sada možemo pokušati izvršiti SQL injection, gdje će korisničko ime biti: | ||
| - | < | + | < |
| Kako bismo dohvatili imena i lozinka korisnika iz baze. Izvršavanjem ove SQL injekcije, dobivamo error koji je prikazan na slici ispod. | Kako bismo dohvatili imena i lozinka korisnika iz baze. Izvršavanjem ove SQL injekcije, dobivamo error koji je prikazan na slici ispod. | ||
| - | ** TODO: slika ** | + | {{second_order_5.png}} |
| Ovaj error nam govori da broj parametara u SELECT izrazu koji smo konstruirali ne odgovara broju parametara u SELECT izrazu s kojim radimo UNION. | Ovaj error nam govori da broj parametara u SELECT izrazu koji smo konstruirali ne odgovara broju parametara u SELECT izrazu s kojim radimo UNION. | ||
| Line 69: | Line 99: | ||
| Iz koda znamo da izraz odgovara sljedećem: | Iz koda znamo da izraz odgovara sljedećem: | ||
| + | < | ||
| SELECT * FROM povijest WHERE korisnik= ' | SELECT * FROM povijest WHERE korisnik= ' | ||
| + | </ | ||
| - | Iako se u tablici za prikaz proizvoda na početnoj stranici nalaze samo dva stupca, SQL izraz kojeg mi manipuliramo, | ||
| - | U sljedećem pokušaju možemo | + | Iako se u tablici za prikaz proizvoda na početnoj stranici nalaze samo dva stupca, SQL izraz kojeg mi manipuliramo, |
| - | < | + | < |
| + | SELECT | ||
| + | </ | ||
| - | **TODO: slika ovdje** | + | jedino znamo da se dohvaćaju svi stupci iz tablice povijest, ali ne znamo točno koliko |
| + | |||
| + | U sljedećem pokušaju možemo probati izvršiti SQL injection, koristeći tri stupca u SELECT izrazu. Primjer takvog pokušaja jest stvaranje korisničkog računa s korisničkim imenom: | ||
| + | |||
| + | < | ||
| + | |||
| + | {{second_order_6.png}} | ||
| Vidimo da smo uspješno dobili hasheve lozinki svih korisnika u sustavu. Također vidimo da se na stranici prikazuje samo zadnji parametar koji smo unijeli u našem SELECT izrazu, koji je u ovom slučaju password. Ako želimo prikazati više informacija, | Vidimo da smo uspješno dobili hasheve lozinki svih korisnika u sustavu. Također vidimo da se na stranici prikazuje samo zadnji parametar koji smo unijeli u našem SELECT izrazu, koji je u ovom slučaju password. Ako želimo prikazati više informacija, | ||
| Line 83: | Line 122: | ||
| < | < | ||
| - | **TODO: slika ovdje** | + | {{second_order_7.png}} |
| + | |||
| + | Sada smo uspješno izvršili SQL injection pomoću kojega smo dohvatili i prikazali korisnička imena i hasheve lozinki svih korisnika u sustavu, Možemo vidjeti da su korisnici korisnički računi koje smo stvarali za izvršavanje SQL injekcija, te da jest zadnji korisnik, korisnik s korisničkim imenom // | ||
| - | Sada smo uspješno izvršili SQL injection pomoću kojega smo dohvatili i prikazali korisnička imena i hasheve lozinka svih korisnika u sustavu, Možemo vidjeti da su korisnici korisnički računi koje smo stvarali za izvršavanje SQL injekcija, te da jest zadnji korisnik, korisnik sa korisničkim imenom | + | Kako bi dobili njegovu lozinku, odnosno „revers“ hasha njegove lozinke, možemo iskoristiti crackstation.net, |
| - | Kako bi dobili njegovu lozinku, odnosno „revers“ hasha njegove lozinke, možemo iskoristiti crackstation.net, | + | {{second_order_8.png}} |
| Sada prijavom u sustav s korisničkim imenom //admin// i lozinkom // | Sada prijavom u sustav s korisničkim imenom //admin// i lozinkom // | ||
second_order_sqli.1701701156.txt.gz · Last modified: 2025/12/01 11:40 (external edit)