SQL INJECTION NAPAD: ŠTO JE TO?

Napad podmetanjem SQL upita (eng. SQL injection) je metoda koja iskorištava sigurnosne ranjivosti kod pristupa web aplikacije bazi podataka. To je najrašireniji i najopasniji napad koji se odvija na aplikacijskom sloju TCP/IP stoga. Spomenute ranjivosti napadač iskorištava preoblikovanjem SQL upita koje web aplikacija šalje bazi podataka tako da otkriju osjetljive podatke ili izvedu nedozvoljene radnje nad njima. Pomoću umetnutih SQL naredbi napadač može preuzeti potpunu kontrolu nad povjerljivim podacima u bazi.

SQL injection napad javlja se kao posljedica neodgovarajuće provjere podataka koje korisnici unose kroz sučelje web aplikacije. Na temelju tih podataka konstruiraju se SQL upiti koji se izravno šalju bazi podataka. Upravo u tim linijama koda zlonamjerni korisnici dodavanjem odgovarajućih znakova mogu preoblikovati SQL upite i upravljati s podacima koji se nalaze u bazi podataka.

SQL INJECTION: DETALJNO OBJAŠNJENJE

Web aplikacije omogućuju korisnicima unos podataka te pristupe povjerljivim podacima iz baze pomoću svog web preglednika. Baze podataka su središnji dijelovi modernih web stranica. One sadrže podatke koji su potrebni da bi web stranica mogla isporučiti točno tražene sadržaje posjetiocima te prikazati potrebne informacije kupcima, dobavljačima, zaposlenicima i ostalim interesnim skupinama.

Povjerljivi podaci o korisnicima te poduzeću nalaze se trajno pohranjeni u bazi podataka kojoj mogu pristupiti svi legitimni korisnici putem Vaših web aplikacija. Web aplikacije i baza podataka olakšavaju Vam vođenje poduzeća.

Današnje web aplikacije omogućuju unos, obradu, pohranu i prijenos povjerljivih korisničkih podataka (npr. osobni podaci, brojevi kreditnih kartica i dr.) te pristup sadržajima kao što su webmail, stranice za prijavu (eng. login), forme za podršku korisnicima, pretraživači i potrošačke košarice. Svi ovi dinamički sadržaji oblikuju moderne web stranice i pružaju tvrtkama sredstva za komunikaciju s klijentima. Web aplikacije mogu biti nabavne (npr. razni CMS sustavi) ili posebno izrađene prema dogovoru (eng. custom).

Široka primjena i vrste podataka koji se njima prenose su učinili web aplikacije najčešćim metama zlonamjernih korisnika.

SQL INJECTION: JEDNOSTAVAN PRIMJER

Za pristup povjerljivim osobnim podacima na web stranici se od korisnika traži unos korisničkog imena i zaporke.

Na temelju podataka, koje unose korisnici web aplikacija, konstruiraju se SQL upiti koje sustav za upravljanje bazama podataka izvršava. Nakon uspješne provjere, korisniku je omogućen pristup sadržaju web aplikacije. Drugim riječima, web aplikacija zadužena za prijavu korisnika komunicira s bazom podataka pomoću niza unaprijed poznatih naredbi kako bi provjerila uneseno korisničko ime i zaporku. Uspješnom provjerom korisniku se osigurava odgovarajuća razina pristupa.

SQL injection napadom zlonamjerni korisnik može, ubacivanjem posebno oblikovanog SQL koda u polja za unos, mijenjati SQL upite koje web aplikacija šalje bazi podataka. Tim postupkom napadač zaobilazi mehanizam prijave na sustav čime mu je omogućeno preuzimanje kontrole nad podacima u bazi. Ranjivost se javlja kada SQL upite koji se konstruiraju na temelju neprovjerenih ulaznih podatka šaljemo bazi. Posljedica napada je pristup napadača povjerljivim podacima iz baze.

Web tehnologije ranjive na SQL injection napad uključuju ASP, ASP.NET, PHP, JSP i CGI. Za SQL injection napad zlonamjernom korisniku je potrebno široko znanje o SQL upitima, zatim sposobnost pogađanja imena atributa i tablica iz baze podataka te web preglednik. Popularnost ovog tipa napada proizlazi iz njegove jednostavnosti.

