# PHP datoteke u direktoriju za prijenose: ispravno protumačiti nalaze

> PHP datoteka u direktoriju za prijenose? Kako protumačiti nalaz, provjeriti pristupe u zapisniku i razlikovati bezazlene datoteke od web shellova.

Izvor: https://phpsos.de/hr/blog/php-dateien-im-upload-ordner/  
Stanje: 25.10.2026  
Pružatelj: PHP SOS, PHP hitna pomoć i sigurnost poslužitelja. Hitna pomoć putem WhatsAppa: https://wa.me/491736494914?text=Pozdrav%20PHP%20SOS%2C%20trebamo%20pomo%C4%87%20s%20na%C5%A1im%20PHP%20poslu%C5%BEiteljem.%20Tvrtka%3A%20%E2%80%A6%20Web-stranica%3A%20%E2%80%A6

**Ukratko:** PHP datoteka u direktoriju za prijenose ozbiljan je znak upozorenja, jer bi tamo trebale ležati samo slike i dokumenti. Datoteku nikad ne otvarajte u pregledniku, nego je čitajte kao tekst, provjerite vremenske žigove i vlasnika te potražite naziv datoteke u pristupnim zapisnicima. Bezazlene su uglavnom samo prazne rezervirane datoteke poput `index.php` bez sadržaja; sve ostalo tretirajte kao moguću provalu.

## Zašto PHP nema što tražiti u direktoriju za prijenose

Direktoriji za prijenose služe sadržaju koji učitavaju posjetitelji ili urednici: slike, PDF-ovi, videozapisi. Korisnik web-poslužitelja tamo smije pisati, inače prijenosi ne bi radili. Upravo to te direktorije čini privlačnima napadačima. Tko putem ranjivosti može pisati datoteke, odlaže ih tamo gdje je pisanje dopušteno.

