Upload
others
View
5
Download
0
Embed Size (px)
Citation preview
SVEUČILIŠTE U ZAGREBU
FAKULTET ELEKTROTEHNIKE I RAČUNARSTVA
Računalna forenzika
2018./2019.
Napad umetanjem SQL koda
Lucija Ulaga
Zagreb, siječanj, 2019.
Sadržaj
1. Uvod ..................................................................................................................... 3
2. Napad umetanjem SQL koda ............................................................................... 4
3. Vrste napada ........................................................................................................ 6
3.1 Mimoilaženje prijave ...................................................................................... 7
3.2 Sakupljanje informacija iz baze podataka ..................................................... 8
3.3 Sakupljanje informacija o bazi podataka ....................................................... 9
3.4 Neautorizirana izmjena podataka u bazi ..................................................... 10
3.5 Umetanje SQL koda u URL ......................................................................... 11
4. Zaštita od napada .............................................................................................. 12
5. Zaključak ............................................................................................................ 14
6. Literatura ............................................................................................................ 15
3
1. Uvod
S razvojem interneta javila se potreba za korištenjem naprednijih tehnologija pri
izradi web aplikacija i stranica. No, sa skoro svakim tehničkim napretkom, otkrivaju
se novi načini zlonamjernih korištenja. Tako je današnje web aplikacije teško
napraviti da budu potpuno sigurne i otporne na različite vrste napada. Bilo kakav
napad može ugroziti privatnost podataka korisnika i omogućiti njihovo zlonamjerno
korištenje, stoga je i korisnicima i pružateljima usluge u interesu sigurnost podataka.
Jedna od najstarijih, najčešćih i najopasnijih vrsti napada je napad umetanjem SQL
koda (engl. SQL Injection, SQL=Standard Query Language) kojem su podložne sve
web aplikacije koje u svom radu koriste bazu podataka. Njime se narušava
povjerljivost i integritet podataka. Napadači mogu lažirati identitet, izmjenjivati
postojeće podatke, uništiti podatke i dr. Ovaj rad opisat će napad umetanjem SQL
koda, dati primjere napada te opisati metode zaštite.
4
2. Napad umetanjem SQL koda
Napad umetanjem SQL koda je kompjuterski napad u kojem napadač umeće
zlonamjerni kod u SQL upit. SQL upit je zahtjev za nekom akcijom koja se izvodi nad
bazom podataka. Upit sadrži argumente na temelju kojih se iz baze vraćaju samo
određeni podaci. Ponekad se vrijednosti argumenata dobivaju od korisnika. To može
biti kroz polje za unos, URL (engl. Uniform Resource Locator) parametar, web kolačić
i dr. Tipičan primjer umetanja zlonamjernog koda je kroz web formu s poljima za unos
koja služe za autentifikaciju korisnika. Vrijednosti unesenog korisničkog imena i
lozinke koriste se za stvaranje dinamičkog SQL upita. Obzirom na ispravnost
podataka korisniku je odobren ili odbijen pristup. No, većina web formi nema
mehanizme koji zabranjuju unos koji nije korisničko ime ili lozinka. Zbog toga,
napadač može iskoristiti polja za unos podataka za slanje vlastitog zahtjeva u bazu.
Umetanje SQL koda moguće je jer pri razvoju web aplikacija programeri ponekad
nisu svjesni svih mogućih ranjivosti ili ne stavljaju dovoljnu pažnju na neke aspekte
sigurnosti. Napade je jednostavno izvesti, danas čak postoje i automatizirani alati za
ovu vrstu napada, stoga za neke napade umetanja SQL koda nije potrebno dubinsko
znanje o bazama podataka i SQL upitima. Isto tako, moguće je obraniti se od njih uz
manje izmjene u kodu, odnosno uz postavljanje dodatnih provjera nad unesenim
podacima prije stvaranja SQL upita.
Baze podataka sadrže povjerljive podatke o korisniku. Većinom je usvojena
dobra praksa hashiranja lozinki, no napadač može saznati neku drugu informaciju o
korisniku poput email adrese i koristiti je u drugim napadima. Sama lozinka i nije
toliko bitna jer je najčešća primjena napada upravo u svrhu prijave u web aplikaciju
bez poznavanja potrebne lozinke. Napadač se također može prijaviti kao
administrator čime dobiva dodatne mogućnosti upravljanja bazom i web aplikacijom.
Neke od posljedica uspješnog napada su neovlašteno čitanje i mijenjanje podataka
od strane napadača, ili čak uništavanje cijele baze.
5
Prije konkretnih primjera napada, kratak i sažet opis napada umetanjem SQL
koda je sljedeći. Prvi korak za pokretanje zlonamjernog koda na podatkovnom
serveru je pronalazak mjesta unosa podataka koje je uključeno u SQL upit. To može
biti primjerice mjesto prijave korisnika ili polje za pretragu web stranica. Za uspješan
napad, potrebno je da aplikacija direktno iz unesenih odnosno nepouzdanih
podataka stvara SQL upit. U tom slučaju napadač umeće zlonamjerni kod, stvara se
SQL upit i izvršava na podatkovnom serveru.
6
3. Vrste napada
Postoje tri osnovne vrste napada: umetanje koda u polje za unos podataka, kao
najpoznatiji oblik napada, zatim umetanje u URL adresu i slijepo umetanje (engl.
blind injection). U sljedećim poglavljima bit će detaljnije opisane prve dvije vrste
napada na jednostavnim primjerima. Slijepo umetanje je teža varijanta napada i
koristi se kada je napadaču onemogućen prikaz povratnih informacija umetanja SQL
koda.
Druga podjela napada je na umetanje prve razine i druge razine. Umetanje prve
razne je jednostavnije, izvodi se trenutno i ima izravan učinak na bazu podataka.
Napadač umeće kod koji se interpretira kao dio SQL naredbe umjesto običnih ulaznih
argumenata. Baza podataka izvršava tako stvoreni SQL upit.
Napadima umetanja prve razine moguće je:
• Mimoilaženje prijave u sustav
• Sakupljanje informacija iz baze podataka
• Sakupljanje informacija o bazi podataka
• Modifikacija informacija u bazi podataka – dodavanje, izmjena, brisanje
• Udaljeno izvođenje naredbi
• Napad uskraćivanja usluge, kraće DoS (engl. Denial of Service)
Pri umetanju druge razine ne dolazi odmah do napada. Napadač prvo doda kod u
bazu, a napad se izvršava pri dohvatu unesenog koda iz baze. Aplikacija točno
enkodira SQL naredbu i sprema je kao ispravnu. Kasnije, kroz drugi dio aplikacije koji
nije zaštićen od napada umetanja SQL koda, pokreće se izvršavanje spremljene SQL
naredbe. Ovakav napad zahtijeva bolje poznavanje načina na koji se unesene
vrijednosti kasnije koriste. Također, teže ga je detektirati.
7
3.1 Mimoilaženje prijave
Napadom se zaobilazi uobičajen postupak prijave koji od registriranog korisnika
zahtijeva unos korisničkog imena i lozinke. Postoji mogućnost da je napadač
prethodno nekim drugim napadom došao do podataka iz baze o postojećem
korisniku u sustavu i lažno se prijavio. No, idući primjer demonstrira prvi navedeni
slučaj.
Primjer:
Baza podataka sadrži tablicu Users s atributima username i password. Kroz web
formu od korisnika se traži prijava u sustav. Unesene vrijednosti spremaju se u
varijable uname i pass pomoću kojih se gradi SQL upit:
1| # Define POST variables 2| uname = request.POST['username'] 3| pass = request.POST['password'] 4| 5| # SQL query 6| query = "SELECT username FROM Users 7| WHERE username = ' " uname + " ' 8| AND password = ' " + pass + " ' " 9| 10| # Execute SQL statement 11| Database.execute(query)
Za korisnika s korisničkim imenom Pero i lozinkom lozinka bit će generiran sljedeći
SQL upit i pretražiti će se tablica Users za navedenim korisnikom:
1| SELECT username FROM Users WHERE username = 'Pero' 2| AND password = 'lozinka'
8
Ako nema provjere unesenih vrijednosti za varijable uname i pass, napadač unosi
sljedeći kod: ' OR '1'='1. Tada se generira upit:
1| SELECT username FROM Users WHERE username = '' OR '1'='1' 2| AND password = '' OR '1'='1'
Ovaj upit je uvijek istinit jer 1=1 je istina. Ili (OR) s istinom je također istina. I (AND)
dvije istine je istina. Stoga, cijeli WHERE dio upita je istinit. Upit vraća prvi redak
tablice Users i napadač se uspješno prijavljuje u sustav.
Uspjeh napada iz gornjeg primjera ovisi o sintaksi upita, konkretno navodnicima
i zagradama. Iz tog razloga potrebno je prvo saznati informacije o bazi podataka ili ići
metodom pokušaja i promašaja.
3.2 Sakupljanje informacija iz baze podataka
Ovim napadom napadač dobiva podatke o korisnicima web aplikacije. U
napadu se koristi UNION naredba koja spaja svije SELECT naredbe, onu koju
aplikacija sama stvara i dodanu napadačevu naredbu.
Primjer:
Osim tablice Users iz prethodnog primjera, za demonstraciju ovog napada potrebna
je još jedna tablica, recimo Accounts. Na mjestu gdje je napadač prethodno upisao '
OR '1'='1, sada upisuje sljedeću naredbu:
1| ' UNION SELECT * FROM Accounts 2| WHERE accountNumber = 122040 --
9
Rezultirajući SQL upit:
1| SELECT username FROM Users WHERE username = '' 2| UNION SELECT * FROM Accounts 3| WHERE accountNumber = 122040 4| --' AND password = ''
Prva SELECT naredba traži korisnika bez korisničkog imena, odnosno ''. Ako on ne
postoji neće ništa vratiti. Tada se izvršava druga SELECT naredba. Ona ne
pretražuje predviđenu Users tablicu, već Accounts tablicu koju je napadač zadao. Uz
pretpostavku da napadač zna broj računa korisnika, na ovaj način saznaje razne
informacije o računu poput broja kartice i stanja na računu. Zadnja linija upita (4) je
zakomentirani AND uvjet koji se stoga ne provjerava.
3.3 Sakupljanje informacija o bazi podataka
Napadač dobiva podatke o samoj bazi podataka kao što su nazivi relacijskih
tablica i njima pripadajućih atributa. To radi na način da promatra poruke pogrešaka.
Inače, poruke pogrešaka korisne su programerima pri implementaciji aplikacije i
testiranju. Namjernim izazivanjem sintaktičkih grešaka mogu se doznati ranjivi
parametri. Logičke greške daju informacije o tablicama i njihovim atributima.
Pogrešan tip podataka izaziva grešku iz koje se doznaje očekivani tip i ime atributa.
10
3.4 Neautorizirana izmjena podataka u bazi
Napadačev umetnuti kod omogućuje mijenjanje i dodavanje zapisa u bazu
podataka. Za ovaj napad potrebne su naredbe INSERT i UPDATE, znanje o imenu
tablice koju napadač želi modificirati te znanje o atributima i njihovim tipovima.
Razdvajanje dvije naredbe radi se znakom ;.
Primjer:
Tablica Users iz prethodnih primjera sadrži atribute username, password te dodatni
adminRights koji određuje ima li korisnik administratorska prava ili ne (1 ili 0).
Kod koji napadač umeće:
1| '; INSERT INTO Users VALUES ('attacker', '1234', '1') --
SQL upit koji se stvara:
1| SELECT username FROM Users WHERE username = ''; 2| INSERT INTO Users VALUES ('attacker', '1234', '1') 3| --' AND password = ''
Ova naredba dodaje novog korisnika u tablicu Users. Novostvoreni korisnik ima
administratorska prava. Na isti način koristi se naredba UPDATE.
11
3.5 Umetanje SQL koda u URL
Svi ranije opisani tipovi spadaju u kategoriju umetanja SQL koda u polja za
unos podataka, no mogu se izvršiti i modifikacijom URL-a, odnosno umetanjem u
URL adresu.
Primjer:
Web aplikacija sadrži stranicu s URL-om, gdje parametar id=3 označava treću objavu
na stranici: http://myapp/index.html?id=3
Kako bi se iz baze dohvatila određena objava, koristi se SQL upit nad Posts tablicom:
1| query = "SELECT * FROM Posts WHERE id = '" + id + " ' "
Napadač stvara zlonamjerni kod:
1| 5; DROP TABLE Posts
URL adresa je sljedeća:
http://myapp/index.html?id=5;%20DROP%20TABLE%20Posts
Konačni SQL upit koji se šalje u bazu:
1| SELECT * FROM Posts WHERE id = 5; 2| DROP TABLE Posts
Prva SELECT naredba vraća peti post iz tablice Posts. Druga opasna naredba
uništava cijelu Posts tablicu.
12
4. Zaštita od napada
Postoji nekoliko komponenata u koje je potrebno unijeti određenu zaštitu.
Napadač, ako je uporan i vješt, može i tada izvesti napad umetanja SQL. Unatoč
tome, ako su u web aplikaciju i bazu podataka uvedene određene mjere zaštite,
napadač će najčešće odustati zbog velikog broja drugih lakih meta, aplikacija koje
nisu dobro zaštićene.
Smjernice za obranu od napada:
• Provođenje statičkog i dinamičkog testiranja za pronalazak ranjivosti na
umetanje SQL koda.
• Dobro strukturiranje baze podataka. Korištenje netipičnih imena tablica i
atributa. Ograničavanje pristupa bazi tako da obični korisnici smiju raditi samo
SELECT, a ne smiju INSERT, DELETE i pogotovo DROP TABLE.
• Ograničavanje broja znakova na poljima za unos, definiranje tipa podataka
kojeg polje očekuje.
• Provjera podataka. Najvažniji aspekt, ne dopustiti ulazak nepouzdanih
podataka u rad aplikacije. Provjera na poslužiteljskoj strani i prilagođena tipu
podataka koji se očekuje. Provjera broja znakova te provjera navodnika.
Navodnici se većinom ne koriste pri unosu podataka u normalnom radu,
pronalazak navodnika je dobra indikacija napada. Provjera znaka točka-zarez
(;). Također nije dio unosa korisnika, ukazuje na prisutnost koda. Provjera
dvostrukih crtica (--) koje se koriste za komentiranje dijela SQL naredbe.
Provjera ključnih SQL riječi poput SELECT, UNION, INSERT, DROP TABLE.
Korisnik može koristiti neke od tih riječi stoga s ovom provjerom treba biti
oprezan. Provjera postojanja procedura.
13
• Korištenje parametriziranih upita i spremljenih procedura. Parametrizirani upiti
definiraju parametre (pod nazivom placeholders, bind values) umjesto
direktnog unošenja ulaznih vrijednosti u SQL upite pa ih baza uvijek tretira kao
podatke, a ne dijelove SQL naredbi. Kod za proceduru je definiran i spremljen
u bazi podataka, a poziva se iz aplikacije.
• Postavljanje minimalnih privilegija aplikacija na bazu. Svaka aplikacija ima
vlastita prava pristupa koja su minimum potreban za ostvarivanje
funkcionalnosti aplikacije.
• Ograničavanje informacija u porukama pogreške.
Nakon implementacije navedenih metoda zaštite, dobro je ispitati ranjivost web
aplikacije na napade umetanjem SQL koda korištenjem programa razvijenih upravo u
tu svrhu.
Neki od programa za provjeru ranjivosti na napade umetanjem SQL koda su:
• BSQL Hacker
• SQLmap
• SQLninja
• Safe3 SQL Injector
• SQLSus
• Mole
14
5. Zaključak
Napad umetanjem SQL koda već godinama glasi kao jedan od najčešćih napada
kojem su podložne sve web aplikacije koje u svom radu koriste bazu podataka.
Napadači na više načina mogu doći do privatnih i povjerljivih podataka korisnika.
Mogu ih koristiti u razne zlonamjerne svrhe, mogu koruptirati bazu podataka svojim
izmjenama ili je u potpunosti uništiti. Zaštita od ovih napada povlači za sobom i
zaštitu od još većih napada koji mogu biti posljedica uspješnog umetanja SQL koda.
Postoji puno primjera umetanja SQL koda dostupnih svima. Vrlo je jednostavno
izvesti napad bez stručnog znanja ili velikog iskustva napadača. Zato se određena
razina sigurnosti postiže jednostavnim metodama zaštite koje zahtijevaju manje
dodatke u kodu web aplikacije. Najbitnije su provjere ulaznih podataka koje korisnik
unosi: provjere znakova poput navodnika, točke-zarez, ključnih riječi SQL upita i
dužine podataka. Uvođenjem ovih provjera, napad je dovoljno otežan da većina
napadača odustane. Međutim, za bolju sigurnost, potrebno je uvesti veće promjene
na poslužitelju i samoj bazi podataka, konstantno pratiti sigurnost sustava i
nadograđivati ga kako bio otporan na razne varijante napada umetanjem SQL koda.
15
6. Literatura
[1] SQL Injection, Microsoft:
https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2008-r2/ms161953(v=sql.105) , siječanj 2019
[2] SQL Injection, OWASP (The Open Web Application Security project):
https://www.owasp.org/index.php/SQL_Injection , siječanj 2019
[3] SQL Injection Prevention Cheat Sheet:
https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet , siječanj 2019
[4] SQL Injections (SQLi):
https://www.acunetix.com/websitesecurity/sql-injection/ , siječanj 2019
[5] SQL Injection Cheat Sheet & Tutorial: Vulnerabilities & How to Prevent SQL Injection Attacks:
https://www.veracode.com/security/sql-injection , siječanj 2019
[6] Best Free and Open Source SQL Injection Tools:
https://resources.infosecinstitute.com/best-free-and-open-source-sql-injection-tools/ , siječanj 2019
[7] Napadi umetanjem SQL koda: https://www.cis.hr/files/dokumenti/CIS-DOC-2011-
09-025.pdf, siječanj 2019