KAKO JE MOGUĆE PROSLIJEDITI SQL UPITE IZRAVNO DO BAZE PODATAKA KOJA JE SKRIVENA IZ VATROZIDA I MNOGIH DRUGIH SIGURNOSNIH MEHANIZAMA?

Vatrozid i ostali sigurnosni mehanizmi osiguravaju jako malu ili gotovo nikakvu obranu od mogućih SQL injection napada.

Web stranice moraju biti javno dostupne da bi korisnici mogli komunicirati s Vašom web aplikacijom (najčešće priključnicama 80 i/ili 443). Web aplikacija ima otvoren pristup vašoj bazi podataka kako bi iz baze vratila tražene informacije.

Zlonamjerni korisnici preoblikovanjem SQL upita koje web aplikacija šalje bazi podataka dolaze do povjerljivih informacija.

SQL (eng. Structured Query Language) je specijalizirani programski jezik koji omogućuje pohranu, upravljanje i dohvaćanje podataka spremljenih u relacijskim bazama podataka (skup tablica u kojima su organizirani podaci). To je najrašireniji jezik za rukovanje relacijskim bazama podataka koji koristi većina današnjih web aplikacija. Primjeri relacijskih baza podataka kojima se upravlja putem SQL-a su Oracle, Microsoft Access, MS SQL Server, MySQL i Filemaker Pro.

Sljedeća SQL naredba je primjer upita koji web aplikacija šalje bazi:

SELECT count(*)
FROM users_list_table
WHERE username=’FIELD_USERNAME’
AND password=’FIELD_PASSWORD”

Ovom SQL naredbom web aplikacija zahtijeva od baze podataka da usporedi uneseno korisničko ime i lozinku s podacima koji su spremljeni u bazi podataka.

Svaki tip web aplikacije konstruira posebne SQL upite preko kojih komunicira s bazom podataka. Svaka web aplikacija predviđena je za izvršavanje točno određenih funkcija. Ako se polja u koja se upisuju ulazni podaci ne provjeravaju na odgovarajući način, zlonamjerni korisnik može dodavanjem SQL naredbi proširiti opseg funkcija koje izvodi web aplikacija. Time web aplikacija počinje izvoditi funkcije koje su izvan njezinog planiranog dizajna.

Tada će zlonamjerni korisnik imati slobodan put za komunikaciju s bazom podataka bez obzira na sve sustave za detekciju upada i sigurnosnu opremu postavljene prije same baze podataka.

JE LI MOJA BAZA PODATAKA IZLOŽENA RIZIKU SQL INJECTION NAPADA?

SQL injection napad je jedna od najčešće korištenih metoda napada na web aplikacije. Iako se od njega relativno lako zaštiti, veliki broj web aplikacija i dalje je ranjiv.

Prema izvješću organizacije WASC (eng. Web Application Security Consortium) SQL injection napadi čine 9% svih napada zlonamjernih korisnika prijavljenih do srpnja 2006. godine. Naše vlastito istraživanje pokazalo je da je 50% skeniranih web stranica ranjivo na SQL injection napade.

Teško je odgovoriti na pitanje je li vaša web stranica ili aplikacija ranjiva na SQL injection napade pogotovo ako niste programer ili ju niste sami izradili.

Na temelju našeg prijašnjeg iskustva možemo zaključiti da postoji značajna šansa da su Vaši podaci izloženi riziku SQL injection napada.

Hoće li zlonamjerni korisnik moći vidjeti podatke koji se nalaze u bazi podataka ili ne, ovisi o tome kako je izrađena vaša stranica za prikazivanje rezultata koji se dohvaćaju SQL upitima. Sigurno je da će zlonamjerni korisnik moći, u slučaju ranjive web aplikacije, dohvatiti povjerljive informacije.

Ako je Vaša web stranica nepravilno izrađena tada postoji šansa da povjerljivi podaci Vaših klijenata i samog poduzeća budu kompromitirani.

