User Tools

Site Tools


blind_sqli

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
blind_sqli [2023/12/04 15:44] lssblind_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 injekcijemogu se prvo pokušati unijeti jednostruki ili dvostruki navodnici i ako je web poslužitelj podešen da prosljeđuje pogreške korisnikukorisniku se može proslijediti i prikazati poruku greška kojiu je baza poslalagdje na primjer piše da je neispravno korištenje znakova navodnika. U nekim situacijama sustav je podešen tako da se poruke pogreške iz baze podataka nikad ne prosljeđuju krajnjem korisniku, no sam SQL upit koji se generira s korisničkim unosom nije dobro formatiran i zaštićen. U takvim slučajevima mogu se koristiti takozvane slijepe SQL injekcije.+**Blind SQL injection** je podskup **SQL injection ranjivosti**gdje napadač može izvršiti SQL injekcijuali ne može direktno dobiti vraćeni odgovor od baze.  Umjesto toga, jedina informacija koju napadač može dobiti o izvršavanju upita može biti, primjerice, je li baza vratila prazan odgovor, je li se dogodila greška ili koliko je vremena bazi podataka trebalo da generira odgovor.
  
-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. +Napadač potom koristi tu informaciju kako bi konstruirao SQL upite oblika:
-Informacija koje se mogu ovim načinom iskorištavanja saznati su, na primjer:+
  
-postoji li korisnik "admin"sustavu?+<file> 
 +ako je uvjet X zadovoljen, napravi A, ako nije zadovoljen, napravi B. 
 +</file> 
 + 
 +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: 
 + 
 +<file> 
 +Ako je točno da postoji tablica "users", 
 +podijeli broj s nulom kako bi izazvao grešku. 
 +</file> 
 + 
 +2. Kada se može razlikovati jedino je li baza vratila prazan odgovor ili ne: 
 + 
 +<file> 
 +Ako je točno da postoji korisnik "admin"tablici "users", 
 +vrati tog korisnika. 
 +</file> 
 + 
 +3. Kada se ne zna odgovor baze, ali se može znati koliko vremena je bazi podataka trebalo za odgovor: 
 + 
 +<file> 
 +Ako password korisnika "admin" počinje sa slovom "a", 
 +spavaj 5 sekundi (ili, na primjer, izvrši zahtjevno računanje kojem treba više vremena za izvođenje) 
 +</file> 
 + 
 +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, i sam SQL upit konstruiran SQL injekcijom mora biti u kondicionalnom obliku, gdje se definira uvjet koji može biti ili zadovoljen ili ne, te se, ovisno o tome je li uvjet zadovoljen, izaziva stanje sustava koje je moguće razaznati. 
 + 
 +Primjer koji prikazuje kako bi se ovakvim upitima eksfiltrirala lozinka korisnika admin: 
 + 
 +<file> 
 +- počinje li lozinka korisnika "admin" sa slovom "a"- NE 
 + 
 +- počinje li lozinka korisnika "admin" sa slovom "b"? - NE 
 + 
 +- počinje li lozinka korisnika "admin" sa slovom "c"? - DA 
 + 
 +- počinje li lozinka korisnika "admin" sa slovima "ca"? - NE 
 + 
 +- počinje li lozinka korisnika "admin" sa slovima "cb"? - NE 
 + 
 +- počinje li lozinka korisnika "admin" sa slovima "cc"? - DA 
 + 
 +- počinje li lozinka korisnika "admin" sa slovima "cca"? - NE 
 +...  
 +</file>
  
-- počinje li lozinka korisnika admin sa slovom "a"?+Iz ovog primjera je jasno da je za eksfiltraciju informacija često potreban znatno veći broj upita nego pri uobičajenim SQL injekcijama. Zato se pri ovakvim napadima kreiraju skripte ili koriste gotovi alati kao **sqlmap** koji automatizirano generiraju velik broj zahtjeva i detektiraju je li uvjet u SQL injekciji bio zadovoljen ili nije te na kraju prikazuju eksfiltrirane informacije.
  
-- počinje li lozinka korisnika admin sa slovom "b"? 
-- 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..., i dalje često možemo postaviti velik broj ovakvih pitanja sustavu i na svako ovo pitanje, pažljivim praćenjem promjena na stranici, možemo zaključiti koji su odgovori na postavljena pitanja. Često je onda idući korak napraviti skriptu ili koristiti već gotov alat, koji će umjesto automatski generirati i postaviti velik broj pitanja koja nas zanimaju i na kraju nam pokazati zabilježene odgovore. 
  
 __**Primjeri**__ - **Zadatak s Hacknite platforme** - ** Banka ** __**Primjeri**__ - **Zadatak s Hacknite platforme** - ** Banka **
Line 45: Line 92:
 {{blind_sql_4.png}} {{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ć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 uz pomoć SQL injekcije, a ako se ne vrati nikakva poruka, SQL upit konstruiran injekcijom je netočan sintaksom, odnosno uzrokuje error.
  
 Analizom koda također možemo zaključiti da postoji tablica //users// s atributima //username// i //password//. Dio koda iz kojeg je to jasno vidljivo je prikazan na slici ispod. Analizom koda također možemo zaključiti da postoji tablica //users// s atributima //username// i //password//. Dio koda iz kojeg je to jasno vidljivo je prikazan na slici ispod.
Line 51: Line 98:
 {{blind_sql_5.png}} {{blind_sql_5.png}}
  
-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, ako pitamo je li password kao (//LIKE//) //%// , ne pitamo efektivno ništa više nego postoji li vrijednost password, koja ima ili nijedan ili jedan ili više znakova, što nam samo po sebi nije korisno, no ako pitamo je li password kao (LIKE) „abc%“, pitamo počinje li password znakovima abc nakon kojih ima ili nijedan ili više znakova. Ovom funkcionalnošću ćemo probati saznati znak po znak passworda. Prvo ćemo konstruirati samo oblik SQL injekcije koju ćemo koristiti, koja ne uzrokuje grešku, a onda ćemo ju naknadno pomoćskripte mijenjati i ponavljati veliki broj puta.+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, ako pitamo je li password kao (//LIKE//) //%// , ne pitamo efektivno ništa više nego postoji li vrijednost password, koja ima ili nijedan ili jedan ili više znakova, što nam samo po sebi nije korisno, no ako pitamo je li password kao (LIKE) „abc%“, pitamo počinje li password znakovima abc nakon kojih ima ili nijedan ili više znakova. Ovom funkcionalnošću ćemo probati saznati znak po znak passworda. Prvo ćemo konstruirati samo oblik SQL injekcije koju ćemo koristiti, koja ne uzrokuje grešku, a onda ćemo ju naknadno uz pomoć skripte mijenjati i ponavljati veliki broj puta.
  
 Oblik naše SQL injekcije će biti sljedeći: Oblik naše SQL injekcije će biti sljedeći:
Line 67: Line 114:
 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ć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 uz pomoć 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.
  
 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ćblind sql injectiona+#skripta za izvući username i hash iz baze uz pomoć blind sql injectiona
  
 URL_PREFIX = "http://chal.platforma.hacknite.hr:12009/reset.php?username=" URL_PREFIX = "http://chal.platforma.hacknite.hr:12009/reset.php?username="
Line 114: Line 161:
 Pokretanjem programa dobivamo hash vrijednost Sarine lozinke koja je <code>d4120d4f638a4bdd0f397e975b71b117583f4fdb35c60aeb5416fa922651a465</code> Pokretanjem programa dobivamo hash vrijednost Sarine lozinke koja je <code>d4120d4f638a4bdd0f397e975b71b117583f4fdb35c60aeb5416fa922651a465</code>
  
-Koristimo crackstation.net za dobivanje para vrijednosti koja hashiranjem algoritmom SHA256 daje dobiveni hash, te uspješno dobivamo vrijednost <code>monitor123</code>što je lozinka korisnika Sara. Dobivanje reversa hasha od lozinke s pomoću crackstationa prikazano na slici ispod.+Koristimo crackstation.net za dobivanje para vrijednosti koja hashiranjem algoritmom SHA256 daje dobiveni hash, te uspješno dobivamo vrijednost <code>monitor123</code> što je lozinka korisnika Sara. Dobivanje originalne vrijednosti hasha lozinke s pomoću crackstationa prikazano je na slici ispod.
  
 {{blind_sql_8.png}} {{blind_sql_8.png}}
  
  
-Sada se možemo uspješno ulogirati na formu admin portala s pomoću korisničkog imena //sara// i lozinke //monitor123//, ali nas nakon toga traži drugi faktor 2fa autentifikacije. +Sada se možemo uspješno prijaviti na formu admin portala s pomoću korisničkog imena //sara// i lozinke //monitor123//, ali nas nakon toga traži drugi faktor 2fa autentifikacije. 
  
  
blind_sqli.1701704642.txt.gz · Last modified: 2025/12/01 11:40 (external edit)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki