file_upload
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| file_upload [2023/11/30 10:15] – zrinka | file_upload [2026/06/17 17:06] (current) – mbunic | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | **File upload | + | ==== File upload |
| - | Web aplikacije | + | **File upload ranjivosti** odnose se na napade koji se izvršavaju postavljanjem (// |
| - | **__PRIMJER__ - Zadatak s Hacknite platforme - Posluživanje datoteka** | + | Jednostavan primjer je slučaj u aplikacijama koje nemaju popis dozvoljenih ekstenzija i validaciju sadržaja datoteke, već prihvaćaju datoteke svih formata. Tada je moguće jednostavno učitati datoteke poput .php, .py ili bilo koje druge datoteke koje se mogu izvršavati kao programski kôd. Uspješan prijenos takve datoteke nije uvijek dovoljan, već je potrebno i da poslužitelj bude konfiguriran tako da se taj kôd može i izvršiti. |
| + | |||
| + | Složeniji primjeri su slučajevi gdje se stvarno vrši validacija sadržaja datoteke, npr. datoteka mora biti validna slika, a sustav je konfiguriran tako da izvršava kôd samo ako se datoteke nalaze u određenim direktorijima. U takvim slučajevima mogući su napadi korištenjem **polyglot** datoteka, koje mogu istovremeno biti i validna slika i validan programski kôd. Ako je u sustavu također prisutna i **path traversal** ranjivost pri pohrani učitane datoteke, koja omogućuje arbitraran odabir direktorija u koji će se datoteka pohraniti manipulirajući imenom datoteke (npr. " | ||
| + | |||
| + | \\ | ||
| + | \\ | ||
| + | **__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 | Ivica je zaključio da je jedna od ključnih vještina koje treba vježbati rad s datotekama kroz web | ||
| Line 19: | Line 25: | ||
| </ | </ | ||
| - | 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 | + | 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 |
| < | < | ||
| - | + | Zatim odaberimo u navigaciji " | |
| - | Zatim odaberimo u navigaciji " | + | |
| {{ : | {{ : | ||
| - | Dakle, | + | Dakle, |
| < | < | ||
| - | + | Nakon što ju postavimo, otiđimo na link i dodajmo | |
| - | Objavimo datoteku. Otiđimo na link i dodajmo cmd parametar. Prvo želimo saznati | + | |
| < | < | ||
| - | + | Dobili smo ispis **/ | |
| - | Dobili smo ispis **/ | + | |
| < | < | ||
| - | |||
| Nismo dobili ništa zanimljivo. Pomaknimo se bliže radnom direktoriju: | Nismo dobili ništa zanimljivo. Pomaknimo se bliže radnom direktoriju: | ||
| < | < | ||
| - | |||
| Vidimo da postoji nešto što se zove " | Vidimo da postoji nešto što se zove " | ||
| < | < | ||
| Line 44: | Line 45: | ||
| {{ : | {{ : | ||
| + | \\ | ||
| + | \\ | ||
| + | \\ | ||
| + | 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 (" | ||
| - | + | 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. | |
| - | + | \\ | |
| - | 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 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. | + | \\ |
| - | + | \\ | |
| - | Ponekad aplikacije imaju provedenu | + | |
| - | + | ||
| - | **__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 | + | |
| - | 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:// | + | |
| - | + | ||
| - | </ | + | |
| - | + | ||
| - | 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 | + | |
| - | + | ||
| - | == TODO: dodati ostatak == | + | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | Problem je i kad se provjera formata temelji isključivo na zaglavljima zahtjeva (primjerice // | + | |
| **__PRIMJER__ - Zadatak s Hacknite platforme - Učitavanje slike.php** | **__PRIMJER__ - Zadatak s Hacknite platforme - Učitavanje slike.php** | ||
| < | < | ||
| Line 92: | Line 69: | ||
| Pokušajmo jednostavno postaviti .php datoteku kao u prethodnom zadatku. | Pokušajmo jednostavno postaviti .php datoteku kao u prethodnom zadatku. | ||
| - | {{ :upload2.png?600 |}} | + | {{ :upload20.png?600 |}} |
| - | Vidimo da nam to ne uspijeva jer dobivamo obavijest da datoteka nije slika. Dakle, sigurni smo da se radi provjera ekstenzije s klijentske (// | + | Vidimo da nam to ne uspijeva jer dobivamo obavijest da datoteka nije slika. Dakle, sigurni smo da se radi provjera ekstenzije s klijentske (// |
| {{ : | {{ : | ||
| Line 108: | Line 85: | ||
| < | < | ||
| Bolja je opcija napisati " | Bolja je opcija napisati " | ||
| - | Dobili smo \\ | + | Dobili smo ispis:\\ |
| **backups cache important-do-not-touch lib local lock log mail opt run spool tmp www** | **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: | Najzanimljivije nam djeluje **important-do-not-touch** pa ćemo izlistati njegov sadržaj. Napišimo u //cmd// parametar: | ||
| < | < | ||
| - | Dobili smo **admin-forbidden local**. | + | rezultira s: |
| **admin-forbidden** djeluje kao da bi mogao imati nešto zanimljivo u sebi. Izlistajmo i njegov sadržaj: | **admin-forbidden** djeluje kao da bi mogao imati nešto zanimljivo u sebi. Izlistajmo i njegov sadržaj: | ||
| < | < | ||
| - | Pojavio se "definitely-not-flag". Pokušajmo | + | Pojavio se **definitely-not-flag**. Pokušajmo |
| < | < | ||
| i dobili smo rješenje. | 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, | ||
| + | \\ | ||
| + | \\ | ||
| + | \\ | ||
| + | **__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:// | ||
| + | |||
| + | </ | ||
| + | |||
| + | Pokušajmo na isti način postaviti datoteku. Napravimo php shell kao i prije: | ||
| + | < | ||
| + | te ga preimenujmo tako da ima ekstenziju .jpg na kraju. Uključimo // | ||
| + | {{ : | ||
| - | Budući da je gotovo nemoguće pokriti sve načine na koje se može zaobići validacija datoteke, potrebno | + | Vidimo drugačije upozorenje. To je zato što, za razliku od prethodnih |
| + | < | ||
| + | GIF89a; | ||
| + | <?php system($_GET[' | ||
| + | </ | ||
| + | Sad ju pošaljimo | ||
| + | {{ : | ||
| + | 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 // | ||
| + | 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, | ||
| + | {{ : | ||
| + | Sad smo dobili uobičajeno upozorenje. Postupak je isti kao i prije te se flag nalazi na putanji **/ | ||
| + | \\ | ||
| + | \\ | ||
| + | \\ | ||
| ===Izvori=== | ===Izvori=== | ||
| - | [1]https:// | + | [1] https:// |
| [2] https:// | [2] https:// | ||
| + | [3] https:// | ||
file_upload.1701339336.txt.gz · Last modified: 2025/12/01 11:40 (external edit)