WordPress no es inseguro. Los sitios que lo usan se ven comprometidos por cuatro razones, en este orden de frecuencia, y ninguna es un fallo del propio WordPress.

1. Un plugin que no se actualizó

Con diferencia, la causa mayor. Se publica una vulnerabilidad, un escáner encuentra en días todos los sitios que siguen con la versión vieja, y lo demás es automático.

  • Active las actualizaciones automáticas de los plugins en los que confía.
  • BORRE lo que no use. Un plugin desactivado sigue siendo un archivo al que se puede llegar directamente.
  • Mire si un plugin está abandonado: «última actualización hace 3 años» es una decisión de dejar de usarlo.

2. Una contraseña usada en otro sitio

Se filtró en un sitio sin relación y aquí la probaron. El doble factor deja la filtración sin efecto, y por eso vale más que cualquier plugin.

3. Subidas que se ejecutan

Si un archivo puesto en wp-content/uploads puede ejecutarse como PHP, un formulario de subida es una puerta de entrada. Ciérrela en el servidor, no con un plugin.
location ~* /wp-content/uploads/.*\.(php|phtml|phar)$ {
    deny all;
}

4. Editar archivos desde el escritorio

El editor incorporado convierte una sesión de administrador robada en código a voluntad dentro de su servidor. Casi nadie lo usa a propósito.

define('DISALLOW_FILE_EDIT', true);

Tres más que no cuestan nada

  • Mueva wp-config.php por encima de la raíz web, o deniéguelo explícitamente. Guarda la contraseña de la base de datos.
  • Apague XML-RPC salvo que algo lo necesite: es un blanco habitual de la fuerza bruta.
  • Oculte la versión. No es seguridad, pero lo saca de las búsquedas de «sitios con la versión X».
Después de cualquier compromiso, cambie las sales de wp-config.php. Invalida todas las sesiones, incluida la del atacante, y es el paso que se salta la mayoría de las limpiezas.