Krótko: Plik PHP w katalogu uploadu to poważny sygnał ostrzegawczy, ponieważ powinny tam leżeć tylko obrazy i dokumenty. Pliku nigdy nie wolno otwierać w przeglądarce, lecz czytać go jako tekst, sprawdzić znaczniki czasu i właściciela oraz wyszukać nazwę pliku w logach dostępu. Niegroźne są zwykle tylko puste zaślepki, takie jak index.php bez zawartości; wszystko inne proszę traktować jako możliwe włamanie.
Dlaczego PHP nie ma czego szukać w katalogu uploadu
Katalogi uploadu służą treściom, które wgrywają odwiedzający lub redaktorzy: obrazom, plikom PDF, filmom. Użytkownik serwera WWW może tam zapisywać, inaczej uploady by nie działały. Właśnie to czyni te katalogi atrakcyjnymi dla atakujących. Kto przez lukę może zapisywać pliki, umieszcza je tam, gdzie zapis jest dozwolony.
Nowe pliki PHP w katalogach uploadu lub cache należą według znanych nam doniesień do ogólnych sygnałów ostrzegawczych po włamaniu. Dla PHP2Shell nie ma potwierdzonych wskaźników kompromitacji (Indicators of Compromise); znalezisko nic więc nie mówi o tym, przez jaką lukę plik się pojawił. Jak bezpiecznie budować funkcje uploadu, opisuje Bezpieczna realizacja uploadu plików w PHP.
To, czy taki plik może wyrządzić szkodę, rozstrzyga konfiguracja serwera WWW. Jeśli wykonuje on pliki PHP w katalogu uploadu, każdy zapisany tam plik staje się możliwym zdalnym sterowaniem. Jeśli wykonywanie jest tam zablokowane, plik pozostaje ciałem obcym, ale początkowo bez skutku. Wiele instalacji nigdy nie wprowadziło tej blokady.
Jak plik PHP trafia do katalogu uploadu?
Przy ocenie pomaga znajomość możliwych dróg. Każda prowadzi do innych pytań następczych.
| Droga | Typowe tło | Pytanie następcze |
|---|---|---|
| Niebezpieczny formularz uploadu | kontrola tylko rozszerzenia lub typu zgłoszonego przez przeglądarkę | Które formularze przyjmują pliki? |
| Luka we wtyczce lub motywie | znana podatność w przestarzałym rozszerzeniu | Które rozszerzenia są przestarzałe? |
| Skradzione dane dostępowe | konto administratora, FTP lub hostingu | Jakie były ostatnie logowania? |
| Wykonanie kodu przez lukę | np. w interpreterze, jak możliwe przy PHP2Shell | Czy PHP było w tym czasie podatne? |
| Uzasadniona wtyczka | zaślepka, rzadko pliki cache | Czy plik należy do oryginalnego pakietu? |
Kilka dróg może się nałożyć. Atakujący, który przez lukę wykonuje kod, może umieścić plik tylko po to, by później wygodniej wrócić.
Systematyczne wypisanie miejsc znalezisk
Zanim ocenią Państwo pojedynczy plik, proszę uzyskać przegląd. Polecenia tylko odczytują dane. Ścieżki są przykładami dla WordPress; w innych systemach proszę dostosować ścieżkę uploadu.
# Pliki podobne do PHP w katalogu uploadu z rozmiarem, właścicielem, 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'
# Określić typ pliku według zawartości, a nie rozszerzenia (obrazy z zawartością PHP rzucają się w oczy)
find /var/www/html/wp-content/uploads -type f -newermt "2026-10-17" -exec file {} + | grep -viE "image|pdf|video|audio"
Inne systemy używają innych katalogów zapisu, na przykład fileadmin w TYPO3, images w Joomla lub folder mediów pod public w Shopware 6. Dochodzą katalogi cache i tymczasowe aplikacji. W instalacjach multisite i przy kilku stronach na jednym serwerze jest odpowiednio wiele katalogów uploadu; każdy należy do wyszukiwania.
Podejrzane są także pliki .htaccess i .user.ini w katalogu uploadu. Za ich pomocą można w tym katalogu ponownie włączyć wykonywanie PHP lub zmienić konfigurację.
Plik PHP w katalogu uploads: prawidłowa ocena znaleziska
Nie każde trafienie jest równie poważne. Poniższa klasyfikacja pomaga w pierwszej ocenie. Nie zastępuje dokładnego badania.
| Ustalenie | Pierwsza klasyfikacja |
|---|---|
index.php z zerem bajtów lub tylko komentarzem |
zwykle zaślepka przeciw wyświetlaniu zawartości katalogu, porównać z wtyczką |
| Plik PHP z zawartością w folderze miesięcznym | wysokie podejrzenie |
Podwójne rozszerzenie, jak bild.jpg.php lub .php.png |
wysokie podejrzenie, typowe maskowanie |
Obraz, który według file zawiera kod PHP |
wysokie podejrzenie, może zostać wykonany przez dołączenie |
.htaccess lub .user.ini w katalogu uploadu |
podejrzenie, sprawdzić konfigurację |
| Plik należy do użytkownika serwera WWW, ctime po 17.10. | pasuje do włamania przez stronę |
Podejrzane pliki proszę czytać wyłącznie jako tekst, na przykład head -c 2000 datei.php lub less. Rzucają się w oczy bardzo długie wiersze, zakodowane ciągi znaków i nazwy funkcji takie jak eval czy base64_decode. Jak rozpoznać zaciemniony kod, pokazuje Rozpoznawanie zaciemnionego kodu PHP.
Czy plik został wywołany? Spojrzenie do logu
Najważniejsze pytanie po znalezisku brzmi: czy ktoś użył pliku? Odpowiedź leży w logach dostępu serwera WWW. Proszę szukać nazwy pliku, także w logach archiwalnych.
# Wywołania podejrzanego pliku w aktualnych i spakowanych logach (nazwa jako przykład)
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
# Tylko udane wywołania z adresem IP i momentem
grep -h "uploads/2026/10/thumb.php" /var/log/nginx/access.log* | awk '$9 == 200 {print $1, $4, $6, $7}'
Wiele udanych żądań POST z kilku adresów wskazuje na aktywne użycie jako webshell. Brak trafień nie oznacza automatycznie odwołania alarmu, ponieważ logi mogą być rotowane, usunięte lub niekompletne. Jeśli strona działa za CDN lub proxy, dalsze protokoły leżą tam; w hostingu współdzielonym dostawca hostingu udostępnia logi dostępu zwykle w panelu klienta. Proszę też zwrócić uwagę na żądania do innych nowych plików z tych samych adresów, ponieważ często prowadzą do dalszych składników. Logi od 20 października proszę zachować. Jak dokładnie analizować logi, opisuje poradnik Analiza logów serwera WWW po ataku.
Jeśli log pokazuje udane wywołania nieznanego pliku PHP, proszę zakładać włamanie. Zabezpieczyć plik i logi, ograniczyć dostęp do serwera i sprawdzić, czy mogą być dotknięte dane osobowe.
Po ocenie: właściwa kolejność
- Zabezpieczyć: Skopiować plik z sumą kontrolną i znacznikami czasu, zabezpieczyć logi.
- Wyjaśnić pochodzenie: Sprawdzić formularze uploadu, wtyczki i okres przed znalezieniem.
- Szukać dalszych składników: dodatkowe pliki, zadania cron, nowe konta administratorów.
- Zablokować wykonywanie: Zakazać PHP w katalogu uploadu na poziomie serwera WWW, jak opisano w artykule Zakaz wykonywania PHP w katalogach uploadu.
- Oczyścić i zmienić dostępy: dopiero wtedy usunąć plik i odnowić wszystkie hasła.
Jak konkretnie pomaga PHP SOS?
- Ocenić znalezisko: Sprawdzamy plik bez jego wykonywania i go klasyfikujemy.
- Wyjaśnić użycie: Analizujemy logi i odtwarzamy, kto i kiedy wywołał plik.
- Oczyścić w pełni: W ramach usuwania złośliwego oprogramowania szukamy wszystkich składników, zamykamy przyczynę i zmieniamy dostępy.
- Zapobiec powtórce: Blokujemy wykonywanie PHP w katalogach zapisu i monitorujemy nowe pliki.
Częste pytania
Czy każdy plik PHP w katalogu uploadu jest niebezpieczny?
Nie każdy. Niektóre wtyczki zapisują pusty index.php, aby zawartość katalogu nie była wyświetlana. Wszystko inne, zwłaszcza pliki z zawartością, nietypową nazwą lub podwójnym rozszerzeniem, należy traktować jako przypadek podejrzany.
Czy mogę otworzyć podejrzany plik w przeglądarce?
Nie. Wywołanie przez stronę wykonuje kod. Plik proszę czytać wyłącznie jako tekst na serwerze lub w kopii, na przykład poleceniem less lub head.
Jak sprawdzić, czy plik był używany?
Proszę wyszukać nazwę pliku w logach dostępu serwera WWW. Żądania ze statusem 200 i metodą POST pokazują, że plik został wywołany. Powiązane adresy IP i momenty pomagają w dalszym badaniu.
Czy wystarczy usunąć plik i zablokować PHP w katalogu uploadu?
Jedno i drugie jest konieczne, ale niewystarczające. Dodatkowo trzeba wyjaśnić, jak plik tam trafił, poszukać dalszych składników i zmienić dane dostępowe. W przeciwnym razie atakujący wróci tą samą drogą.