**File upload ranjivosti** odnose se na napade koji se izvršavaju postavljanjem (//uploadom//) maliciozne datoteke na poslužitelj. Svaki korisnički unos treba biti pročišćen prije procesiranja. U slučaju kad se prima samo tekst, napadač može pokušati upisati neku malicioznu naredbu i tada se javljaju ranjivosti poput [[sql_injection|SQL injectiona]] ili [[ssti|SSTI-ja]]. Zadaća je sustava da prepozna pokušaj unosa naredbe i da spriječi njezino izvođenje.
Web aplikacije često dozvoljavaju i prijenos datoteka na poslužitelj (fotografija, dokumenata i slično). U tom slučaju napadač može manipulirati datotekom koju prenosi na poslužitelj i napraviti štetu. Najjednostavniji je slučaj u aplikacijama koje nemaju popis dozvoljenih ekstenzija, već prihvaćaju datoteke svih formata. Tada je moguće jednostavno objaviti .php, .py ili bilo koju datoteku koja se može izvršiti kao programski kôd. Uspješan prijenos takve datoteke nije uvijek dovoljan da bi se kôd izvršio, već je potrebno i da poslužitelj bude konfiguriran tako da zaista izvede taj kôd.
**__PRIMJER__ - Zadatak s Hacknite platforme - Posluživanje datoteka**
Ivica je zaključio da je jedna od ključnih vještina koje treba vježbati rad s datotekama kroz web
stranicu. Kako bi apsolvirao taj skup vještina, odlučio je napraviti vlastiti servis za posluživanje
datoteka. Naravno, uvijek oprezni Ivica se dosjetio da treba spriječiti da korisnici servisa
zloupotrebljavaju njegovu dobru volju i ograničene računalne resurse pa je zato strogo ograničio
veličinu datoteka koje njegova web stranica prihvaća.
Možeš li pogledati njegovu novu web stranicu i provjeriti je li trebao još što ograničiti?
Flag je u formatu CTF2020[brojevi]
http://chal.platforma.hacknite.hr:11012
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 na taj način objaviti datoteke na lokacije kojima ne bi smio imati pristup. Dobra je 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.
Iako gotovo sigurno ne postoji web stranica koja nema validaciju datoteka, često se dogodi da ona ne bude dobro provedena.
Ako sustav ima listu ekstenzija koje smatra opasnima, to nije uvijek dovoljna zaštita jer je uvijek moguće da se neki opasan format zaboravi dodati na listu. Bolja je opcija dozvoliti samo određene formate datoteka i to one koji su ključni za rad aplikacije, a sve ostale zabraniti. Doduše, nije ni to uvijek dovoljno. Na primjer, ako zabranimo .php datoteke, moguće je da netko pošalje .php5, .pHp datoteku ili čak da datoteka ima dvostruku ekstenziju (datoteka.php.jpg). Nekad je dovoljno nakon ekstenzije dodati točku, razmak ili nešto slično. Također, može se koristiti 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.
**__PRIMJER__ - Zadatak s Hacknite platforme - Posluživanje slika**
Ivica je naučio važnu lekciju - ako želi da mu web stranica bude sigurna, mora sve jako dobro provjeravati.
Kako bi demonstrirao svoje znanje web sigurnosti, napravio je servis za posluživanje slika. Ovaj puta ne
samo da je strogo ograničio veličinu datoteka koje njegova web stranica prihvaća, već je i uveo dodatne
provjere kako ga zlonamjerni korisnici ne bi zeznuli.
Možeš li pomoći Ivici i provjeriti ima li kakvih propusta koje bi zlonamjerni korisnici mogli iskoristiti?
Flag je u formatu CTF2020[brojevi]
http://chal.platforma.hacknite.hr:11013
Pokušajmo na isti način objaviti datoteku. Sad primjećujemo razliku jer se .php datoteka ni ne nudi za postavljanje. To znači da stranica provjerava koji se formati objavljuju, dakle moramo nekako sakriti format datoteke. Pokušajmo na kraj dodati .jpg. Sad će se datoteka pojaviti u izboru. Međutim, sustav i dalje ne dozvoljava postavljanje datoteke jer prepoznaje da nije slika.
Dakle, sama promjena ekstenzije nije dovoljna, već moramo na još neki način uvjeriti poslužitelj da pokušavamo postaviti fotografiju.
TODO: dodati ostatak
Problem je i kad se provjera formata temelji isključivo na zaglavljima zahtjeva (primjerice //Content-Type//) koja se mogu jednostavno promijeniti koristeći neki alat za presretanje zahtjeva, primjerice [[burp|Burp Suite]]. Trebalo bi još utvrditi i da sadržaj datoteke zaista odgovara tom formatu. Na primjer, ako aplikacija prima fotografije,svim datotekama bi prije postavljanja trebalo odrediti neke osobine koje imaju samo fotografije (dimenzija, rezolucija). Ako se pošalje neka skripta, njoj se te osobine ne mogu odrediti, dakle sustav može prepoznati da nije riječ o fotografiji i odbaciti ju. Naravno, važno je da se pritom datoteka ne otvara jer bi to moglo potaknuti izvršavanje kôda.
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 čak nekoliko milisekundi dovoljno da bi se pokrenulo izvršavanje kôda.
**__PRIMJER__ - Zadatak s Hacknite platforme - Učitavanje slike.php**
(restrikcije na klijentskoj razini)
Kako bi naučio lijepo crtati, Mario u slobodno vrijeme precrtava slike prirode. Nažalost, nema puno ideja
gdje bi našao zanimljive slike, ali je zato napravio stranicu koja mu omogućuje da drugi ljudi učitavaju
slike koje on onda može iskoristiti. Mario je vrlo oprezan, pa je zato ograničio veličinu datoteka koje se
mogu učitati kako zlonamjerni ljudi ne bi mogli učitati nešto što nije slika.
Flag je u formatu CTF2021[brojevi]
http://chal.platforma.hacknite.hr:10016
===Izvori===
[1]https://portswigger.net/web-security/file-upload\\
[2] https://owasp.org/www-community/vulnerabilities/Unrestricted_File_Upload\\