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/27 16:51] – zrinka | file_upload [2025/12/01 11:40] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | **File upload | + | ==== File upload |
| - | Web aplikacije često dozvoljavaju i prijenos datoteka | + | **File upload ranjivosti** odnose se na napade koji se izvršavaju postavljanjem (// |
| - | **__PRIMJER__ - Zadatak s Hacknite platforme - Posluživanje datoteka** | + | Kod web aplikacije koje dozvoljavaju prijenos datoteka na poslužitelj (fotografija, |
| + | \\ | ||
| + | \\ | ||
| + | \\ | ||
| + | **__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 23: | ||
| </ | </ | ||
| + | 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: | ||
| + | < | ||
| + | Zatim odaberimo u navigaciji " | ||
| - | 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 | + | 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: |
| + | < | ||
| + | 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// | ||
| + | < | ||
| + | Dobili smo ispis **/ | ||
| + | < | ||
| + | Nismo dobili ništa zanimljivo. Pomaknimo se bliže radnom direktoriju: | ||
| + | < | ||
| + | Vidimo da postoji | ||
| + | < | ||
| - | 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. | + | 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 (" | ||
| + | |||
| + | 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. | ||
| + | \\ | ||
| + | \\ | ||
| + | \\ | ||
| + | **__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:// | ||
| + | |||
| + | </ | ||
| + | |||
| + | 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 (// | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | 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|Burp Suite]]. Otvorimo alat, uđimo u njegov ugrađeni preglednik i postavimo tamo istu .jpg datoteku. Uključimo // | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | U ovoj liniji promijenimo .jpg ekstenziju u .php. Sad pošaljimo zahtjev. Nakon ovog koraka možemo isključiti // | ||
| + | |||
| + | {{ : | ||
| + | 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 **/ | ||
| + | < | ||
| + | Bolja je opcija napisati " | ||
| + | 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: | ||
| + | < | ||
| + | rezultira s: **admin-forbidden local**. | ||
| + | |||
| + | **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 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 | ||
| + | < | ||
| + | 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** | **__PRIMJER__ - Zadatak s Hacknite platforme - Posluživanje slika** | ||
| < | < | ||
| Line 42: | Line 119: | ||
| </ | </ | ||
| - | Pokušajmo na isti način | + | Pokušajmo na isti način |
| + | < | ||
| + | te ga preimenujmo tako da ima ekstenziju | ||
| - | Dakle, sama promjena ekstenzije nije dovoljna, već moramo na još neki način uvjeriti poslužitelj da pokušavamo postaviti fotografiju. | + | {{ :upload31.png?600 |}} |
| - | TODO: dodati | + | Vidimo drugačije upozorenje. To je zato što, za razliku od prethodnih slučajeva, sustav radi još jednu provjeru na poslužiteljskoj (// |
| + | < | ||
| + | GIF89a; | ||
| + | <?php system($_GET[' | ||
| + | </ | ||
| + | Sad ju pošaljimo na poslužitelj i zasad nemojmo mijenjati ekstenziju u zahtjevu. | ||
| + | {{ : | ||
| - | Problem | + | Datoteka |
| + | Naime, za svaki poslužitelj treba konfigurirati točno | ||
| - | 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. // | + | {{ :upload33.png?600 |}} |
| - | + | ||
| - | + | ||
| - | **__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: | + | |
| - | + | ||
| - | </ | + | |
| + | 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.1701103880.txt.gz · Last modified: 2025/12/01 11:40 (external edit)