blind_sqli
Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| blind_sqli [2023/12/04 15:18] – created lss | blind_sqli [2026/06/18 14:47] (current) – mbunic | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====Blind SQL injection==== | ====Blind SQL injection==== | ||
| - | Pri općenitom testiranju | + | **Blind SQL injection** je podskup **SQL injection |
| + | |||
| + | Napadač potom koristi tu informaciju kako bi konstruirao SQL upite oblika: | ||
| + | |||
| + | < | ||
| + | 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 | ||
| + | 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 korisnik " | ||
| + | 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 " | ||
| + | ... | ||
| + | </ | ||
| + | |||
| + | 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. | ||
| + | |||
| + | |||
| + | |||
| + | __**Primjeri**__ - **Zadatak s Hacknite platforme** - ** Banka ** | ||
| + | |||
| + | < | ||
| + | Sara je razvojna programerka za banku. Napravila je aplikaciju za e-banking, budući | ||
| + | |||
| + | Hint: objavljen je izvorni kod | ||
| + | |||
| + | Napomena: Nije potrebno bruteforceati drugi faktor. | ||
| + | |||
| + | http:// | ||
| + | |||
| + | Flag je u formatu CTF2023[brojevi]. | ||
| + | </ | ||
| + | |||
| + | Pri prvom pregledu stranice, vidimo | ||
| + | |||
| + | {{blind_sql_1.png}} | ||
| + | |||
| + | Pokušajem unosa jednostrukih navodnika „ ' | ||
| + | |||
| + | {{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 | ||
| + | |||
| + | {{blind_sql_3.png}} | ||
| + | |||
| + | Pokušajem jednostavnog SQL injectiona < | ||
| + | |||
| + | {{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 | ||
| + | |||
| + | Analizom koda također možemo zaključiti da postoji tablica //users// s atributima // | ||
| + | |||
| + | {{blind_sql_5.png}} | ||
| + | |||
| + | 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 // | ||
| + | |||
| + | Oblik naše SQL injekcije će biti sljedeći: | ||
| + | |||
| + | < | ||
| + | |||
| + | 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. | ||
| + | |||
| + | {{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 | ||
| + | |||
| + | {{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. | ||
| + | |||
| + | 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 | ||
| + | |||
| + | Prethodni algoritam možemo ponavljati | ||
| + | |||
| + | Primjer jednog Python programa kojim ostvarujemo prethodno definirani algoritam se može vidjeti u nastavku: | ||
| + | < | ||
| + | import requests | ||
| + | import sys | ||
| + | #skripta za izvući username i hash iz baze uz pomoć blind sql injectiona | ||
| + | |||
| + | URL_PREFIX = " | ||
| + | |||
| + | payload= " | ||
| + | |||
| + | charset_hash=" | ||
| + | |||
| + | password_hash="" | ||
| + | |||
| + | ponoviPetlju=True | ||
| + | |||
| + | while ponoviPetlju: | ||
| + | |||
| + | ponoviPetlju=False | ||
| + | |||
| + | for char in charset_hash: | ||
| + | |||
| + | URL = URL_PREFIX+payload+char+" | ||
| + | |||
| + | response = requests.get(URL).text | ||
| + | |||
| + | #Ako se rijec poslovnica nalazi u odgovoru, | ||
| + | # znaci da smo dobili poruku pozdrava | ||
| + | if " | ||
| + | |||
| + | password_hash+=char | ||
| + | payload+=char | ||
| + | |||
| + | ponoviPetlju=True | ||
| + | break | ||
| + | |||
| + | |||
| + | print(password_hash) | ||
| + | |||
| + | </ | ||
| + | |||
| + | 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 prijaviti 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. | ||
| + | |||
| + | |||
| + | |||
| + | |||
| - | 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. | ||
| - | Informacija koje se mogu ovim načinom iskorištavanja saznati su, na primjer: | ||
| - | - postoji li korisnik " | ||
| - | - počinje li lozinka korisnika admin sa slovom " | ||
| - | - 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..., | ||
blind_sqli.1701703118.txt.gz · Last modified: 2025/12/01 11:40 (external edit)