Zoznam používateľov WordPressu je verejne dostupný

Čo to je

Endpoint /wp-json/wp/v2/users vracia zoznam všetkých autorov webu — vrátane user_login. Teda presne toho, čo potrebujete na prihlasovacej obrazovke. Navyše aj /?author=1 sa presmeruje na URL obsahujúcu meno autora.

WordPress to robí zámerne — REST API má verejne vystavovať autorov, aby šablóny vedeli, kto článok napísal. Predvolené nastavenie však ukazuje aj username, nie len meno.

Prečo je to problém

Brute-force útok na WordPress má dve polovice: uhádnuť username a uhádnuť heslo. /wp-json/wp/v2/users dá útočníkovi rovno prvú polovicu. Útočník už nehľadá admin, root alebo info, ale rovno cielene útočí na vaše skutočné účty.

Ak máte aktívne XML-RPC alebo nemáte rate-limit na /wp-login.php, je táto dvojica (user enum + brute-force) realistický útok v priebehu niekoľkých hodín.

Ako to opraviť

Krok 1 — zakázať REST API users endpoint

Do functions.php alebo do site-specific pluginu:

add_filter('rest_endpoints', function ($endpoints) {
    if (isset($endpoints['/wp/v2/users'])) {
        unset($endpoints['/wp/v2/users']);
    }
    if (isset($endpoints['/wp/v2/users/(?P<id>[\d]+)'])) {
        unset($endpoints['/wp/v2/users/(?P<id>[\d]+)']);
    }
    return $endpoints;
});

Krok 2 — zablokovať ?author=N redirect

add_action('template_redirect', function () {
    if (isset($_GET['author']) && !current_user_can('edit_posts')) {
        wp_redirect(home_url(), 301);
        exit;
    }
});

Krok 3 — oddeliť display name od username

Keď už user enum nejako unikne (cache, theme, plugin), nemalo by user_nicename byť totožné s user_login. V administrácii jednotlivých používateľov:

Username vo WordPresse nemožno po vytvorení meniť cez UI. Ak máte admina s menom admin, vytvorte si nového admina, priraďte mu všetky príspevky a starého admin zmažte (WP pri mazaní ponúkne „previesť príspevky“).

Plugin alternatíva

WPS Hide Login + Stop User Enumeration riešia oboje na dve kliknutia.

Referencie