S obzirom da ima malo toga napisano na srpskom o bezbednostnim propustima na srpskom jeziku, mislim da je pravo mesto ovde da napišem o tome koju reč. Pokušaću da opišem najčešće bezbednostne propuste koji se javljaju u web aplikacijama i koji se uglavnom oslanjaju na 2 liste – OWASP top 10 i CWE25.
Injekcije (Injection) – Ova kategorija propusta se odnosi na ubacivanje napadačevog, malicijoznog koda u kod web aplikacije. Najčešće se pominje SQL injection kada se govori o ovoj klasi napada. Međutim postoje i mnogi drugi tipova injekcijonih napada poput code injection, sa podvrstama PHP injection, javascript injection. Cross site scripting je takođe vrsta injection napada, jer se ubacuje maliciozni HTML kod u kod sajta. Moguće je injectovati i komande operativnog sistema, što je jedan od najtežih oblika injekcija, jer daje napadaču kontrolu nad operativnim sistemom i samim računarom. Težina napada može da varira, od bezazlenog do veoma opasnog u zavisnosti šta je korisniku omogućeno. SQL injection je naročito opasan je je napadač u mogućnosti da kontroliše bazu podataka, a samim tim i da menja ili briše podatke. Kod SQL injection-a takođe postoji nekoliko vrsta napada poput blind SQL injection, DOM based SQL injection itd. PHP ili server side code injection takođe predstavlja jedan od težih propusta, jer se omogućava ubacivanje koda koji se izvršava na serveru i koji može da upravlja svim podacima. Prilikom obog napada mogu se ubaciti i kodovi sa eksternih stranica ili redirektovati sa sajta na drugi sajt, uz krađu sesije ili kolačića. Rešavanje problema injekcije varira od vrste injekcije na koju je web aplikacija ranjiva. Uglavnom je potrebno filtrirati specijalne karaktere kako bi se onemogućilo izvršavanje koda. Potrebno je obratiti pažnju da se onemogući preskakanje tih karaktera nekim specijalnim znakom i tako zaobiđe zaštita. Korisnički unos je potrebno uvek proveriti, po mogućnosti i na klijentskoj i na serverskoj strani da li je validan i ne sadrži neki napad, izfiltrirati ga ili odbiti pre bilo kakve dalje obrade.
Slomljena autentifikacija i upravljanje sesijama (Broken authentification and session management) – Čest je slučaj da timovi za razvoj softvera implementiraju svoj način autentifikacije ili upravljanja sesijom. Ove stvari spadaju u oblast kriptografije, a kriptografija je teška. Dakle implementirati ovo na korektan i neranjiv način je teško. U ovakvim aplikacijama napadač može biti u mogućnosti da reverznim inzenjeringom dozna kako radi algoritam i uspe da nađe način kako da krade tuđe sesije i identitete. Pronalaženje ovakvih grešaka može biti teško, jer zavisi od svake implementacije, ali ne i nemoguće. Često se u funkcijama za logout, pamćenje lozinke, upravljanje timeout-ima i sl nalaze ovakve greške. Preproručuje se uvek koristit framework ili algoritme koji je proveren za obezbeđivanje sesija i upravljanje autentifikacijom.
Nebezbedno referenciranje objekata (Insecure direct object references) – Česta greška programera je da prilokom pristupa određenim objektima u web aplikaciji se ne proveravaju prava pristupa korisnika, oslanjajući se na to da samo ono čemu je korisniku omogućeno da pristupi preko korisničkog interfejsa aplikacije će korisnik samo da pristupa. U praksi to ne mora biti slučaj. Menjanjem URL-a ili slanjem snimljenih i izmenjenih zahteva korisnik može zatražiti pristup bilo kom objektu. Ukoliko se ne proveravaju prava pristupa korisnik će moći i da pristupi tim objektima iako ne bi trebalo da im ima pristup. Bitno je proveravati prava pristupa prilikom svakog pristupa nekom objektu ili stranici.
Cross site request forgery (CSRF) – U ovoj ranjivosti se omogućava napadaču da kreira zahtev i da ga na neki način ubaci u web aplikaciju, tako da kada autentifikovan korisnik priđe toj stranici pošalje se napadački zahtev, ali kao da ga je poslao autentifikovan korisnik. Ovo je naročito bitno da se ne pojavljuje na stranicama online bankarstva ili online prodaje, gde ovakvi zahtevi mogu da prouzrokuju veliku novčanu štetu. Često je ovaj napad povezan sa injection napadom, odnosno XSS, kako bi napadaču omogućio da preko žrtvinog browsera pokrene legitiman zahtev. Kako bi se odbranili potrebno je dodati neki token u skriveno polje, koje će se slati u telu HTTP zahteva i koje neće biti otvoreno preko URL-a. Moguće je koristiti neke frameworke kao na primer OWASP CSRF Guard koji ovo na automatizovan način radi.
Bezbednostna miskonfiguracija – Konfiguracija aplikacije, kao i servera, platforme treba da bude specifikacijom definisana. Greška u konfiguraciji otvara prostor napadaču za različite napade. Ovaj problem je najčešći izvor site deface-a. Takođe kako bi se izbegli napadi potregno je držati softver ažuran uključujući sav serverski softver, aplikaciju, kao i biblioteke koje aplikacija koristi.
Nerestriktiranje URL pristupa – Greška mnogih aplikacija je da kontrolišu prava pristupa prilikom pritiska na određeni link ili dugme, pre nego što pošalju korisnika na određenu stranu. Opet predpostavljajući da korisnik neće pristupiti nečem što mu ne omogućava korisnički interfejs, ne kontroliše se pristup samoj stranici. Tako napadač iako nema pravo pristupa unosom URL-a može da pristupi stranici za koju nema prava pristupa. Potrebno je proveriti prava pristupa i prilikom svakog pristupa stranici.
Nedovoljna zaštita transportnog sloja – Čest slučaj je da podaci čiji transport treba da bude zaštićen poput lozinki ili drugih tajnih informacija se prenose kroz mrežu u čistom tekstu, bez korišćenja bilo kakvog algoritma za kripciju ili hash. U ovom slučaju aplikacija je ranjiva na napad poznat pod imenom Man in the middle ili prisluškivanje. Kako bi se odbranili potrebno je koristiti kripciju, bilo koristeći protokol koji već koristi kripciju poput HTTPS-a ili da se koristi neki jak algoritam kripcije.
Nevalidirani redirekti i prosleđivanja – Čest slučaj je da sajtovi prosleđuju korisnike na druge web stranice, bilo svojih partnera ili ne. Često se ne proverava sa kojim se sve podacima to prosleđivanje odvija, pa može napadač da ubaci prosleđivanje do svog fishing site-a kojim će da krade uz pomoć parametara sesijske podatke. Potrebno je validirati korisničke parametre prilikom svakog redirecta ili forward-a. Takođe ukoliko je moguće pokušati izbeći parametrizovane redirect-e
Preplavljivanje bafera (Buffer overflow) – napad čest sistemima pisanim u programskim jezicima koje zahtevaju od programera upravljanje memorijskog prostora. Ukoliko se to upravljanje ne radi na odgovarajući način napadač je u mogućnosti da preplavljivanjem bafera jedne aplikacije uđe u memorijski prostor druge i na taj način sruši aplikaciju ili čak preuzme kontrolu nad operativnim sistemom.
Nedovoljna sigurnost senzitivnih podataka – Čest je slučaj da se senzitivni podaci čuvaju u bazi podataka bez kripcije. Tako ne bi trebalo, jer se ne smemo osloniti na to da napadač neće doći u posed naše baze podataka. A ukoliko dođe, automatski su kompromitovani svi podaci, kao i identiteti svih korisnika. Sigurnost treba planirati na više slojeva, pa tako senzitivne informacije treba da budu kriptovane uvek ili nad njima iskorišćena jednostrana hash funkcija.
Nikola Milošević