Nove PHP datoteke u direktorijima za prijenose ili predmemoriju prema izvješćima koja su nam dostupna spadaju među opće znakove upozorenja nakon provale. Za PHP2Shell nema potvrđenih Indicators of Compromise; nalaz stoga ne govori putem koje je ranjivosti datoteka dospjela. Kako se funkcije prijenosa grade sigurno, opisuje članak [Sigurno provesti prijenos datoteka u PHP-u](https://phpsos.de/hr/ratgeber/datei-upload-sicher/).

Može li takva datoteka nanijeti štetu, odlučuje konfiguracija web-poslužitelja. Izvršava li PHP datoteke u direktoriju za prijenose, svaka tamo odložena datoteka postaje mogućnost daljinskog upravljanja. Ako je izvršavanje tamo blokirano, datoteka ostaje strano tijelo, ali isprva bez učinka. Mnoge instalacije nikad nisu postavile tu blokadu.

## Kako PHP datoteka dospijeva u direktorij za prijenose?

Za procjenu pomaže poznavati moguće putove. Svaki vodi do drugih daljnjih pitanja.

| Put | Tipična pozadina | Daljnje pitanje |
|---|---|---|
| Nesiguran obrazac za prijenos | provjera samo nastavka ili tipa koji javlja preglednik | Koji obrasci prihvaćaju datoteke? |
| Ranjivost u dodatku ili temi | poznata slabost u zastarjelom proširenju | Koja su proširenja zastarjela? |
| Ukradeni pristupni podaci | administratorski, FTP ili hosting račun | Kakve su prijave bile u posljednje vrijeme? |
| Izvršavanje koda putem ranjivosti | npr. u interpreteru, kako je moguće kod PHP2Shella | Je li PHP u tom razdoblju bio ranjiv? |
| Legitiman dodatak | rezervirane datoteke, rijetko datoteke predmemorije | Pripada li datoteka izvornom paketu? |

Više putova može se spojiti. Napadač koji izvrši kod putem ranjivosti datoteku možda samo odloži kako bi se kasnije udobnije vratio.

## Sustavno popisati mjesta nalaza

Prije nego procijenite pojedinu datoteku, steknite pregled. Naredbe samo čitaju. Putovi su primjeri za WordPress; kod drugih sustava prilagodite put do prijenosa.

```bash
# Datoteke nalik PHP-u u direktoriju za prijenose s veličinom, vlasnikom, mtime i ctime
find /var/www/html/wp-content/uploads -type f \
  \( -iname "*.php*" -o -iname "*.phtml" -o -iname "*.phar" -o -iname ".htaccess" -o -iname ".user.ini" \) \
  -printf '%s Bytes  %u  m:%T+  c:%C+  %p\n'

# Tip datoteke odrediti prema sadržaju umjesto prema nastavku (slike s PHP sadržajem upadaju u oči)
find /var/www/html/wp-content/uploads -type f -newermt "2026-10-17" -exec file {} + | grep -viE "image|pdf|video|audio"
```

Drugi sustavi koriste druge direktorije za pisanje, primjerice `fileadmin` kod TYPO3-a, `images` kod Joomle ili direktorij medija pod `public` kod Shopwarea 6. Tome se pridodaju direktoriji predmemorije i privremenih datoteka aplikacije. Kod multisite instalacija i više web-stranica na jednom poslužitelju odgovarajuće je mnogo direktorija za prijenose; svaki pripada u pretragu.

Sumnjive su i datoteke `.htaccess` i `.user.ini` u direktoriju za prijenose. Njima se izvršavanje PHP-a u tom direktoriju može ponovno uključiti ili izmijeniti konfiguracija.

## PHP datoteka u direktoriju za prijenose: ispravno protumačiti nalaz

Nije svaki pogodak jednako ozbiljan. Sljedeće razvrstavanje pomaže pri prvoj procjeni. Ne zamjenjuje pomnu istragu.

| Nalaz | Prvo razvrstavanje |
|---|---|
| `index.php` s nula bajtova ili samo komentarom | uglavnom rezervirana datoteka protiv ispisa direktorija, uskladiti s dodatkom |
| PHP datoteka sa sadržajem u mjesečnom direktoriju | visoka sumnja |
| Dvostruki nastavak poput `bild.jpg.php` ili `.php.png` | visoka sumnja, tipično maskiranje |
| Slika koja prema `file` sadrži PHP kod | visoka sumnja, može se izvršiti uključivanjem |
| `.htaccess` ili `.user.ini` u direktoriju za prijenose | sumnja, provjeriti konfiguraciju |
| Datoteka pripada korisniku web-poslužitelja, ctime nakon 17. 10. | odgovara provali putem web-stranice |

Sumnjive datoteke čitajte samo kao tekst, primjerice s `head -c 2000 datei.php` ili `less`. Upadljivi su vrlo dugi retci, kodirani nizovi znakova i nazivi funkcija poput `eval` ili `base64_decode`. Po čemu prepoznati zamagljeni kod, pokazuje članak [Prepoznati zamagljeni PHP kod](https://phpsos.de/hr/blog/verschleierter-php-code/).

## Je li datoteka pozvana? Pogled u zapisnik

Najvažnije pitanje nakon nalaza glasi: je li je netko koristio? Odgovor stoji u pristupnim zapisnicima web-poslužitelja. Potražite naziv datoteke, i u arhiviranim zapisnicima.

```bash
# Pozivi sumnjive datoteke u aktualnim i spakiranim zapisnicima (ime kao primjer)
grep -h "uploads/2026/10/thumb.php" /var/log/nginx/access.log* 2>/dev/null
zgrep -h "uploads/2026/10/thumb.php" /var/log/nginx/access.log*.gz 2>/dev/null

# Samo uspješni pozivi s IP adresom i trenutkom
grep -h "uploads/2026/10/thumb.php" /var/log/nginx/access.log* | awk '$9 == 200 {print $1, $4, $6, $7}'
```

Mnogo uspješnih POST zahtjeva s nekoliko adresa upućuje na aktivnu uporabu kao web shell. Nema li pogodaka, to automatski ne znači otkaz uzbune, jer zapisnici mogu biti rotirani, obrisani ili nepotpuni. Ako web-stranica radi iza CDN-a ili proxyja, dodatni zapisnici nalaze se tamo; kod zajedničkog hostinga hoster pristupne zapisnike uglavnom stavlja na raspolaganje u korisničkom području. Pazite i na zahtjeve prema drugim novim datotekama s istih adresa, jer često vode do daljnjih sastavnica. Zapisnike od 20. listopada sačuvajte. Kako temeljito analizirati zapisnike, piše u vodiču [Analizirati zapisnike web-poslužitelja nakon napada](https://phpsos.de/hr/ratgeber/logfiles-auswerten/).

> **Djelujte odmah:**
> Ako zapisnik pokazuje uspješne pozive nepoznate PHP datoteke, pretpostavite provalu. Osigurajte datoteku i zapisnike, ograničite pristup poslužitelju i provjerite mogu li biti pogođeni osobni podaci.

## Nakon procjene: pravi redoslijed

1. **Osigurati:** Kopirati datoteku s kontrolnim zbrojem i vremenskim žigovima, osigurati zapisnike.
2. **Razjasniti podrijetlo:** Provjeriti obrasce za prijenos, dodatke i razdoblje prije nalaza.
3. **Tražiti daljnje sastavnice:** dodatne datoteke, cron poslove, nove administratorske račune.
4. **Blokirati izvršavanje:** Zabraniti PHP u direktoriju za prijenose na razini web-poslužitelja, kako opisuje članak [Zabraniti izvršavanje PHP-a u direktorijima za prijenose](https://phpsos.de/hr/blog/php-in-uploads-verbieten/).
5. **Očistiti i promijeniti pristupe:** tek tada ukloniti datoteku i obnoviti sve lozinke.

## Kako PHP SOS konkretno pomaže?

- **Procijeniti nalaz:** Provjeravamo datoteku bez izvršavanja i razvrstavamo je.
- **Razjasniti uporabu:** Analiziramo zapisnike i rekonstruiramo tko je i kada pozvao datoteku.
- **Potpuno očistiti:** Uz [uklanjanje zlonamjernog softvera](https://phpsos.de/hr/leistungen/malware-entfernung/) tražimo sve sastavnice, zatvaramo uzrok i mijenjamo pristupe.
- **Spriječiti ponavljanje:** Blokiramo izvršavanje PHP-a u direktorijima za pisanje i nadziremo nove datoteke.


## Česta pitanja

**Je li svaka PHP datoteka u direktoriju za prijenose opasna?**  
Ne svaka. Neki dodaci odlažu praznu index.php kako se sadržaj direktorija ne bi ispisivao. Sve ostalo, osobito datoteke sa sadržajem, neobičnim imenom ili dvostrukim nastavkom, tretirajte kao sumnju.

**Smijem li sumnjivu datoteku otvoriti u pregledniku?**  
Ne. Poziv preko web-stranice izvršava kod. Datoteku čitajte samo kao tekst na poslužitelju ili u kopiji, primjerice naredbom less ili head.

**Kako saznati je li datoteka korištena?**  
Potražite naziv datoteke u pristupnim zapisnicima web-poslužitelja. Zahtjevi sa statusom 200 i metodom POST pokazuju da je datoteka pozvana. Pripadajuće IP adrese i trenuci pomažu u daljnjoj istrazi.

**Je li dovoljno obrisati datoteku i blokirati PHP u direktoriju za prijenose?**  
Oboje je potrebno, ali nije dovoljno. Dodatno razjasnite kako je datoteka tamo dospjela, potražite daljnje sastavnice i promijenite pristupne podatke. Inače se napadač vraća istim putom.

## Izvori

- [OWASP Cheat Sheet Series (među ostalim File Upload)](https://cheatsheetseries.owasp.org/)
- [OWASP Top 10](https://owasp.org/www-project-top-ten/)
- [php.net: sigurnosne objave](https://www.php.net/)
