Odobrenje na razini slomljenog objekta s primjerima

U ovom postu istražujemo i raspravljamo o neuspjehu autorizacije na razini slomljenog objekta.

Za početak ćemo objasniti što znači slomljena autorizacija na razini objekta. Zatim ćemo proći kroz napad objašnjavajući povezane čimbenike rizika.

Zatim ćemo razmotriti neke od mogućih utjecaja ranjivosti prije nego što konačno pogledamo uobičajene obrambene mjere.

Što je odobrenje za slomljeni objekt

Ukratko, ova vrsta napada znači da se autorizacija primijenjena na podatke ne radi kako bi trebala. To dovodi do toga da se odobri pristup resursima i podacima kada to ne bi trebao biti.

Neovlaštena autorizacija na razini objekta u prošlosti je bila poznata kao Insecure Direct Object Reference (IDOR).

Kad izgovorimo riječ objekt u Odobrenju za razbijeni objekt, ono što mislimo je vrijednost ili skupina vrijednosti. Predmet može biti objava na društvenim mrežama koja sadrži autora, sadržaj i datum objave.



Ovlaštenje je sve o onome što korisnik smije pristupiti. Stoga govorimo o korisniku koji je već prijavljen.

Kad korisnik uputi zahtjev API-ju, zahtjev se koristi za pristup objektima. To je točka u kojoj treba donijeti odluku o autorizaciji. Korisnik bi trebao moći pristupiti samo objektima kojima je odobren pristup. Ovo autorizacija radi ispravno.

Kad se autorizacija pokvari, korisnici mogu pristupiti podacima i resursima koji im ne bi trebali biti dopušteni.

API olakšava razne operacije na objektima. Objekte možemo dobiti, stvoriti, ažurirati ili čak izbrisati.

Interakcija s objektom cijela je poanta API-ja, stoga, ako su autorizacijske kontrole oko tih objekata slomljene, imamo ranjivost Pristup slomljenoj razini objekta.

Iskorištavanje ranjivosti pristupa slomljenog objekta

Općenito je lako iskoristiti ovu ranjivost nakon što je pronađena. Sve što napadač treba učiniti je promijeniti identifikator u zahtjevu i potencijalno su dobili pristup objektima kojima ne bi smjeli dopustiti.

Pogledajmo na primjeru.

Ovdje imamo URL koji se koristi za pozivanje API-ja:

https://myemail.com/messages/12345

Ovaj API poziv koristi se za dohvaćanje korisnikovih privatnih poruka. Resurs koji se koristi je poruke .

Poruka je objekt na koji se pozivamo u autorizaciji razbijenog objekta. Pretpostavlja se da privatne poruke može pročitati samo primatelj.

Dalje, imamo id poruke 12345. Ovo je važan dio za napadača.

ID govori službi koji će zapis vratiti. API dohvaća taj zapis iz spremišta podataka i vraća ga u odgovoru.

Što se sada događa ako promijenimo id iz 12345 do 12346? npr.

https://myemail.com/messages/12346

Ako je poruka s id 12346 bio namijenjen našem korisniku, trebali bismo ga moći dohvatiti.

Ali ako je poruka pripadala drugom korisniku, API je nikada ne bi trebao vratiti. Ako smo uspjeli dohvatiti poruku, imamo neuspjelu autorizaciju predmeta slomljene razine.

Drugi je primjer slanje POST zahtjeva za ažuriranje resursa. Možemo se poigrati s id-om u korisničkom opterećenju JSON-a:

{
'userId': '12345678',
'oldPassword': 'My_0ld_Pa$$',
'newPassword': '$uperS3CurE' }

Kad bismo stavili bilo kakav potencijal userId u zahtjevu i mogli smo ažurirati detalje drugog korisnika, tada imamo ogroman problem.

Tehnički utjecaj

Jednom kada znamo da ranjivost postoji, možemo je iskoristiti na sve načine. Kao što je već spomenuto, na API-u možemo koristiti razne HTTP metode. Id možemo koristiti za ažuriranje ili čak brisanje poruka!

Što se događa ako uspijemo ponoviti sve ID-ove? Možda ćemo moći izbrisati svaku pohranjenu poruku. To je veliki utjecaj.

Uobičajena ranjivost

Ovo je vrlo česta ranjivost. Kao što je već spomenuto, API-ji se koriste za pristup objektima i u većini slučajeva koristimo ID-ove u zahtjevu za identifikaciju resursa. Pitanje je postoje li provjere autorizacije za taj pristup?

Postoje uglavnom dva razloga zbog kojih na kraju imamo ranjivosti autorizacije na razini slomljenog objekta.

Prvo je da sigurnosna kontrola jednostavno nije implementirana. Kôd nije napisan za provjeru autorizacije zahtjeva.

Drugi razlog je ljudska pogreška. Ljudi griješe. Dobar primjer je API koji obrađuje i osjetljive na neosjetljive podatke. Neki zahtjevi trebaju imati provjere autorizacije, a drugi ne. Tako bi moglo biti lako propustiti provjeru prilikom pisanja koda.

Kako otkriti

Automatizirani alati obično ne bi pronašli ovu vrstu ranjivosti jer joj treba barem malo mozga.

Čovjeku je relativno lako otkriti ovu ranjivost. Sve što trebamo učiniti je pronaći Identifikator koji se koristi za dohvaćanje objekata.

Imajte na umu da identifikator može biti u URL-u, u tijelu zahtjeva ili u zaglavlju.

Također moramo analizirati i protumačiti odgovor koji se vraća da bismo vidjeli postoji li ranjivost ili ne.

Alati

Možemo koristiti bilo koji alat koji pregledava HTTP zahtjeve i odgovore. Neki od njih su:

  • Googleovi alati za programere
  • Suite podrigivanja
  • Poštar

Burp Suite također se može koristiti za automatizaciju nekih zahtjeva.

Obrana od ovlaštenja na razini slomljenog objekta

Ovdje imamo dvije obrane.

Prva obrana je korištenje nepredvidivi ID-ovi poput GUID-ova . Kada u kodu koristimo uzastopne brojeve, na pr. 12345, to znači da su id-ovi vrlo predvidljivi. Napadaču ne treba puno truda da bi prošao kroz brojeve kako bi pronašao predmete.

Primjer GUID-a:

d3b773e6-3b44-4f5f-9813-c39844719fc4

GUID-ovi su složeni i vrlo ih je teško pogoditi i nisu sekvencijalni.

Sljedeća je obrana zapravo imati neki kod za provjeriti autorizaciju . Ova se provjera često jednostavno ne dogodi.

Provjera autorizacije trebala bi se dogoditi svaki put kada korisnik predstavi API unutar ID-a koji će se koristiti. Osnovno načelo ovdje je da nikada ne bismo trebali vjerovati podacima koje korisnik daje API-ju.

Zatraženi Id treba provjeriti kako bi se potvrdilo da je korisnik ovlašten pristupiti objektu.

Te provjere mogu biti samo jednostavne provjere koda tijekom razvoja softvera i / ili automatizirane provjere koje provjeravaju kvarove autorizacije tijekom razvoja.

Zaključak

Kao što smo vidjeli, odobrenje za razbijeni objekt je česta ranjivost i lako ga je uočiti i napasti. Potencijalni utjecaji su ogromni.

Pravi izvor ove ranjivosti su podaci povjerenja koje klijent prosljeđuje API-ju.

Veliki dio obrane je osigurati da ne vjerujemo tim podacima. Stoga moramo biti sigurni da postoje provjere autorizacije.