User Tools

Site Tools


file_upload

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
file_upload [2023/12/06 12:42] lssfile_upload [2026/06/17 17:06] (current) mbunic
Line 1: Line 1:
 ==== 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 tada se javljaju ranjivosti poput [[sql_injection|SQL injectiona]] ili [[ssti|SSTI-ja]]Zadaćje sustava da prepozna pokušaj unosa naredbe spriječi njezino izvođenje.+**File upload ranjivosti** odnose se na napade koji se izvršavaju postavljanjem (//uploadom//malicioznih datoteka na poslužitelj. Svaki korisnički unos treba biti adekvatno validiran prije nego što se pohrani ili koristi na drugi način. U slučaju web aplikacija koje omogućuju prijenos datoteka na poslužitelj (fotografija, dokumenata, audiozapisa i slično), ako validacija nije adekvatno implementirana, napadač može iskoristiti ovu funkcionalnost za učitavanje nepredviđenih zlonamjernih datoteka. 
 + 
 +Jednostavan primjer je slučaj u aplikacijama koje nemaju popis dozvoljenih ekstenzija 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ôdUspješ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ć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. "../../../var/www/html/profile_picture.jpg.php"), ove ranjivosti zajedno se mogu kombinirati kako bi se ostvarilo izvršavanje koda (engl. //remote code execution//, RCE).
  
-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.  
-\\ 
 \\ \\
 \\ \\
Line 48: Line 50:
 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.jpg.php). 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
 \\ \\
 \\ \\
Line 121: Line 123:
 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 "GIF89a;" pa ćemo točno to dodati na početak datoteke. Datoteka sad izgleda ovako: 
 <code> <code>
 GIF89a; GIF89a;
Line 143: Line 145:
 \\ \\
 \\ \\
-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/\\
file_upload.1701866558.txt.gz · Last modified: 2025/12/01 11:40 (external edit)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki