This is an old revision of the document!
Business logic vulnerabilities
Business logic vulnerabilities su tip ranjivosti koji se pojavljuju zbog propusta u dizajnu sustava i izostanku odgovarajućih sigurnosnih mjera i provjera. Ove ranjivosti se rijetko mogu pronaći automatiziranim alatima za skeniranje i analizu koda, jer ovise o kontekstu same aplikacije. Napadač može manipulirati postojećim funkcionalnostima sustava na nepredviđen način kako bi izvršio neželjene radnje.
Jednostavan primjer ove skupine ranjivosti je kupnja negativne količine nekog proizvoda u web trgovini. Na primjer, umjesto kupnje dvije majice, u košaricu se za broj majica unese minus dva za količinu, čime cijena kupnje postaje negativna, a novac se prenosi s računa web aplikacije na račun kupca, umjesto obrnuto.
Ako postoji provjera da ukupna cijena ne može biti negativna, ali ne postoji provjera da broj proizvoda ne može biti negativan, tada se može kupiti dvoje hlača i „minus dvije“ majice. Ako ova transakcija nije ispravno provjerena i sustav je odobri, dobivaju se naručene hlače, ali ne po punoj cijeni, nego po cijeni umanjenoj za cijenu dvije majice.
Ovaj primjer ukazuje na potrebu provjere korisničkih ulaznih parametara i stanja sustava kako se sustav ne bi mogao iskoristiti na nepredviđen način. Sigurnosni alati za skeniranje i analizu ne mogu znati kontekst aplikacije, pa stoga ne mogu detektirati da je negativna vrijednost količine proizvoda ili broja artikala za narudžbu zapravo ranjivost. Što je sustav kompleksniji i sastoji se od više povezanih komponenti, to je veća mogućnost pojave ovog tipa ranjivosti.
Također, za iskorištavanje ovakvih ranjivosti često nisu potrebni nikakvi alati niti složene tehnike napada, nego se napadi mogu jednostavno izvršiti kroz sama sučelja aplikacije.
PRIMJER - Zadatak s Hacknite platforme – Voće, povrće i flagovi
Možete li kupiti flag? http://chal.platforma.hacknite.hr:13007
Vidi se da je zadatak web trgovina i da je cilj kupiti „Flag“ koji je ponuđen kao artikl u web trgovini. Također, dostupan je izvorni kod zadatka. Pri daljnjem pregledu stranice, vidi se da je ponuđen odabir za količinu artikala u rasponu od 1 do 5. Prikazano na slici 1.
Dodavanjem jabuka u košaricu i pokušajem kupnje, pojavljuje se pogreška „Nedovoljno sredstava na računu„ prikazana na slici 2.
Pregledom HTML koda za ovaj segment stranice, korištenjem ugrađenih alata za razvoj u web pregledniku (F12) ili drugim načinom, vidi se da je vrijednost koja se odabire definirana kao „quantity“, a ponuđene vijednosti u dropdown izborniku su samo od 1 do 5. Prikazano na slici 3.
Korištenjem ugrađenih alata za razvoj u web pregledniku, može se promijeniti jedna od ponuđenih vrijednosti u padajućem izborniku u -10. Prikazano na slici 4.
Slanjem ovog zahtjeva i pregledom košarice, može se vidjeti da je ovaj zahtjev obrađen bez izazivanja greške i da je sad ukupna cijena proizvoda u košarici negativna. Prikazano na slici 5.
Pokušajem kupnje negativne količine proizvoda, pojavljuje se greška na stranici koja naznačuje da nije moguće izvršiti kupnju pri kojoj je ukupna cijena manja od 0 €. Prikazano na slici 6.
U gornjem lijevom kutu se vidi da je stanje na računu 0 €. Uzevši u obzir da ukupna cijena svih proizvoda ne smije biti manje od nule i da vjerojatno mora biti manja ili jednaka stanju na računu, može se deducirati da se vjerojatno može izvršiti kupnja, ukoliko je ukupna cijena svih proizvoda u košarici jednaka nuli. Kako bi se uspješno kupio flag, treba se odabrati jedan ili više flag artikala i odgovarajuća kombinacija negativnih količina ostalih proizvoda, kako bi ukupna cijena bila nula. Ovaj problem ima više od jednog rješenja, te se može jednostavno riješiti uz malo matematike, isprobavanjem par linearnih jednadžbi, ili isprobavajući različite kombinacije približavajući se rješenju dok se ne uspije složiti odgovarajuća kombinacija. Jedna od kombinacija koja ima ukupnu cijenu nula i sadrži flag je sljedeće:
Flag - (1*trešnje + 9*šljive + 1* banane + 40* jabuke + 5* bonsai)
Prikazano na slici 7.
Izvršavanjem ove kupovine dobiva se rješenje zadatka, prikazano na slici 8.
Prevencija business logic ranjivosti
Business logic ranjivosti uvelike ovise o kontekstu aplikacije, stoga je potrebno dobro razumijevanje logike sustava, njegovih funkcionalnosti i namjena pri razvoju i implementaciji, osobito kada više ljudi zajedno radi na sustavu. Kada jedna osoba radi na komponenti sustava koja je povezana s drugom komponentom koju razvijaju drugi programeri, mora dobro razumjeti obje komponente i njihovu namjenu te predviđene funkcionalnosti. Zato je važno tijekom razvoja sustava imati dobro dokumentirane namjene i funkcionalnosti pojedinih komponenti.
Dakle, tijekom razvoja, osim posvećivanja pažnje sigurnosti koda, treba voditi računa i o mogućim zlonamjernim korisnicima koji će pokušati koristiti sustav na nepredviđene načine. Treba primijeniti validaciju korisničkog unosa te provjere stanja sustava i njegovih vrijednosti uz precizno definirana ograničenja, kako ne bi bilo moguće koristiti sustav izvan predviđenih granica.
Na primjer, ako je očekivani korisnički unos cijeli broj u rasponu od 1 do 9, treba osigurati da su samo te vrijednosti dopuštene, dok se ostali unosi odbacuju uz odgovarajuću grešku.
Ako je očekivani korisnički nešto složenije, kao unos e-mail adrese, mogu se koristiti gotove implementacije koje provjeravaju je li uneseni e-mail validan i da ne sadrži nedopuštene znakove ili kombinacije znakova.
Važno je imati na umu da ove provjere nije dovoljno implementirati samo na klijentskoj strani, npr. korištenjem client-side JavaScript koda, jer se zahtjevi mogu jednostavno modificirati prije slanja i zaobići provjere na klijentskoj strani. Potrebne su provjere korisničkog unosa na serverskoj strani, prilikom unosa podataka, kao i u dubljim dijelovima procesa obrade i korištenja podataka.
Izvori:
https://portswigger.net/web-security/logic-flaws
https://owasp.org/www-community/vulnerabilities/Business_logic_vulnerability
https://platforma.hacknite.hr/







