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:34] – lss | blind_sqli [2025/12/01 11:40] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| 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 | + | 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 |
| Glavna razlika između slijepih i „običnih“ SQL injekcija, jest da u slijepim SQL injekcijama nema konkretnih podataka koji se dohvaćaju SQL injekcijom iz sustava i vraćaju napadaču, nego napadač na domišljate i kreativne načine nađe način da napravi SQL injekciju i od baze podataka, često indirektno, sazna je li SQL upit konstruiran SQL injekcijom točan ili netočan. | Glavna razlika između slijepih i „običnih“ SQL injekcija, jest da u slijepim SQL injekcijama nema konkretnih podataka koji se dohvaćaju SQL injekcijom iz sustava i vraćaju napadaču, nego napadač na domišljate i kreativne načine nađe način da napravi SQL injekciju i od baze podataka, često indirektno, sazna je li SQL upit konstruiran SQL injekcijom točan ili netočan. | ||
| Line 31: | Line 31: | ||
| 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 59: | ||
| 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 75: | ||
| 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 111: | Line 111: | ||
| </ | </ | ||
| + | |||
| + | 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 < | ||
| + | |||
| + | {{blind_sql_8.png}} | ||
| + | |||
| + | |||
| + | Sada se možemo uspješno ulogirati na formu admin portala s pomoću korisničkog imena //sara// i lozinke // | ||
| + | |||
| + | |||
| + | Analizom koda vidimo da se sjednica uspostavlja odmah nakon uspješne prijave, a ne tek nakon uspješnog prolaska drugog faktora autentifikacije. | ||
| + | |||
| + | To znači da možemo ručno promijeniti URL, tako da promijenimo // | ||
| + | |||
| + | Nakon toga možemo samo na izborniku odabrati admin portal, gdje se nalazi flag koji je rješenje zadatka. | ||
blind_sqli.1701704062.txt.gz · Last modified: 2025/12/01 11:40 (external edit)