Nedávno jsem řešil zavirovaný web, který byl prolezlý kousky cizího kódu.
Jak se zavirovaný web (postavený na WordPress) choval? Když přišel na web nový návštěvník, byl přesměrován na stránku typu "vyhráli jste iPhone" atd., ale při druhé návštěvě web již fungoval normálně.
Dále popisuji, jak se mi podařilo infikované soubory najít a odstranit.

Datum poslední změny: 11. 12. 2023
Mrkl jsem jak to vypadá v administraci WP: instalovaná dvě témata, aktivní (samozřejmě) jen jedno, to neaktivní nějaké neznámé. Kupa neaktualizovaných pluginů, některé roky. Zazálohoval jsem databázi a FTP a deaktivoval právě tyhle roky neudržované pluginy. Web dle zběžného proklikání "fachčil". Staré pluginy jsem tedy smazal a přesunul se na FTP.
Své pátrání jsem začal klasicky ve wp-config.php a hned narazil na stopu: na konci souboru mě udeřila do očí přidaná cesta k souboru header.php:
include_once(ABSPATH . WPINC . '/header.php');
Proč header.php? Header by měl být přece v šabloně normálně. Šablony jsou ale běžně uložené ve /wp-content/themes. Ne ve složce /wp-includes (WPINC). Copá v tom souboru teda je?
První tři řádky jsou podezřelé samy o sobě: vypnutí výpisu chyb a definice globální proměnné zeeta:
<?php @ini_set('display_errors', '0');
error_reporting(0);
global $zeeta;

Vida, “chytrá doplňovačka” si to taky myslí. Zkusmo jsem tedy soubor smazal. Web běžel dál. Smazal jsem tedy i řádek z wp-config, kde "spočívala" cesta na header.php.
Prohledal jsem instalaci WordPressu a vydal se po stopách tajemné zeeta.

Tady ještě před smazáním header.php.
Do očí udeří, že zeeta je zavrtaná v šablonách. Nejprve jsem prokrastinoval a smazal složku “nějaké” zálohy. Zase beztrestně (web jel). Šablona Skeleteon nebyla použitá, takže jsem ji na férovku smazal. Kdoby také chtěl schraňovat kostlivce ve WordPressu, že? S aktivním tématem to takhle naneštěstí nejde. Fňuk.
Nainstaloval jsem Wordfence a spustil scan. Našel další prolezlé soubory:
Po smazání souboru netfilter.php se ten všivák do minuty vždy natáhl zpět. Ale naděje umírá poslední! Stále není dořešena infekce v souboru function.php hlavního tématu.
Extrémní řešení (smazání souboru) se samozřejmě nevyplatilo. Z frontendu webu jsem tak udělal "kůlničku na dříví". Nezbylo než se ponořit do kódu.
Při otevření souboru nás s otevřenou náručí vítá nám již známá zeeta a samozřejmě vypnutí chybových hlášek. Ty stejně nikdo nevidí rád.
<?php
@ini_set('display_errors', '0');
error_reporting(0);
global $zeeta;
Chvíli jsem koukal do kódu, jako husa do flašky, až jsem si všiml odlišného coding style mezi začátkem souboru a zbytkem. První část neměla vůbec žádné komentáře, proměnné neměly popisné názvy a navíc mi z kódu vůbec nebylo jasné, o co tam jde. A to by aspoň rámcově u šablony být asi mělo, ne?
Rozhodl jsem se tedy udělal “řez”. Voilà web šlapal. Co víc! Všivák netfilter.php se po smazání už neobjevil a Wordfence už také žádný podežřelý soubor nenalezl.
Přesměrování na frontendu je také pryč. Klient s kolegy jsou happy, that makes me taky happy.
Příště se podíváme na prevenci. Řešíš-li něco podobného a necítíš se na řešení, neváhej mě kontaktovat. Buď tě infekce "zbavím na klíč" nebo se na ni podíváme v rámci konzultace.
Měsíční newsletter pro lidi, kteří chtějí, aby jejich WordPress spolehlivě fungoval.
Dozvíš se:
🔌 Tipy na užitečné pluginy a nástroje.
🆕 Novinky z WordPress světa.
💡 Praktické návody a rady.