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:08] – lss | second_order_sqli [2025/12/01 11:40] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 3: | Line 3: | ||
| Second order SQL injection je podskup SQL injection ranjivosti, koji je kompliciraniji za izvršiti, ali je i razvojnim programerima teže detektirati takvu ranjivost . Razlika je što obični (first order) SQL injection je prisutan u slučajevima kada se korisnički unos, koji se odmah izvršava unutar nekog SQL upita, nije dobro sanitiziran i osiguran, dok second order SQL injection se izvršava tako da se neki korisnički unos prvo pohrani negdje na server ili u bazu podataka, a zatim se pozivanjem neke druge funkcionalnosti, | Second order SQL injection je podskup SQL injection ranjivosti, koji je kompliciraniji za izvršiti, ali je i razvojnim programerima teže detektirati takvu ranjivost . Razlika je što obični (first order) SQL injection je prisutan u slučajevima kada se korisnički unos, koji se odmah izvršava unutar nekog SQL upita, nije dobro sanitiziran i osiguran, dok second order SQL injection se izvršava tako da se neki korisnički unos prvo pohrani negdje na server ili u bazu podataka, a zatim se pozivanjem neke druge funkcionalnosti, | ||
| - | Jednostavan primjer bi bio aplikacija, gdje je forma za registraciju korisnika zaštićena od SQL injectiona tako što dobro interpretira unos korisnika kao string i ne može se „escape-ati“ pomoću posebnih znakova, te bi korisnik pokušajem registracijom gdje unosi vrijednost | + | Jednostavan primjer bi bio aplikacija, gdje je forma za registraciju korisnika zaštićena od SQL injectiona tako što dobro interpretira unos korisnika kao string i ne može se „escape-ati“ pomoću posebnih znakova, te bi korisnik pokušajem registracijom gdje unosi vrijednost |
| Primjer nezaštićenog koda za izmjenu lozinke bio: | Primjer nezaštićenog koda za izmjenu lozinke bio: | ||
| Line 20: | Line 20: | ||
| < | < | ||
| + | |||
| + | __**Primjer**__ - **Zadatak s Hacknite platforme** - **e-Trgovina Union** | ||
| + | |||
| + | < | ||
| + | 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. | ||
| + | |||
| + | {{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. | ||
| + | |||
| + | {{second_order_2.png}} | ||
| + | |||
| + | Naime, kod koristi tzv. parametrizirane upite koji onemogućavaju SQL injekciju. | ||
| + | |||
| + | Analizom ostalih dijelova koda, može se vidjeti da se parametrizirani upiti koriste na svim mjestima, osim u funkciji // | ||
| + | |||
| + | {{second_order_3.png}} | ||
| + | |||
| + | Ovdje vidimo da se parametar < | ||
| + | |||
| + | Način na koji možemo iskoristiti ovu ranjivost jest da napravimo račun s korisničkim imenom koje će iskoristiti ranjivost unutar ovog SQL izraza, kada će nam sustav prikazivati sadržaj naše povijesti. | ||
| + | |||
| + | Kada napravimo korisnički račun s normalnim korisničkim imenom i prijavimo se u sustav, na početnoj stranici, tablica koja prikazuje povijest proizvoda je prazna. | ||
| + | |||
| + | 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 s ovim korisničkim imenom, vidimo da se sada unutar tablice povijesti proizvoda nalaze proizvodi svih ostalih korisnika u sustavu, kao što je prikazano na slici ispod. | ||
| + | |||
| + | {{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 s kojom ćemo dohvatiti one podatke koji nas zanimaju. | ||
| + | |||
| + | Iz koda znamo da u bazi postoji tablica //users//, s poljima | ||
| + | |||
| + | 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. | ||
| + | |||
| + | {{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. | ||
| + | |||
| + | Iz koda znamo da izraz odgovara sljedećem: | ||
| + | |||
| + | 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 probati izvršiti SQL injection, gdje ćemo imati koristiti 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, | ||
| + | |||
| + | < | ||
| + | |||
| + | {{second_order_7.png}} | ||
| + | |||
| + | 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 s korisničkim imenom // | ||
| + | |||
| + | 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 // | ||
| + | |||
| + | |||
| + | |||
| + | |||
second_order_sqli.1701698886.txt.gz · Last modified: 2025/12/01 11:40 (external edit)