Přehled a zadání
Bezpečnostní test firemního webu, e-shopu a hlavního serveru pro Ukázková firma s.r.o. Tato stránka shrnuje zadání, rozsah, pravidla testu a hlavní cesty útoku. Detailní nálezy jsou na záložce Nálezy, technický otisk cílů na Mapa cíle a náprava na Zabezpečení.
Zadání
Rozsah
Pravidla testu
- Black-box zvenčí (pohled útočníka z internetu), bez přihlašovacích údajů.
- Throttling na produkci — e-shop běží, žádné zátěžové testy.
- Testy z jedné ohlášené IP; hesla a účty se brute-forcem netestují.
- Pasivní indicie se ověřují — buď potvrdí, nebo vyvrátí.
Cesta 1 · známé jméno + otevřený login
nejpříměji zneužitelná — heslo jsme záměrně nezkoušeli/wp-json/wp/v2/users vrací nepřihlášeným jméno účtu „admin" — výchozí, nejhádanější.Cesta 2 · zastaralý plugin slideru
podmíněný řetěz — jen s účtem Contributor+Takhle vypadá výsledek každého testu.
Pracovní kniha je pro toho, kdo bude opravovat. K ní dostanete manažerské PDF pro vedení — co test ukázal a co se má opravit první, bez žargonu.
Nálezy
Živý pracovní přehled nálezů. Průběžně se plní během testu: stav každého nálezu, důkazy z nástrojů a doporučená náprava. Pasivní indicie z prvotní analýzy jsou označené jako neověřené, dokud je test nepotvrdí nebo nevyvrátí.
ukazkova-firma.cz
eshop.ukazkova-firma.cz
server 203.0.113.10
Plugin slideru běží ve verzi 6.7.1, oprava vyšla v 6.7.3. Zneužití vyžaduje účet s právem přispěvatele — řetěz je tedy podmíněný. Po získání účtu vede k přečtení libovolného souboru na webu včetně wp-config.php.
Přístupové údaje k databázi → obsah, uživatelé, hashe hesel. Server je sdílený s e-shopem, takže dosah je i na objednávky a zákaznická data.
Aktualizovat plugin (placený plugin potřebuje purchase code — doplnit), do té doby vypnout. Ověřit, že registrace uživatelů je zavřená a žádný účet Contributor+ nemá slabé heslo.
wpscan --plugins-version-detection aggressive [!] slider-plugin · verze 6.7.1 · Latest: 6.7.3 | Title: Authenticated (Contributor+) Arbitrary File Read | Fixed in: 6.7.3
Endpoint /wp-json/wp/v2/users je dostupný nepřihlášeným a vrací účet „admin". wp-login.php odpovídá 200 bez omezení počtu pokusů a bez druhého faktoru.
Útočník zná polovinu přihlášení. Zbytek je otázka slovníku a času — a bez limitu pokusů ho má neomezeně. Toto je nejpříměji zneužitelná cesta v celém testu.
Přejmenovat účet, zapnout 2FA, limit pokusů, skrýt user-enum (REST i ?author=) pro nepřihlášené. Ideálně wp-login za allowlist IP.
GET /wp-json/wp/v2/users → 200 [{"id":1,"slug":"admin",…}]
GET /wp-login.php → 200 (bez rate-limitu, bez 2FA)
GET /?author=1 → 301 → /author/admin/
Port 21 je otevřený a server nabízí pouze plaintext přihlášení (AUTH TLS nenabízeno). Kdokoliv na cestě — typicky veřejná Wi-Fi — může heslo odposlechnout.
FTP účet má zápis do webrootu obou webů. Odposlechnuté heslo = nahrání libovolného kódu bez nutnosti prolomit WordPress.
FTP vypnout a nahradit SFTP (jede přes SSH, který už je zabezpečený). Pokud FTP musí zůstat: vynutit FTPS a omezit port 21 na allowlist IP.
nmap -sV 203.0.113.10 21/tcp open ftp vsftpd 3.0.x (AUTH TLS nenabízeno) 22/tcp filtered ssh (geo-blok + fail2ban ✓) 80/tcp open http nginx 443/tcp open https nginx
/wp-content/uploads/wc-logs/ vrací výpis adresáře. Soubory logů obsahují e-maily zákazníků, ID objednávek a chybové hlášky platební brány.
Únik osobních údajů zákazníků bez jakéhokoli přihlášení — potenciálně incident dle GDPR s ohlašovací povinností.
V nginx zakázat listing (autoindex off) a přístup k wc-logs/ úplně zablokovat; logy přesunout mimo webroot. Zkontrolovat, zda už někdo soubory nestáhl (access log).
GET /wp-content/uploads/wc-logs/ → 200 "Index of /wp-content/uploads/wc-logs/" fatal-errors-2026-08-14-….log 41 kB payment-gateway-2026-08-….log 112 kB (obsahuje e-maily, order_id)
Jádro e-shopu je o jednu hlavní verzi zpozadu (6.8.x vs. aktuální 7.0). Prezentační web má 7.0 — aktualizace se tedy dělá, jen ne na obou webech stejně.
Veřejně známé opravené chyby zůstávají na e-shopu otevřené. Samy o sobě dnes nedávají přímý průnik, ale snižují odolnost celého řetězu.
Aktualizovat jádro, zapnout automatické aktualizace menších verzí. Před aktualizací záloha a test na staging — e-shop má platební bránu.
wpscan --url https://eshop.ukazkova-firma.cz [+] WordPress version 6.8.x identified (Outdated) | Found By: Rss Generator (Passive Detection)
Odpověď obsahuje jen X-Content-Type-Options. Chybí HSTS, Content-Security-Policy, X-Frame-Options a Referrer-Policy.
Možný clickjacking, bez ochrany při prvním připojení (downgrade na HTTP), únik referreru na třetí strany.
Doplnit hlavičky v nginx (add_header). HSTS zapnout až po ověření, že vše jede přes HTTPS; CSP nasadit nejdřív v report-only.
curl -sI https://ukazkova-firma.cz | grep -iE 'strict|content-security|x-frame|referrer' (prázdné) x-content-type-options: nosniff
Téma načítá jQuery 2.2.4 vedle jádrové 3.7.1. Starší verze má známé XSS chyby v manipulaci s HTML.
Zneužitelné jen v kombinaci s místem, kde se uživatelský vstup vkládá do stránky — v testu takové nenalezeno. Proto nízká.
Odstranit načítání 2.2.4, dohledat, který plugin či téma ji tahá, sjednotit na jednu aktuální verzi.
/wp-content/plugins/*/readme.txt je dostupné a prozrazuje přesné verze všech pluginů.
Útočník nemusí hádat — přesně ví, na které CVE mířit. Samo o sobě není díra, ale zkracuje cestu k ní.
V nginx zakázat přístup k readme.txt, changelog.txt a license.txt v adresáři pluginů.
Cesta k assetu naznačuje starší verzi knihovny karuselu, ale soubor je minifikovaný a verze v něm chybí. Zvenčí se nedá potvrdit ani vyvrátit.
Pokud je verze skutečně stará: XSS přes atributy slidů. Pokud ne: nic. Proto nálezu držíme nízkou závažnost a stav neověřeno.
Ověřit verzi v administraci (nebo přes SSH). Když je stará → aktualizovat; když ne → nález vyvrátit. Neopravovat naslepo.
Prvotní skener označil xmlrpc.php jako dostupný. Aktivní test vrací 403 na úrovni nginx.
Endpoint je blokovaný. Zesílení brute-force přes pingback není možné — nález vyřazen. Nic se neopravuje naslepo.
POST /xmlrpc.php → 403 Forbidden (nginx)
SSH je z veřejného internetu filtrované (geo-blok) a chráněné fail2banem. TLS jen 1.2/1.3, forward secrecy, AEAD šifry, platný certifikát.
Doklad dobře nastaveného přístupu k serveru a transportní vrstvy. Do reportu patří i to, co je v pořádku — jinak se z něj nedá poznat, co má klient bránit a co má hotové.
testssl.sh ukazkova-firma.cz TLS 1.2 ✓ TLS 1.3 ✓ TLS 1.0/1.1 ✗ Overall Grade: A+ nmap -p22 203.0.113.10 → filtered
Mapa cíle
Přehled všeho, co jsme o cílech zjistili — infrastruktura, technologický otisk každého webu, odhalené endpointy a úniky. Slouží jako referenční mapa pro toho, kdo bude opravovat: ví přesně, co útočník vidí zvenčí.
ukazkova-firma.cz
eshop.ukazkova-firma.cz
server 203.0.113.10
Zabezpečení a doporučení
Nejdřív konkrétní kroky vycházející z tohoto testu (seřazené podle priority), pak obecná doporučení k zabezpečení WordPressu a serveru, která platí napříč. Priorita se řídí závažností a tím, jak přímo je nález zneužitelný.
↻Aktualizace a komponenty
- Zapnout automatické aktualizace jádra i pluginů (menší verze automaticky).
- Placené pluginy potřebují purchase code, jinak se neaktualizují — doplnit.
- Odstranit nepoužívané pluginy a témata (menší útočná plocha).
- Sledovat CVE u nasazených komponent.
⚷Autentizace a účty
- Nepoužívat výchozí jméno „admin"; přejmenovat privilegované účty.
- Vynutit 2FA a silná hesla u všech administrátorů a editorů.
- Limit přihlašovacích pokusů (proti brute-force).
- Skrýt REST user-enum i ?author= pro nepřihlášené.
⛆Síť a přístup
- Blokovat xmlrpc.php, pokud není potřeba (hotovo).
- wp-login chránit — IP allowlist / basic-auth / 2FA.
- Žádný plaintext protokol na veřejné IP (FTP, telnet, HTTP bez přesměrování).
- Administrativní služby držet za VPN, ne na veřejné IP.
☍Hlavičky, TLS a data
- HSTS, CSP, X-Frame-Options, Referrer-Policy, Permissions-Policy.
- Logy a zálohy nikdy ve webrootu; directory listing vypnutý globálně.
- Cookies Secure / HttpOnly / SameSite.
- Externí skripty připnout na verzi (SRI), ideálně self-host.
Postup 2026
Co dnes považujeme za rozumné minimum pro firemní WordPress a vlastní server. Není to seznam všeho možného — je to pořadí, ve kterém se to má dělat, aby každý krok dával smysl i bez těch dalších.
▤Web (WordPress)
- Aktualizace automaticky — jádro, pluginy, témata; k tomu sledování CVE u nasazených komponent.
- Phishing-odolná MFA / passkeys pro všechny admin a editory. Žádné výchozí jméno „admin".
- Ztvrdit přihlášení — limit pokusů, wp-login za allowlist/2FA, vypnout user-enum, blokovat xmlrpc.
- Bezpečnostní hlavičky — HSTS (preload), CSP, X-Frame-Options, Referrer-Policy, Permissions-Policy.
- Dodavatelský řetězec — externí skripty připnout na verzi + SRI; cookies Secure/HttpOnly/SameSite.
- Minimalizace — odstranit nepoužívané pluginy/témata, nejmenší oprávnění, rotace klíčů a hesel.
⛆Server
- Zero-trust přístup — SSH jen klíčem + MFA, geo-blok/allowlist; admin služby (DB, panel, monitoring) jen za VPN.
- Automatické bezpečnostní aktualizace OS a služeb; pravidelný restart, když to jádro vyžaduje.
- Firewall jako výchozí zamítnutí — otevřené jen 80/443 a to, co má důvod; žádný plaintext protokol.
- Oddělení — každý web vlastní PHP-FPM pool a DB uživatel; kompromitace jednoho nesmí být kompromitací všech.
- Zálohy mimo stroj a jednou za čas zkouška obnovy. Záloha, která se nikdy neobnovila, není záloha.
- Logy a alerting — fail2ban, centralizované logy, upozornění na neobvyklé přihlášení.
| Cíl | Odhad času & náročnosti | Realistická hlavní cesta | Vektory (odhad) | Klíčová pojistka / slabina |
|---|---|---|---|---|
| ukazkova-firma.cz | Střední hodiny–dny (dle hesla) |
Hádání hesla na otevřený wp-login se známým jménem „admin". | ~ 20–40 cílených | otevřený login + výchozí jméno; xmlrpc blokované, TLS A+. |
| eshop.ukazkova-firma.cz | Střední dny |
Přes prezentační web (sdílený server), nebo únik dat z veřejných logů bez průniku. | ~ 10–20 cílených | listing wc-logs = únik bez průniku; jádro zpozadu. |
| 203.0.113.10 | Vysoká dny+ |
Jen přes přihlašovací údaje (odposlech FTP) nebo webshell z jednoho z webů. | ~ 5–10 cílených | SSH filtrované + fail2ban, DB zavřená; slabina = plaintext FTP. |
Chcete tohle pro svůj web a server?
Pentest veřejné strany + hlavního serveru za 20 000 Kč bez DPH, do 5 pracovních dní, retest v ceně. Nebo nejdřív sken webu za 5 000 Kč, ať víte, jestli má smysl jít dál.