User Tools

Site Tools


file_upload

File upload

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 nego što dođe do poslužitelja. U slučaju kad se prima samo tekst, napadač može pokušati upisati neku malicioznu naredbu i tada se javljaju ranjivosti poput SQL injectiona ili SSTI-ja. Zadaća je sustava da prepozna pokušaj unosa naredbe i spriječi njezino izvođenje.

Kod web aplikacije koje dozvoljavaju prijenos datoteka na poslužitelj (fotografija, dokumenata i slično) napadač može iskoristiti prostor za unos datoteke da pošalje neku malicioznu datoteku na poslužitelj. 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, 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

Budući da u zadatku nije navedeno, aplikacija vjerojatno ne provjerava ekstenzije datoteka koje se objavljuju. Pokušajmo za početak objaviti .php datoteku. Napravimo datoteku test.php datoteku s ovim sadržajem:

<?php echo "Hello world!" ?>

Zatim odaberimo u navigaciji “Datoteke” i postavimo svoju datoteku. Postavljanje je uspjelo, dakle ne postoji nikakva provjera formata datoteke. Još treba provjeriti je li se kôd izvršio jer je moguće da poslužitelj ne prepoznaje ekstenziju .php. Po uspješnom postavljanju datoteke, stranica nas obavještava gdje je datoteka postavljena. Ako pratimo tu poveznicu, vidjet ćemo sljedeće:

Dakle, kôd se izvršio. Sad napravimo svoju php ljusku koju ćemo postaviti na poslužitelj. Napravit ćemo ju tako da prima podatke preko cmd parametra URL-a. Datoteka izgleda ovako:

<?php system($_GET['cmd']); ?>

Nakon što ju postavimo, otiđimo na link i dodajmo cmd parametar. Prvo želimo saznati u kojem smo trenutno direktoriju i za to ćemo iskoristiti naredbu pwd (print working directory):

[link_datoteke]?cmd=pwd

Dobili smo ispis /var/www/html/uploads. Krenimo s od najvišeg direktorija i izlistajmo njegov sadržaj. Za to ćemo iskoristiti naredbu ls (list). Dodajmo ovu naredbu u cmd parametar:

ls /var/

Nismo dobili ništa zanimljivo. Pomaknimo se bliže radnom direktoriju:

 ls /var/www 

Vidimo da postoji nešto što se zove “flag”. Pokušajmo to ispisati. Za to ćemo iskoristiti naredbu cat (concatenate):

cat /var/www/flag 

I dobili smo rezultat:




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.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.


PRIMJER - Zadatak s Hacknite platforme - Učitavanje slike.php

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

Pokušajmo jednostavno postaviti .php datoteku kao u prethodnom zadatku.

Vidimo da nam to ne uspijeva jer dobivamo obavijest da datoteka nije slika. Dakle, sigurni smo da se radi provjera ekstenzije s klijentske (frontend) strane. Da bismo zadovoljili tu provjeru, promijenimo ekstenziju datoteke u .jpg. Datoteka se uspješno poslala i dobili smo poveznicu na kojoj se nalazi. Pratimo tu poveznicu i pokušajmo na isti način kao i prije dodati parametar cmd u koji ćemo unijeti neku naredbu (primjerice pwd).

Naredba se nije izvršila. Budući da datoteka ima .jpg ekstenziju na kraju, preglednik ju interpretira kao sliku. Dakle, moramo na neki način poslati datoteku koja će zadovoljiti klijentsku provjeru da je u pitanju slika, a koja će se pri dolasku interpretirati kao izvršivi kôd. Najjednostavniji način je da presretnemo zahtjev i promijenimo ekstenziju datoteke. Za to ćemo iskoristiti alat Burp Suite. Otvorimo alat, uđimo u njegov ugrađeni preglednik i postavimo tamo istu .jpg datoteku. Uključimo Intercept i pošaljimo zahtjev.

