Jeste li ikada čuli za napade u kojima napadači uspijevaju izvući osjetljive podatke iz baze podataka, a da ih zapravo nikada ne vide? Zvuči nevjerojatno, zar ne? Upravo to se događa kod tzv. blind SQL napada. Zamislite hakera koji ispituje sustav “naslijepo”, bez da dobiva izravne odgovore iz baze podataka, ali ipak uspijeva pristupiti vrijednim informacijama. Ako ste ikada razmišljali o tome koliko su vaše omiljene web stranice sigurne, ovaj napad vas možda može natjerati da dvaput promislite.
U nastavku ćemo objasniti kako ovi napadi funkcioniraju, koji su njihovi tipovi i kako prepoznati znakove da je vaša web aplikacija možda ranjiva na ovakav oblik napada.
Što je blind SQL napad?
Blind SQL injection (blind SQL injekcija) je vrsta SQL napada gdje napadač ne dobiva izravne povratne informacije od baze podataka. U klasičnim SQL napadima, aplikacija može vratiti konkretne podatke ili grešku koja pomaže napadaču da modificira svoj napad. Međutim, kod blind SQL napada to nije slučaj. Napadač ne dobiva jasan odgovor, ali ipak uspijeva izvući važne informacije koristeći pametne upite i tehniku eliminacije.
Zašto se zove “blind”?
Naziv blind (slijepi) dolazi od činjenice da napadač ne vidi izravne odgovore od baze podataka. Umjesto toga, on mora osloniti svoj napad na logiku “da/ne” ili na vremenske odazive aplikacije. Iako su informacije koje napadač dobiva minimalne, on ih može dovoljno puta upotrijebiti kako bi izgradio cjelokupnu sliku podataka koji se nalaze u bazi.
Tipovi blind SQL napada
Postoje dva glavna tipa blind SQL napada: Boolean-based blind SQL injection i Time-based blind SQL injection. Svaki tip napada koristi različite tehnike kako bi izvučao podatke iz baze.
1. Boolean-based blind SQL injection
U ovom tipu napada, napadač šalje SQL upite koji rezultiraju odgovorima u obliku “točno” ili “netočno” (Boolean vrijednosti). Umjesto vraćanja konkretnih podataka, web aplikacija će ponašanjem (npr. prikazivanjem ili skrivanjem dijela sadržaja) pokazati je li upit bio ispravan ili nije.
Primjer: Napadač može koristiti upit koji provjerava postoji li određeni korisnički račun u bazi. Ako aplikacija prikazuje određene stranice ili poruke ovisno o ispravnosti upita, napadač može postupno dobiti informacije, unatoč tome što ne vidi izravne podatke iz baze.
sqlKopiraj kodSELECT * FROM korisnici WHERE korisnicko_ime = 'user' AND '1' = '1'; -- Ispravno
SELECT * FROM korisnici WHERE korisnicko_ime = 'user' AND '1' = '2'; -- Neispravno
Ovdje aplikacija može odgovoriti s različitim ponašanjem, npr. prikazati poruku o uspješnom prijavljivanju ili neuspjelom pokušaju. Tako napadač može polako prikupljati podatke.
2. Time-based blind SQL injection
Ova tehnika koristi vremensko odgađanje kao odgovor od servera. Napadač šalje upit koji uključuje SQL naredbe koje prisiljavaju bazu podataka da “čeka” određeni broj sekundi prije nego odgovori. Ako aplikacija odgovara s kašnjenjem, napadač zna da je upit bio točan.
Primjer: Napadač može poslati upit koji traži da baza pričeka 5 sekundi ako je određena logička tvrdnja točna.
sqlKopiraj kodSELECT IF(1=1, SLEEP(5), 0); -- Kašnjenje ako je tvrdnja točna
SELECT IF(1=2, SLEEP(5), 0); -- Bez kašnjenja ako je tvrdnja netočna
Ako server odgovara s kašnjenjem, napadač zna da je tvrdnja točna. Koristeći ovaj pristup, napadač može ispitati bazu podataka i polako prikupljati informacije.
Karakteristike blind SQL napada
Blind SQL napadi su mnogo suptilniji od klasičnih SQL napada jer ne uzrokuju očite greške ili povratne informacije iz baze. Zbog toga ih je teže otkriti, no oni su i dalje jednako opasni. Neke karakteristike ovih napada uključuju:
- Nepostojanje izravnih povratnih informacija: Aplikacija ne vraća izravne greške ili podatke iz baze, što otežava detektiranje napada.
- Korištenje logičkih upita (da/ne): Napadači koriste niz logičkih tvrdnji kako bi postupno prikupili informacije.
- Upotreba vremenskih kašnjenja: U time-based napadima, napadači koriste odgođene odgovore servera kako bi otkrili je li upit bio ispravan.
Primjer blind SQL napada
Zamislimo scenarij u kojem napadač želi provjeriti postoji li određeni korisnik u bazi podataka web aplikacije. Umjesto da dobije izravni odgovor s korisničkim podacima, napadač koristi Boolean-based blind SQL injection kako bi dobio “da/ne” odgovore.
Napadač šalje upit:
sqlKopiraj kodSELECT * FROM korisnici WHERE korisnicko_ime = 'admin' AND LENGTH(lozinka) = 5;
Ako aplikacija odgovara drugačijim ponašanjem (npr. prikazuje dio stranice ili ne), napadač zna da lozinka ima 5 znakova. Nastavljajući ovakve upite, napadač može postupno rekonstruirati cijelu lozinku.
Zaključak
Blind SQL napadi su sofisticirani napadi koji, iako ne daju izravne odgovore iz baze podataka, omogućuju napadačima da prikupljaju informacije polako, ali sigurno. Korištenjem logičkih ili vremenskih metoda, napadači mogu izvući osjetljive podatke bez da izazivaju očite sigurnosne greške. Zbog svoje suptilnosti, ovakvi napadi su posebno opasni i zahtijevaju pažljive sigurnosne mjere kako bi se spriječili.