15
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.

Napad umetanjem SQL koda - nevena.lss.hrnevena.lss.hr/recordings/fer/predmeti/racfor/2018/... · Napadač umeće kod koji se interpretira kao dio SQL naredbe umjesto običnih ulaznih

  • Upload
    others

  • View
    5

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Napad umetanjem SQL koda - nevena.lss.hrnevena.lss.hr/recordings/fer/predmeti/racfor/2018/... · Napadač umeće kod koji se interpretira kao dio SQL naredbe umjesto običnih ulaznih

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.

Page 2: Napad umetanjem SQL koda - nevena.lss.hrnevena.lss.hr/recordings/fer/predmeti/racfor/2018/... · Napadač umeće kod koji se interpretira kao dio SQL naredbe umjesto običnih ulaznih

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

Page 3: Napad umetanjem SQL koda - nevena.lss.hrnevena.lss.hr/recordings/fer/predmeti/racfor/2018/... · Napadač umeće kod koji se interpretira kao dio SQL naredbe umjesto običnih ulaznih

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.

Page 4: Napad umetanjem SQL koda - nevena.lss.hrnevena.lss.hr/recordings/fer/predmeti/racfor/2018/... · Napadač umeće kod koji se interpretira kao dio SQL naredbe umjesto običnih ulaznih

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.

Page 5: Napad umetanjem SQL koda - nevena.lss.hrnevena.lss.hr/recordings/fer/predmeti/racfor/2018/... · Napadač umeće kod koji se interpretira kao dio SQL naredbe umjesto običnih ulaznih

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.

Page 6: Napad umetanjem SQL koda - nevena.lss.hrnevena.lss.hr/recordings/fer/predmeti/racfor/2018/... · Napadač umeće kod koji se interpretira kao dio SQL naredbe umjesto običnih ulaznih

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.

Page 7: Napad umetanjem SQL koda - nevena.lss.hrnevena.lss.hr/recordings/fer/predmeti/racfor/2018/... · Napadač umeće kod koji se interpretira kao dio SQL naredbe umjesto običnih ulaznih

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'

Page 8: Napad umetanjem SQL koda - nevena.lss.hrnevena.lss.hr/recordings/fer/predmeti/racfor/2018/... · Napadač umeće kod koji se interpretira kao dio SQL naredbe umjesto običnih ulaznih

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 --

Page 9: Napad umetanjem SQL koda - nevena.lss.hrnevena.lss.hr/recordings/fer/predmeti/racfor/2018/... · Napadač umeće kod koji se interpretira kao dio SQL naredbe umjesto običnih ulaznih

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.

Page 10: Napad umetanjem SQL koda - nevena.lss.hrnevena.lss.hr/recordings/fer/predmeti/racfor/2018/... · Napadač umeće kod koji se interpretira kao dio SQL naredbe umjesto običnih ulaznih

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.

Page 11: Napad umetanjem SQL koda - nevena.lss.hrnevena.lss.hr/recordings/fer/predmeti/racfor/2018/... · Napadač umeće kod koji se interpretira kao dio SQL naredbe umjesto običnih ulaznih

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.

Page 12: Napad umetanjem SQL koda - nevena.lss.hrnevena.lss.hr/recordings/fer/predmeti/racfor/2018/... · Napadač umeće kod koji se interpretira kao dio SQL naredbe umjesto običnih ulaznih

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.

Page 13: Napad umetanjem SQL koda - nevena.lss.hrnevena.lss.hr/recordings/fer/predmeti/racfor/2018/... · Napadač umeće kod koji se interpretira kao dio SQL naredbe umjesto običnih ulaznih

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

Page 14: Napad umetanjem SQL koda - nevena.lss.hrnevena.lss.hr/recordings/fer/predmeti/racfor/2018/... · Napadač umeće kod koji se interpretira kao dio SQL naredbe umjesto običnih ulaznih

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.

Page 15: Napad umetanjem SQL koda - nevena.lss.hrnevena.lss.hr/recordings/fer/predmeti/racfor/2018/... · Napadač umeće kod koji se interpretira kao dio SQL naredbe umjesto običnih ulaznih

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