Skaner plików – złośliwy kod na stronie wykryty w ciągu godzin

Co 6 godzin sprawdzamy pliki każdego konta hostingowego – szukamy backdoorów, webshelli i podmienionych skryptów. Gdy coś znajdziemy, widzisz to w panelu z nazwą zagrożenia, ścieżką pliku i wskazówką, co zrobić.

Skan co 6 godzinWordPress, Joomla, PrestaShop, MagentoJawna lista regułW cenie hostingu

Co daje Ci skaner plików

Włamanie widzisz pierwszy

Webshell, backdoor ukryty w obrazku czy podmieniony .htaccess pojawia się w panelu po najbliższym skanie – nie po skardze klienta czy ostrzeżeniu w Google.

Infekcja go nie oszuka

Skaner działa na serwerze, poza kontenerem Twojego konta. Zainfekowana strona go nie widzi, nie wyłączy go i nie ukryje przed nim plików.

Zna Twój CMS

Rozpoznaje układ katalogów WordPressa, Joomli, PrestaShop i Magento – wie, gdzie kod ma prawo być, a gdzie nie, więc zgłasza mniej fałszywych alarmów.

Najpierw to, co pilne

Plik dostępny z internetu – a zwłaszcza taki, który ktoś właśnie wywołuje – trafia na górę listy. Powiadamiamy Cię tylko o sprawach, które wymagają działania.

Przegląd jednym kliknięciem

Nie wiesz, co zrobić ze znaleziskiem? Jednym kliknięciem w panelu prosisz nasz zespół, żeby przejrzał plik.

Bez wtyczek i konfiguracji

Niczego nie instalujesz i nic nie ustawiasz. Skaner działa po stronie serwera i nie zmienia kodu Twojej strony.

Jak działa skaner plików

Przy pierwszym skanie skaner zapisuje stan każdego pliku na koncie, a przy kolejnych czyta tylko to, co się zmieniło: nowe i zmienione skrypty PHP, pliki .htaccess, dowiązania oraz pliki o „niewinnym” rozszerzeniu, w których ktoś ukrył kod – na przykład obrazek w katalogu uploads, który w środku jest skryptem.

Każde znalezisko dostaje jedną z dwóch ocen. Zagrożenie to plik, który reguła jednoznacznie rozpoznaje jako złośliwy. Plik podejrzany wygląda jak technika włamywaczy, ale bywa też w zwykłym kodzie – warto go sprawdzić. Do tego dochodzi pytanie, czy plik jest dostępny z internetu. Z obu odpowiedzi powstają trzy statusy w panelu: wymaga działania (wtedy wysyłamy powiadomienie), do sprawdzenia i w porządku.

Skaner na serwerze czy wtyczka bezpieczeństwa?

Wtyczka bezpieczeństwa w WordPressie działa wewnątrz strony, którą ma chronić. Kto przejmie stronę, może ją wyłączyć albo podsunąć jej czyste pliki. Skaner hostingu działa poza Twoim kontem i ogląda pliki bezpośrednio na dysku, więc złośliwy kod nie ma na niego wpływu. Wtyczki nie musisz usuwać – oba rozwiązania się uzupełniają.

Czego szukamy – pełna lista reguł

To jest cała lista. Nie mamy ukrytych reguł – „w porządku” znaczy, że żadna z nich niczego nie znalazła.

Reguły 2026-10-08.3 · każde konto co 6 godzin · 20 reguł, 6 klas pomijanych

Zagrożenia — nazywamy, co znaleźliśmy

Myli się tylko wtedy, gdy zrobiłeś to celowo. Na stronie widocznej z sieci — powiadamiamy.

