| Next revision | Previous revision |
| business_logic [2025/02/08 10:09] – created kresimir | business_logic [2025/12/01 11:40] (current) – external edit 127.0.0.1 |
|---|
| Business logic vulnerabilites | ====Business logic vulnerabilites==== |
| |
| Business logic vulnerabilites su tip ranjivosti koji se pojavljuju pri propustima u dizajnu sustava i izostanku odgovarajućih sigurnosnih provjera i kontrola. Ove ranjivosti se rijetko mogu pronaći automatiziranim načinom, sigurnosnim alatima za skeniranje i analizu koda, jer ovise o kontekstu same aplikacije. Napadač može manipulirati postojećim funkcionalnostima sustava na nepredviđeni način, kako bi izvršio neželjene akcije. | Business logic vulnerabilites 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 načinom, sigurnosnim alatima za skeniranje i analizu koda, jer ovise o kontekstu same aplikacije. Napadač može manipulirati postojećim funkcionalnostima sustava na nepredviđeni način, kako bi izvršio neželjene akcije. |
| Najjednostavniji primjeri ove skupine ranjivosti su: mogućnom kupnje negativne količine nekog proizvoda u web trgovini, npr. umjesto kupnje dviju majici, u košaricu se za broj majci stavi minus dva za količinu, čime cijena kupovine bude negativna i novci se prebace kupcu s računa web aplikacije umjesto slanja novaca s računa kupca na račun web aplikacije. Ako postoji provjera da ukupna cijena ne može biti negativna, ali ne postoji provjera da ne može biti negativan broj proizvoda, tad se može kupiti „minus dvije“ majice i dvoje hlača. Ako ova transakcija nije provjerena i sustav ju odobri, tada se dobiju naručenih dvoje hlača, ali ne po punoj cijeni, nego po cijeni umanjenoj za cijenu dvoje majici. | |
| Ova demonstracija ukazuje na potrebu implementiranja validacija i provjera 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, kako bi detektirali da je negativna vrijednost količine proizvoda ili broja artikla za narudžbu zapravo ranjivost. Što je sustav kompleksniji i sastoji se od više povezanih komponenti, veća je mogućnost pojavljivanja ovog tipa ranjivosti. | Najjednostavniji primjeri ove skupine ranjivosti su: kupnja negativne količine nekog proizvoda u web trgovini, npr. umjesto kupnje dvije majice, u košaricu se za broj majica stavi minus dva za količinu, čime cijena kupovine bude negativna i novci se prebace kupcu s računa web aplikacije umjesto slanja novaca s računa kupca na račun web aplikacije. |
| | Ako postoji provjera da ukupna cijena ne može biti negativna, ali ne postoji provjera da ne može biti negativan broj proizvoda, tad se može kupiti dvoje hlača i „minus dvije“ majice. Ako ova transakcija nije provjerena i sustav ju odobri, tada se dobiju naručenih dvoje hlača, ali ne po punoj cijeni, nego po cijeni umanjenoj za cijenu dvije majice. |
| | Ovaj primjer ukazuje na potrebu provjere i parametara koje unose korisnici 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 onda ni 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, veća je mogućnost pojavljivanja ovog tipa ranjivosti. |
| Također za iskorištavanje ovakvih ranjivosti, često nisu potrebni nikakvi alati niti složene tehnike napada, nego se mogu jednostavno izvršiti kroz sama sučelja aplikacije. | Također za iskorištavanje ovakvih ranjivosti, često nisu potrebni nikakvi alati niti složene tehnike napada, nego se mogu jednostavno izvršiti kroz sama sučelja aplikacije. |
| |
| PRIMJER -Zadatak s Hacknite platforme – Voće, povrće i flagovi | ===PRIMJER - Zadatak s Hacknite platforme – Voće, povrće i flagovi=== |
| |
| ¸¸ | <file> |
| Možete li kupiti flag? | Možete li kupiti flag? |
| http://chal.platforma.hacknite.hr:13007 | http://chal.platforma.hacknite.hr:13007 |
| ¸¸ | </file> |
| |
| 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 artikla u rasponu od 1 do 5. Prikazano na slici 1. | 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. |
| |
| {{logicalhighlevel:slika1.png}} | {{logicalhighlevel:slika1.png}} |
| |
| Dodavanjem jabuka u košaricu i pokušajem kupnje, pojavljuje se pogreška „ Nedovoljno sredstava na računu „ prikazana na slici 2. | Dodavanjem jabuka u košaricu i pokušajem kupnje, pojavljuje se pogreška „Nedovoljno sredstava na računu„ prikazana na slici 2. |
| |
| {{logicalhighlevel:slika2.png}} | {{logicalhighlevel:slika2.png}} |
| |
| 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đeni dropdown izbornik su samo vrijednosti od jedan do 5. Prikazano na slici 3. | 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. |
| |
| {{logicalhighlevel:slika3.png}} | {{logicalhighlevel:slika3.png}} |
| {{logicalhighlevel:slika4.png}} | {{logicalhighlevel:slika4.png}} |
| |
| Slanjem ovog zahtjeva i pregledom košarice, može se vidjeti da jest ovaj zahtjev obrađen bez izazivanja greške i da je sad ukupna cijena proizvoda u košarici negativna. Prikazano na slici 5. | 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. |
| |
| {{logicalhighlevel:slika5.png}} | {{logicalhighlevel:slika5.png}} |
| {{logicalhighlevel:slika6.png}} | {{logicalhighlevel:slika6.png}} |
| |
| 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 artikl i odgovarajuća kombinacija negativnih količina ostalih proizvoda, kako bi ukupna cijena bila nula. | 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žit odgovarajuća kombinacija. | 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. |
| Jedno od kombinacija koja ima ukupnu cijenu nula i sadrži flag je sljedeće: | Jedna od kombinacija koja ima ukupnu cijenu nula i sadrži flag je sljedeće: |
| ¸¸ | <code> |
| Flag - (1*trešnje + 9*šljive + 1* banane + 40* jabuke + 5* bonsai) | Flag - (1*trešnje + 9*šljive + 1* banane + 40* jabuke + 5* bonsai) |
| ¸¸ | </code> |
| Prikazano na slici 7. | Prikazano na slici 7. |
| |
| {{logicalhighlevel:slika8.png}} | {{logicalhighlevel:slika8.png}} |
| |
| Prevencija business logic ranjivosti | ===Prevencija business logic ranjivosti=== |
| |
| Business logic ranjivosti uvelike ovise o samom kontekstu aplikacije, zato je potrebno dobro razumijevanje logike sustava, njegovih funkcionalnosti i namjena pri razvoju i implementaciji sustava, pogotovo kada više ljudi zajedno rade na razvoju. Kada jedna osoba radi na jednoj 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 i imati dobru dokumentaciju uz razvijanje sustava, u kojoj su opisane namijene i funkcionalnosti pojedinih komponenti. | Business logic ranjivosti uvelike ovise o samom kontekstu aplikacije, zato je potrebno dobro razumijevanje logike sustava, njegovih funkcionalnosti i namjena pri razvoju i implementaciji sustava, pogotovo kada više ljudi zajedno rade na razvoju. Kada jedna osoba radi na jednoj 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. |
| Osim posvećivanja pažnje sigurnosti koda pri razvoju i svjesnosti o mogućim zlonamjernim akterima koji će pokušati koristiti sustav na nepredviđene načine, važno je implementirati validacije korisničkog unosa i provjere stanja sustava i njegovih vrijednosti, sa što strožim ograničenjima, kako ne bi bilo moguće koristiti sustav izvan predviđenih granica. Na primjer ako je očekivani korisnički unos e-mail, mogu se koristiti već gotove implementacije koje provjeravaju da je uneseni e-mail validan i da ne sadržava nikakve znakove niti određene redoslijede dopuštenih znakova koji se ne mogu koristiti u e-mail adresi. Ako je očekivani korisnički unos cijeli broj u rasponu od jedan do devet, popratna validacija bi provjerava da je korisnički unos cijeli jednoznamenkasti broj u rasponu od jedan do devet, dok ostali unosi izbacuju pogrešku. Ove provjere nije dovoljno implementirati samo na korisničkoj strani, npr. korištenjem client-side JavaScript koda, jer se zahtjevi mogu jednostavno modificirati prije slanja, a provjere na korisničkoj strani zaobići. Potrebne su provjere korisničkog unosa na serverskoj strani, na samom korisničkom unosu, a poželjno i na dubljim i daljim dijelovima procesa obrade i posluživanja podataka. | Dakle, tijekom razvoja, osim posvećivanja pažnje sigurnosti koda, treba voditi računa i o mogućim zlonamjernicima koji će pokušati koristiti sustav na nepredviđene načine. Treba primijeniti validacije korisničkog unosa i provjere stanja sustava i njegovih vrijednosti, sa što strožim ograničenjima, kako ne bi bilo moguće koristiti sustav izvan predviđenih granica. Na primjer ako je očekivani korisnički unos e-mail adresa, mogu se koristiti već gotove implementacije koje provjeravaju da je uneseni e-mail validan i da ne sadržava nikakve znakove niti određene redoslijede dopuštenih znakova koji se ne mogu koristiti u e-mail adresi. Ako je očekivani korisnički unos cijeli broj u rasponu od jedan do devet, treba provjeriti da je korisnički unos cijeli jednoznamenkasti broj u rasponu od jedan do devet, a za ostale javiti pogrešku. Važno je voditi računa da ove provjere nije dovoljno implementirati samo na korisničkoj strani, npr. korištenjem client-side JavaScript koda, jer se zahtjevi mogu jednostavno modificirati prije slanja, a provjere na korisničkoj strani zaobići. Potrebne su provjere korisničkog unosa na serverskoj strani, prilikom samog korisničkog unosa, a poželjno i na dubljim i daljim dijelovima procesa obrade i posluživanja podataka. |
| |
| Izvori:\\ | Izvori:\\ |