WordPress n'est pas peu sûr. Les sites qui l'utilisent sont compromis pour quatre raisons, dans cet ordre de fréquence, et aucune n'est un défaut de WordPress lui-même.

1. Une extension qui n'a pas été mise à jour

De loin la première cause. Une faille est publiée, un scanner trouve en quelques jours tous les sites encore sur l'ancienne version, et le reste se fait tout seul.

  • Activez les mises à jour automatiques pour les extensions auxquelles vous faites confiance.
  • SUPPRIMEZ ce que vous n'utilisez pas. Une extension désactivée reste un fichier que l'on peut atteindre directement.
  • Vérifiez si une extension est abandonnée : « dernière mise à jour il y a 3 ans » est une décision d'arrêter de s'en servir.

2. Un mot de passe utilisé ailleurs

Fuité chez un site sans rapport, puis essayé ici. La double authentification rend la fuite sans effet, et c'est pourquoi elle vaut mieux que n'importe quelle extension.

3. Des fichiers déposés qui s'exécutent

Si un fichier posé dans wp-content/uploads peut tourner comme du PHP, un formulaire de dépôt est une porte d'entrée. Fermez-la au serveur, pas avec une extension.
location ~* /wp-content/uploads/.*\.(php|phtml|phar)$ {
    deny all;
}

4. Modifier des fichiers depuis le tableau de bord

L'éditeur intégré transforme une session d'administration volée en code arbitraire sur votre serveur. Presque personne ne s'en sert délibérément.

define('DISALLOW_FILE_EDIT', true);

Trois autres qui ne coûtent rien

  • Déplacez wp-config.php au-dessus de la racine web, ou interdisez-le explicitement. Il contient le mot de passe de la base.
  • Coupez XML-RPC à moins que quelque chose en ait besoin : c'est une cible courante des attaques par force brute.
  • Masquez la version. Ce n'est pas de la sécurité, mais cela vous retire des recherches de « sites en version X ».
Après toute compromission, changez les sels dans wp-config.php. Cela invalide toutes les sessions, y compris celle de l'attaquant, et c'est l'étape que la plupart des nettoyages oublient.