Razina pristupa koju zlonamjerni napadač stječe SQL injection napadom ovisi o razini prava koju web aplikaciji dodjeljuje baza podataka. Web aplikacija se može ograničiti na točno određene naredbe kojima komunicira s bazom. Primjerice, Web aplikaciji može biti omogućeno samo čitanje podataka iz baze.

Čak i ako napadač nije u stanju mijenjati sustav, on će i dalje biti u mogućnosti čitati povjerljive informacije.

UČINAK SQL INJECTION NAPADA

Kada potencijalni napadač shvati da je sustav ranjiv na SQL injection napad, on je u mogućnosti preoblikovati SQL upite pomoću naredbi koje unosi u polja za unos podataka. To je ekvivalentno predaji baze podataka napadaču i omogućavanju da izvodi bilo koju SQL naredbu uključujući i naredbu kojom se brišu podaci iz baze (naredba DROP TABLE).

Budući da zlonamjerni napadač može proizvoljno preoblikovati SQL upit na ranjivom sustavu to može ugroziti bazu podataka i/ili otkriti povjerljive podatke. Ovisno o bazi podataka, ranjivost sustava na SQL injection napade može napadaču omogućiti različite razine pristupa podacima ili sustavu. Postojećim SQL upitima moguće je upravljati putem naredbe UNION, zatim umetanjem SELECT naredbi ili dodatnih upita.

U nekim slučajevima moguće je čitati ili pisati u datoteke te izvoditi naredbe nad postojećim operacijskim sustavom. Određeni SQL poslužitelji kao što su Microsoft SQL Server posjeduju pohranjene i proširene procedure za interakciju s operacijskim sustavom. Ako zlonamjerni korisnik dobije pristup tim procedurama, to može uzrokovati katastrofu za poslužitelj na kojem se nalazi baza.

Nažalost, utjecaj SQL injection napada moguće je otkriti tek kada je otkrivena i krađa. Podaci se stalno kradu putem različitih napada zlonamjernih korisnika bez znanja korisnika. Nažalost, iskusnije napadače jako je teško uloviti.

PRIMJER SQL INJECTION NAPADA

Slijedi jednostavan primjer HTML forme s dva ulazna polja, korisničkim imenom i lozinkom.

<form method="post" action="http://testasp.acunetix.com/login.asp">
<input name="tfUName" type="text" id="tfUName">
<input name="tfUPass" type="password" id="tfUPass">
</form>

Najjednostavniji način prijave korisnika je konstruiranjem SQL upita koji izgleda ovako:

SELECT id
FROM logins
WHERE username = '$username'
AND password = '$password’

Podaci koje unosi korisnik se spremaju u varijable $username i $password. Ako se SQL upiti konstruiraju izravno na temelju te dvije varijable, moguće ih je jednostavno kompromitirati. Pretpostavimo da je korisnik upisao ime 'Joe' kao korisničko ime te da je za lozinku unesen znakovni niz: anything' OR 'x'='x'

SELECT id
FROM logins
WHERE username = 'Joe'
AND password = 'anything' OR 'x'='x'

Ako podaci koje unosi korisnik nisu temeljito provjereni, zlonamjerni korisnik može vrlo lako obaviti uspješnu prijavu.

Iz prethodno navedenog koda vidljivo je da će se umjesto uspoređivanja korisnički unesenih podataka s podacima u korisničkoj tablici (eng. Users), uspoređivati 'x'='x'. Rezultat ove SQL naredbe uvijek će biti istinit što će omogućiti napadaču da se uspješno prijavi u sustav.

KAKO SE ZAŠTITITI OD SQL INJECTION NAPADA

Vatrozid i ostali sigurnosni mehanizmi osiguravaju jako malu ili gotovo nikakvu obranu od mogućih SQL injection napada. Web stranice moraju biti javno dostupne da bi korisnici mogli komunicirati s Vašom web aplikacijom. Nije li to ono za što su one i dizajnirane?

Stalna nadogradnja poslužitelja, baze podataka, programskih jezika i operacijskih sustava je najbolji način zaštite od SQL injection napada.