U ovoj liniji promijenimo .jpg ekstenziju u .php. Sad pošaljimo zahtjev. Nakon ovog koraka možemo isključiti Intercept.

Vidimo ovo upozorenje, no ono nam je dobar znak jer to znači da se kôd pokušava izvršiti. cmd parametar je prazan, odnosno nije niti zadan, pa se ništa ne može izvršiti. Također, iz poruke o grešci vidimo da se nalazimo na putanji /var/www/html/uploads. Krenimo od najvišeg direktorija te putanje i potražimo gdje bi se mogao naći flag. Upišimo u cmd parametar:

ls /var

Bolja je opcija napisati “ls%20/var”, no sustav će sam napraviti URL encoding. Dobili smo ispis:
backups cache important-do-not-touch lib local lock log mail opt run spool tmp www

Najzanimljivije nam djeluje important-do-not-touch pa ćemo izlistati njegov sadržaj. Napišimo u cmd parametar:

ls /var/important-do-not-touch"

rezultira s: admin-forbidden local.

admin-forbidden djeluje kao da bi mogao imati nešto zanimljivo u sebi. Izlistajmo i njegov sadržaj:

cmd=ls /var/important-do-not-touch/admin-forbidden"

Pojavio se definitely-not-flag. Pokušajmo izlistati njegov sadržaj. Dobili smo neobičan ispis (putanju na kojoj se trenutno dolazimo), dakle u pitanju nije direktorij, već datoteka. Ispišimo njezin sadržaj naredbom

cat /var/important-do-not-touch/admin-forbidden/definitely-not-flag

i dobili smo rješenje.


Kao što sto vidjeli u prethodnom zadatku, nije dovoljno da se provjera formata temelji isključivo na zaglavljima zahtjeva jer se njihove vrijednosti mogu jednostavno promijeniti koristeći neki alat za presretanje zahtjeva. Trebalo bi još utvrditi i da sadržaj datoteke zaista odgovara tom formatu. Na primjer, ako aplikacija prima fotografije, svim bi datotekama 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.


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 postaviti datoteku. Napravimo php shell kao i prije:

<?php system($_GET['cmd']); ?>

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.

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:

GIF89a;
<?php system($_GET['cmd']); ?>

Sad ju pošaljimo na poslužitelj i zasad nemojmo mijenjati ekstenziju u zahtjevu.

Datoteka je uspješno postavljena jer zadovoljava klijentsku provjeru, no ne možemo slati nikakve naredbe jer ju sustav interpretira kao fotografiju. Pošaljimo ponovno zahtjev, ali ga presretnimo i promijenimo ekstenziju u .php. Dobivamo identično upozorenje jer sustav prepoznaje neslaganje s formatom datoteke koji se odredi prema početku (GIF89a;), ekstenzijom i zadanim tipom datoteke u Content-Type zaglavlju. Zadnje što još trebamo napraviti je iskoristiti neku alternativnu ekstenziju. Uzmimo primjerice .phtml. Naime, za svaki poslužitelj treba konfigurirati točno koje će ekstenzije kad ih se posjeti izvršiti neki programski kôd, a koje ne. Zato se naša .jpg datoteka neće izvršiti (iako su istog sadržaja kao i kad joj promijenimo ekstenziju u .php ). No, mnogi su poslužitelji konfigurirani tako da .phtml datoteke tretiraju kao .php. Vidjeli smo da je .php zabranjen pa je .phtml dobar kandidat za alternativnu ekstenziju. Budući da .phtml nije ekstenzija za fotografije, moramo poslati .jpg fotografiju, presresti zahtjev i zatim promijeniti ekstenziju u .phtml.

Sad smo dobili uobičajeno upozorenje. Postupak je isti kao i prije te se flag nalazi na putanji /var/www/flag. Ispišimo njegovu vrijednost preko cmd parametra i dobili smo rješenje.


Izvori

file_upload.txt · Last modified: 2023/12/07 16:19 by 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki