blind_sqli
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| blind_sqli [2023/12/04 15:38] – lss | blind_sqli [2026/06/18 14:47] (current) – mbunic | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====Blind SQL injection==== | ====Blind SQL injection==== | ||
| - | Pri općenitom testiranju ranjivosti nekog unosa na SQL injekcije, mogu se prvo pokušati unijeti jednostruki ili dvostruki navodnici i ako je web poslužitelj podešen da prosljeđuje pogreške korisniku, korisniku se može proslijediti i prikazati poruku greška kojiu je baza poslala, gdje na primjer piše da je neispravno korištenje znakova navodnika. U nekim situacijama sustav | + | **Blind |
| - | Glavna razlika između slijepih i „običnih“ | + | Napadač potom koristi tu informaciju kako bi konstruirao |
| - | Informacija koje se mogu ovim načinom iskorištavanja saznati su, na primjer: | + | |
| - | - postoji li korisnik " | + | < |
| + | ako je uvjet X zadovoljen, napravi A, ako nije zadovoljen, napravi B. | ||
| + | </ | ||
| + | |||
| + | Gdje A i B izazivaju dva različita stanja sustava koja je moguće detektirati. | ||
| + | |||
| + | Primjeri ovakvih upita: | ||
| + | |||
| + | 1. Kada se može znati je li se dogodila greška u bazi ili ne: | ||
| + | |||
| + | < | ||
| + | Ako je točno da postoji | ||
| + | podijeli broj s nulom kako bi izazvao grešku. | ||
| + | </ | ||
| + | |||
| + | 2. Kada se može razlikovati jedino je li baza vratila prazan odgovor ili ne: | ||
| + | |||
| + | < | ||
| + | Ako je točno da postoji | ||
| + | vrati tog korisnika. | ||
| + | </ | ||
| + | |||
| + | 3. Kada se ne zna odgovor baze, ali se može znati koliko vremena je bazi podataka trebalo za odgovor: | ||
| + | |||
| + | < | ||
| + | Ako password korisnika " | ||
| + | spavaj 5 sekundi (ili, na primjer, izvrši zahtjevno računanje kojem treba više vremena za izvođenje) | ||
| + | </ | ||
| + | |||
| + | Napad ilustriran zadnjim primjerom, gdje se pomoću vremena izvršavanja upita eksfiltriraju podaci iz baze, naziva se **time-based blind SQL injection**. | ||
| + | |||
| + | |||
| + | Kako bi se saznali podaci u bazi, rezultat izvršavanja upita se mora spregnuti s nekom informacijom o stanju sustava koju je moguće razlikovati. Budući da najčešće postoje samo dva stanja koja je moguće jasno razlikovati, | ||
| + | |||
| + | Primjer koji prikazuje kako bi se ovakvim upitima eksfiltrirala lozinka korisnika admin: | ||
| + | |||
| + | < | ||
| + | - počinje li lozinka korisnika " | ||
| + | |||
| + | - počinje li lozinka korisnika " | ||
| + | |||
| + | - počinje li lozinka korisnika " | ||
| + | |||
| + | - počinje li lozinka korisnika " | ||
| + | |||
| + | - počinje li lozinka korisnika " | ||
| + | |||
| + | - počinje li lozinka korisnika " | ||
| + | |||
| + | - počinje li lozinka korisnika " | ||
| + | ... | ||
| + | </ | ||
| - | - počinje li lozinka korisnika admin sa slovom " | + | Iz ovog primjera je jasno da je za eksfiltraciju informacija |
| - | - počinje li lozinka korisnika admin sa slovom " | ||
| - | - počinje li lozinka korisnika admin sa slovima abc? | ||
| - | Iako su pitanja na koja možemo saznati odgovor samo potvrdna, odnosno jedine informacije koje možemo dobiti su da ili ne / točno ili netočno..., | ||
| __**Primjeri**__ - **Zadatak s Hacknite platforme** - ** Banka ** | __**Primjeri**__ - **Zadatak s Hacknite platforme** - ** Banka ** | ||
| Line 31: | Line 78: | ||
| Pri prvom pregledu stranice, vidimo da se stranica sastoji od početne stranice, login forme, admin portala i stranice za resetiranje lozinke. Pri isprobavanju login forme i admin portala, za unesene pokušaje korisničkim imena i lozinki dobivamo samo generičan odgovor „Krivo korisničko ime ili lozinka“. Pri pokušaju unošenja različitih imena u formu za resetiranje lozinke dobijemo odgovor „korisničko ime ne postoji“. Možemo pretpostavit da ako ovdje pogodimo barem ime nekog korisnika da ćemo dobit potvrdan odgovor. U tekstu zadatka je napisano da je Sara napravila | Pri prvom pregledu stranice, vidimo da se stranica sastoji od početne stranice, login forme, admin portala i stranice za resetiranje lozinke. Pri isprobavanju login forme i admin portala, za unesene pokušaje korisničkim imena i lozinki dobivamo samo generičan odgovor „Krivo korisničko ime ili lozinka“. Pri pokušaju unošenja različitih imena u formu za resetiranje lozinke dobijemo odgovor „korisničko ime ne postoji“. Možemo pretpostavit da ako ovdje pogodimo barem ime nekog korisnika da ćemo dobit potvrdan odgovor. U tekstu zadatka je napisano da je Sara napravila | ||
| - | **TODO - slika ovdje** | + | {{blind_sql_1.png}} |
| Pokušajem unosa jednostrukih navodnika „ ' | Pokušajem unosa jednostrukih navodnika „ ' | ||
| - | ** TODO - slika ovdje ** | + | {{blind_sql_2.png}} |
| Uz zadatak je dostupan i dio izvornog koda. Analizom djela koda za resetiranje lozinke u datoteci reset.php, vidimo da SQL upit nije formatiran na siguran način, te da bi potencijalno bila moguća SQL injekcija. Također vidimo da se nakon dohvata SQL upita iz baze, ovisno o tome je li dohvaćena neka n-torka iz baze ili ne, vraća ili odgovor | Uz zadatak je dostupan i dio izvornog koda. Analizom djela koda za resetiranje lozinke u datoteci reset.php, vidimo da SQL upit nije formatiran na siguran način, te da bi potencijalno bila moguća SQL injekcija. Također vidimo da se nakon dohvata SQL upita iz baze, ovisno o tome je li dohvaćena neka n-torka iz baze ili ne, vraća ili odgovor | ||
| - | **TODO - slika ovdje** | + | {{blind_sql_3.png}} |
| Pokušajem jednostavnog SQL injectiona < | Pokušajem jednostavnog SQL injectiona < | ||
| - | **TODO - slika ovdje** | + | {{blind_sql_4.png}} |
| - | Možemo zaključit da smo ovime uspjeli izvršit SQL injection kojim smo dohvatili barem jednu ili više n-torki iz baze podataka, te da nam je sukladno tome ispisana poruka pozdrava. Ovo nas navodi na zaključak da se u reset formi može koristiti blind SQL injection, pri kojemu po prisutnosti poruke pozdrava ili nedostatku možemo znati postoji li unutar baze barem jedna n-torka koja odgovara SQL upitu koji smo manipulirali pomoću SQL injekcije, a ako se ne vrati nikakva poruka, SQL upit konstruiran injekcijom je netočan sintaksom, odnosno uzrokuje error. | + | Možemo zaključit da smo ovime uspjeli izvršit SQL injection kojim smo dohvatili barem jednu ili više n-torki iz baze podataka, te da nam je sukladno tome ispisana poruka pozdrava. Ovo nas navodi na zaključak da se u reset formi može koristiti blind SQL injection, pri kojemu po prisutnosti poruke pozdrava ili nedostatku možemo znati postoji li unutar baze barem jedna n-torka koja odgovara SQL upitu koji smo manipulirali |
| Analizom koda također možemo zaključiti da postoji tablica //users// s atributima // | Analizom koda također možemo zaključiti da postoji tablica //users// s atributima // | ||
| - | **TODO - slika ovdje** | + | {{blind_sql_5.png}} |
| - | Pomoću ovih informacija možemo osmislit formu SQL injekcije kojom ćemo saznati informacije koje nas zanimaju iz baze. Koristi ćemo SQL //LIKE// operator i „wildcard“ simbol //%//, koji znači da jest umjesto njega u stringu prisutan ili nijedan, ili jedan ili više bilo kakvih znakova. Pojednostavljeno, | + | Uz pomoć ovih informacija možemo osmislit formu SQL injekcije kojom ćemo saznati informacije koje nas zanimaju iz baze. Koristi ćemo SQL //LIKE// operator i „wildcard“ simbol //%//, koji znači da jest umjesto njega u stringu prisutan ili nijedan, ili jedan ili više bilo kakvih znakova. Pojednostavljeno, |
| Oblik naše SQL injekcije će biti sljedeći: | Oblik naše SQL injekcije će biti sljedeći: | ||
| Line 59: | Line 106: | ||
| Pokretanjem ovog unosa, dobivamo odgovor, što znači da smo konstruirali SQL injekciju koja ne izaziva grešku, nego se uspješno izvodi i da vraća barem jednu n-torku koja ima vrijednost usernamea „sara“ i ima atribut password. Uspješno izvršavanje ovog unosa prikazano je na slici ispod. | Pokretanjem ovog unosa, dobivamo odgovor, što znači da smo konstruirali SQL injekciju koja ne izaziva grešku, nego se uspješno izvodi i da vraća barem jednu n-torku koja ima vrijednost usernamea „sara“ i ima atribut password. Uspješno izvršavanje ovog unosa prikazano je na slici ispod. | ||
| - | **TODO - slika** | + | {{blind_sql_6.png}} |
| Sada je potrebno napisati skriptu koja će redoslijedom isprobavati sve kombinacije prvog znaka passworda, gdje će redom pokušavati izvršiti prethodnu SQL injekciju s vrijednošću < | Sada je potrebno napisati skriptu koja će redoslijedom isprobavati sve kombinacije prvog znaka passworda, gdje će redom pokušavati izvršiti prethodnu SQL injekciju s vrijednošću < | ||
| - | **TODO - slika** | + | {{blind_sql_7.png}} |
| Nakon toga skripta će na isti način pokušavati pronaći drugi znak passworda, probavajući redom vrijednost LIKE „da%“, LIKE „db%“, LIKE „dc%“, itd. sve dok ne dobije poruku pozdrava, kojom će znati drugi znak passworda, pa će isto pokušati za treći znak passworda, pa za četvrti, itd. | Nakon toga skripta će na isti način pokušavati pronaći drugi znak passworda, probavajući redom vrijednost LIKE „da%“, LIKE „db%“, LIKE „dc%“, itd. sve dok ne dobije poruku pozdrava, kojom će znati drugi znak passworda, pa će isto pokušati za treći znak passworda, pa za četvrti, itd. | ||
| - | Važno je uzeti u obzir koji se sve znakovi mogu koristiti unutar passworda, pošto je iz koda vidljivo da se koristi hash algoritam SHA256, to znači da password nije u obliku običnog teksta, nego je ta vrijednost zapravo hashirana vrijednost passworda pomoću algoritma SHA256. Znakovi koji mogu biti prisutni u hash vrijednosti algoritma SHA256 su heksadekadski zapisi brojeva od 0 do 15, odnosno mala slova „abcdef“ i znamenke od 0 do 9. Izlazna vrijednost SHA256 hash algoritma jest uvijek iste duljine, odnosno fiksna je i sastoji se od 256 bitova, odnosno 32 bajta, odnosno zapis će biti duljine 64 znaka, gdje svaki znat predstavlja pola bajta, odnosno 4 bita. | + | Važno je uzeti u obzir koji se sve znakovi mogu koristiti unutar passworda, pošto je iz koda vidljivo da se koristi hash algoritam SHA256, to znači da password nije u obliku običnog teksta, nego je ta vrijednost zapravo hashirana vrijednost passworda |
| Prethodni algoritam možemo ponavljati za svaki znak passworda, dok ne pronađemo 64 znakova ili dok se ne isprobaju svi mogući znakovi na tom mjestu znaka passworda i za ni jedan se ne vrati poruka pozdrava, onda znamo da smo pronašli cijeli password. | Prethodni algoritam možemo ponavljati za svaki znak passworda, dok ne pronađemo 64 znakova ili dok se ne isprobaju svi mogući znakovi na tom mjestu znaka passworda i za ni jedan se ne vrati poruka pozdrava, onda znamo da smo pronašli cijeli password. | ||
| Line 75: | Line 122: | ||
| import requests | import requests | ||
| import sys | import sys | ||
| - | #skripta za izvući username i hash iz baze pomoću blind sql injectiona | + | #skripta za izvući username i hash iz baze uz pomoć blind sql injectiona |
| URL_PREFIX = " | URL_PREFIX = " | ||
| Line 114: | Line 161: | ||
| Pokretanjem programa dobivamo hash vrijednost Sarine lozinke koja je < | Pokretanjem programa dobivamo hash vrijednost Sarine lozinke koja je < | ||
| - | Koristimo crackstation.net za dobivanje para vrijednosti koja hashiranjem algoritmom SHA256 daje dobiveni hash, te uspješno dobivamo vrijednost < | + | Koristimo crackstation.net za dobivanje para vrijednosti koja hashiranjem algoritmom SHA256 daje dobiveni hash, te uspješno dobivamo vrijednost < |
| - | **TODO: slika ovdje** | + | {{blind_sql_8.png}} |
| - | Sada se možemo uspješno | + | Sada se možemo uspješno |
blind_sqli.1701704291.txt.gz · Last modified: 2025/12/01 11:40 (external edit)