Skrypt PHP w katalogu z plikami
Plik .php pod wp-content/uploads (zagrożenie; pod uploads/cache i w katalogach, które pluginy trzymają tam dla siebie — redux, aios, sucuri, fusion-builder, tcpdf_fonts — podejrzane) albo w katalogu images/img/media/files/upload/download instalacji (podejrzane). CMS-y nie zapisują tam kodu; atakujący wgrywają go przez formularze. Katalog liczy się względem najbliższej instalacji: WordPress, Joomla, PrestaShop czy projekt Composera wgrany pod images/ jest oceniany jako instalacja, nie jako upload. Zaślepki index.php (pusty plik, komentarz, header()+exit) są pomijane.
Kod PHP w pliku o innym rozszerzeniu
Plik .ico, .jpg, .png itp. zawierający znacznik <?php (zagrożenie): taki plik jest dołączany przez inny skrypt (include), żeby nie rzucać się w oczy. Kopia skryptu (.bak/.old/.suspected/.php_/.php~) albo plik bez rozszerzenia z kodem PHP to podejrzane. Plik tekstowy, dokumentacja, szablon czy fixture testowy (.txt/.md/.html/.tpl/.twig/.stub/.dist/.fixed/.ini/.po…) z kodem PHP to nic — serwer go nie wykonuje, a dokumentacja PHP zawiera PHP; taki plik jest mimo to czytany przez sygnatury. Pliki w katalogach cache i archiwa są pomijane. Znacznik liczy się, gdy po nim idzie tekst — przypadkowe „<?=” w danych obrazka nie.
.htaccess wykonuje inne rozszerzenia jako PHP
AddHandler/AddType/SetHandler mapujący .ico/.jpg/.txt/.html/.js itp. na PHP. Plik z Options -ExecCGI obok to blokada wykonywania w katalogu uploads, nie znalezisko.
auto_prepend_file / auto_append_file
php_value auto_prepend_file w .htaccess albo auto_prepend_file w .user.ini: wskazany plik wykonuje się przed każdym skryptem strony. Znane stuby firewalli wtyczek (wordfence-waf.php, aios-bootstrap.php) są podejrzane.
.htaccess serwuje PHP jako tekst
AddType text/plain .php, RemoveHandler .php albo SetHandler default-handler, zwykle z Options +FollowSymLinks: przeglądarka dostaje źródło plików konfiguracyjnych zamiast wyniku. Tak wyglądał config grabber na ht7121. Liczy się tylko w katalogu, w którym leży jakiś plik .php — w katalogu uploads bez skryptów to blokada wykonywania.
Zbiór skopiowanych plików konfiguracyjnych
Katalog z co najmniej 10 plikami *config*.txt / *configuration*.txt / *wp-config*.txt: zebrane cudze pliki konfiguracyjne z hasłami.
Znany webshell
Nazwy i napisy znanych rodzin webshelli: c99, r57, WSO, b374k, FilesMan, IndoXploit, Alfa, p0wny, weevely, AnonymousFox — jako całe słowa; zbiór reguł Wordfence (wp-content/wflogs) jest pomijany.
Zmieniony plik rdzenia WordPressa
Plik w wp-admin/, wp-includes/ albo w katalogu głównym instalacji ma inną sumę kontrolną niż ta, którą wordpress.org publikuje dla zainstalowanej wersji (en_US i pl_PL). Plik identyczny z plikiem innego wydania WordPressa (niedokończona aktualizacja) to podejrzane.
Obcy plik w rdzeniu WordPressa
Skrypt w wp-admin/ lub wp-includes/, którego wordpress.org nie wysyła w tej wersji (zagrożenie); w katalogu głównym instalacji — podejrzane, bo klienci kładą tam własne pliki. Plik identyczny z plikiem innego wydania WordPressa to podejrzane.
Sygnatura YARA
Plik pasuje do reguły YARA z paczki sygnatur na serwerze — wzorce znanych rodzin webshelli i backdoorów. Źródła reguł są wymienione niżej, każde z liczbą reguł i licencją; szczegół znaleziska podaje źródło i nazwę reguły. Reguła, której autor nadał niski score, i reguły generyczne wymienione w źródle jako słabe (duże pliki z dynamicznymi wywołaniami, callbacki) są tylko podejrzane, chyba że trafi też reguła konkretna.
Sygnatury webshelli: signature-base (Nextron Systems)
Publiczny zbiór reguł YARA Floriana Rotha i Arnima Ruppa — część o webshellach: generyczne wzorce PHP/ASP/JSP (eval danych z żądania, zaciemnione ładunki, kod w obrazku), rodziny c99/r57/WSO/b374k/China Chopper/p0wny, zestawy chińskich pentesterów, backdoor w php_zlib. Reguły oceniane przez autorów score poniżej 70 oznaczamy jako podejrzane. 819 reguł z https://github.com/Neo23x0/signature-base@94a1c48d, licencja DRL 1.1.
Reguły własne
Wzorce z tego, co znajdujemy na własnej flocie, a czego publiczne zbiory nie opisują — na dziś strony-wrota SEO (inna treść dla robota wyszukiwarki niż dla człowieka). 1 reguł, licencja proprietary.

Podejrzane — wyglądają jak technika włamywaczy

Bywają też w zwykłym kodzie, więc są na liście do sprawdzenia — powiadamiamy dopiero, gdy ktoś taki plik wywołuje.

