| Both sides previous revisionPrevious revisionNext revision | Previous revision |
| file_upload [2023/12/01 16:29] – zrinka | file_upload [2025/12/01 11:40] (current) – external edit 127.0.0.1 |
|---|
| Također, ako aplikacija nema provjeru naziva datoteke koja se postavlja, napadač može objaviti datoteku istog naziva kao neka datoteka kritična za rad sustava i na taj način ju prebrisati. U još ekstremnijem slučaju napadač može u naziv datoteke ubaciti sekvencu za pomicanje po direktorijima ("..") i objaviti datoteke na lokacije kojima ne bi smio imati pristup. Zato je dobra praksa da sustav sâm dodijeli ime datoteci koja se postavlja. Vrlo je važno imati i provjeru veličine datoteke. Prevelika datoteka može izazvati tzv. //Denial-of-Service// (DoS) napad koji izaziva preopterećenje sustava i onemogućuje njegov rad. | Također, ako aplikacija nema provjeru naziva datoteke koja se postavlja, napadač može objaviti datoteku istog naziva kao neka datoteka kritična za rad sustava i na taj način ju prebrisati. U još ekstremnijem slučaju napadač može u naziv datoteke ubaciti sekvencu za pomicanje po direktorijima ("..") i objaviti datoteke na lokacije kojima ne bi smio imati pristup. Zato je dobra praksa da sustav sâm dodijeli ime datoteci koja se postavlja. Vrlo je važno imati i provjeru veličine datoteke. Prevelika datoteka može izazvati tzv. //Denial-of-Service// (DoS) napad koji izaziva preopterećenje sustava i onemogućuje njegov rad. |
| |
| Ponekad aplikacije imaju validaciju datoteka, ali ona ne bude dobro provedena. Ako sustav ima listu ekstenzija koje smatra opasnima, to nije uvijek dovoljna zaštita jer je moguće da se neki opasan format zaboravi dodati na listu. Isto tako, moguće je da se ekstenzija modificira tako da ju sustav ne prepozna kao jednu od zabranjenih. Na primjer, ako zabranimo .php datoteke, moguće je da netko pošalje .php5, .pHp ili čak dvostruku ekstenziju (datoteka.php.jpg). Nekad je dovoljno nakon ekstenzije dodati točku, razmak ili nešto slično. Može se i iskoristiti URL encoding. Datoteka se može nazvati "datoteka%2Ephp". Preglednik će "%2E" interpretirati kao točku, dakle "%2Ephp" će biti ".php". Uobičajena provjera ekstenzije neće ju detektirati jer programi za parsiranje imena datoteke redovito traže prvu pojavu točke i sve nakon nje interpretiraju kao ekstenziju. Program koji parsira ime datoteke neće prepoznati točku, dakle neće ni pronaći ekstenziju. Bolja je opcija dozvoliti samo one formate koji su ključni za rad aplikacije, a sve ostale zabraniti. Doduše, nije ni to uvijek dovoljno. Zahtjev se može presresti pa napadač može promijeniti ekstenziju nakon što prođe klijentsku provjeru, a prije nego što zahtjev dođe na poslužitelj. | Ponekad aplikacije imaju validaciju datoteka, ali ona ne bude dobro provedena. Ako sustav ima listu ekstenzija koje smatra opasnima, to nije uvijek dovoljna zaštita jer je moguće da se neki opasan format zaboravi dodati na listu. Isto tako, moguće je da se ekstenzija modificira tako da ju sustav ne prepozna kao jednu od zabranjenih. Na primjer, ako zabranimo .php datoteke, moguće je da netko pošalje .php5, .pHp ili čak dvostruku ekstenziju (datoteka.jpg.php). Nekad je dovoljno nakon ekstenzije dodati točku, razmak ili nešto slično. Bolja je opcija dozvoliti samo one formate koji su ključni za rad aplikacije, a sve ostale zabraniti. Bitno je da se provjera izvršava na poslužiteljskoj strani. |
| \\ | \\ |
| \\ | \\ |
| Pokušajmo na isti način postaviti datoteku. Napravimo php shell kao i prije: | Pokušajmo na isti način postaviti datoteku. Napravimo php shell kao i prije: |
| <code><?php system($_GET['cmd']); ?></code> | <code><?php system($_GET['cmd']); ?></code> |
| te ga preimenujmo tako da ima ekstenziju .jpg na kraju. Uključimo //Intercept// na Burp-u i postavimo datoteku. Presretnimo zahtjev i promijenimo ekstenziju u .php isto kao u prethodnom zadatku. | te ga preimenujmo tako da ima ekstenziju .jpg na kraju. Uključimo //Intercept// na Burpu i postavimo datoteku. Presretnimo zahtjev i promijenimo ekstenziju u .php isto kao u prethodnom zadatku. |
| |
| {{ :upload31.png?600 |}} | {{ :upload31.png?600 |}} |
| |
| Vidimo drugačije upozorenje. To je zato što, za razliku od prethodnih slučajeva, sustav radi još jednu provjeru na poslužiteljskoj (//backend//) strani. Dakle, moramo na neki način promijeniti samu datoteku da izgleda kao da je slika. Slike uobičajeno počinju sa "GIF89a;" pa ćemo točno to dodati na početak datoteke. Datoteka sad izgleda ovako: | Vidimo drugačije upozorenje. To je zato što, za razliku od prethodnih slučajeva, sustav radi još jednu provjeru na poslužiteljskoj (//backend//) strani. Dakle, moramo na neki način promijeniti samu datoteku da izgleda kao da je slika. Slike uobičajeno počinju s "GIF89a;" pa ćemo točno to dodati na početak datoteke. Datoteka sad izgleda ovako: |
| <code> | <code> |
| GIF89a; | GIF89a; |
| \\ | \\ |
| \\ | \\ |
| Budući da je gotovo nemoguće pokriti sve načine na koje se može zaobići validacija datoteke, potrebno je konfigurirati poslužitelj tako da se, ako do njega slučajno dođe izvršivi programski kôd, spriječi njegovo izvršavanje. Dodatna mjera zaštite je onemogućiti postavljanje datoteke prije nego što prođe sve provjere. Neki sustavi koriste odvojeno privremeno spremište (tzv. //sandbox//) u koji stave datoteku i od tamo ju provjeravaju. Nekad je bila praksa postaviti datoteku na poslužitelj i obrisati ju ako se ispostavi da je maliciozna, no pokazano je da je to nije dovoljna zaštita jer je nekad čak nekoliko milisekundi dovoljno da bi se pokrenulo izvršavanje kôda. | |
| |
| |
| |
| |
| ===Izvori=== | ===Izvori=== |
| [1] https://portswigger.net/web-security/file-upload\\ | [1] https://portswigger.net/web-security/file-upload\\ |
| [2] https://owasp.org/www-community/vulnerabilities/Unrestricted_File_Upload\\ | [2] https://owasp.org/www-community/vulnerabilities/Unrestricted_File_Upload\\ |
| [3] https://platforma.hacknite.hr/\\ | [3] https://platforma.hacknite.hr/\\ |