Przekierowanie zależne od User-Agent
RewriteCond na HTTP_USER_AGENT (googlebot/bing/yahoo) z RewriteRule na zewnętrzny adres: wyszukiwarki widzą inną treść niż ludzie (SEO spam, pharma hack).
Dowiązanie poza katalog konta
Dowiązanie symboliczne wskazujące poza katalog domowy konta. W kontenerze nie sięga innych klientów, ale jest klasycznym narzędziem config grabbera. Dowiązanie do gniazda (socket PostgreSQL/MySQL) to nic.
Zaciemniony kod PHP
eval(base64_decode(…)), gzinflate/str_rot13 w eval, assert() lub funkcja wołana z $_POST/$_GET — albo dwa słabsze sygnały naraz: preg_replace z modyfikatorem /e, create_function, łańcuchy chr()/\x.., długi blok base64. Sam create_function czy łańcuch \x.. to stary, uczciwy kod. Legalny kod też bywa tak pisany (licencjonowane pluginy, ioncube), stąd tylko podejrzane.
Archiwum lub zrzut bazy w katalogu strony
Plik .sql/.zip/.tar.gz/.rar powyżej 1 MiB w katalogu serwowanym przez WWW: kopia zapasowa z hasłami, którą może pobrać każdy, kto zgadnie nazwę. Katalog z co najmniej 5 archiwami, których nazwy nie mówią „kopia” (pliki do pobrania, zrzuty z kamery), to magazyn danych, nie kopia strony — nic.
Plugin WordPress bez readme
Katalog w wp-content/plugins z jednym–dwoma plikami PHP, bez readme.txt i bez podkatalogów: tak wyglądają backdoory udające pluginy (podejrzane; plugin o losowej nazwie z samych liter i cyfr — zagrożenie). Pluginy pisane ręcznie też tak wyglądają; plugin premium ma podkatalogi.
Zmieniony plik pluginu
Plik pluginu z wordpress.org różni się od opublikowanej wersji. Zdarza się przy ręcznych poprawkach, stąd podejrzane. Gdy różni się ponad 30% plików pluginu, to wersja premium albo fork pod tą samą nazwą — jedno podejrzane na katalog pluginu, bez porównania plik po pliku.
Dodany plik w pluginie
Skrypt w katalogu pluginu z wordpress.org, którego ta wersja pluginu nie zawiera.
Nowy plik w mu-plugins
Skrypt bezpośrednio w wp-content/mu-plugins — ładowany zawsze, niewidoczny na liście pluginów do wyłączenia. Znane loadery (Installatron, WP Migrate DB, Elementor safe mode, Akeeba, AIOS) to nic; plik nazwany jak rdzeń WordPressa (class-wp-…) albo z losowym przyrostkiem szesnastkowym (wp-cache-handler-3d7d1a7f.php) to zagrożenie.

Czego nie czytamy

Klasy plików pominięte świadomie — i te skanowane, ale bez raportowania zmian, bo regenerują się same.

Pliki sesji nieczytane
Sesje PHP i frameworków: dane tymczasowe, nie kod. Zmieniają się przy każdym wejściu na stronę.
Logi nieczytane
Pliki dziennika rosną ciągle i nie są wykonywane.
Repozytoria git/svn nieczytane
Skompresowane obiekty repozytorium, nieczytelne dla sygnatur i nie serwowane.
Miniatury WordPress nieczytane
Kopie obrazów w rozmiarach -800x600 itd. pod wp-content/uploads; generowane przez WordPress.
Cache frameworków ciche
Katalogi cache WordPress/Laravel/Symfony/Magento/Joomla/Smarty, także przemianowane (var/@cache, var/1cache — tak PrestaShop wymusza przebudowę): skanowane, ale ich zmiany nie są raportowane — regenerują się same.
node_modules ciche
Zależności npm: tysiące plików wymienianych hurtowo przy każdej instalacji; skanowane, zmiany nie raportowane.

Czym skaner nie jest

Nie jest antywirusem i nie jest tak sprzedawany: sprawdza pliki według tej listy i pomija to, czego nie czyta — też jawnie. Pusta lista znaczy „nic z tej listy”, nie „czysto”. Nie zastępuje kopii zapasowych ani aktualizacji, a podatnej wersji CMS nie aktualizuje sam — zgłasza ją.

Skaner plików jest w każdym planie hostingu

Wynik ostatniego skanu i każde znalezisko znajdziesz w panelu, w zakładce „Skaner plików” swojej usługi.

Zobacz plany hostingu