Cómo desinfectar un WordPress hackeado

Introducción

Tener un WordPress hackeado no es solo un problema técnico: es una situación de emergencia. Un sitio comprometido puede perder datos, enviar spam, afectar gravemente al SEO, exponer información sensible de tus usuarios e incluso dejar de estar disponible.

Además, no siempre es fácil distinguir entre un WordPress hackeado y un fallo de configuración, un conflicto de plugins o un error de servidor. Por eso es importante actuar con método, sin borrar archivos al azar ni reinstalar todo sin una estrategia clara.

En esta guía te explicamos cómo desinfectar un WordPress hackeado paso a paso, minimizando riesgos y dejando tu instalación
lista para aplicar medidas de seguridad adicionales.

Tabla de contenidos

Síntomas de un WordPress hackeado

Un WordPress comprometido suele mostrar cambios inesperados: archivos alterados, mensajes de error extraños, redirecciones hacia webs que no conoces, enlaces de spam, creación de usuarios desconocidos o un consumo de recursos anómalo en el servidor.

Si quieres una lista detallada de señales y ejemplos, puedes consultar nuestro artículo: síntomas de que tu WordPress ha sido hackeado.

Paso 1: Aislar el sitio y preparar el entorno de desinfección

Antes de empezar a limpiar, es fundamental aislar el sitio para evitar que el ataque siga afectando a los usuarios que navegan por nuestra web y propagándose a otras instalaciones WordPress de nuestro alojamiento (si las tuviéramos). Para ello deberemos:

  • Activar modo mantenimiento o bloquear el acceso temporal mediante un plugin de mantenimiento o una restricción en el servidor (mediante una regla sencilla en .htacess por ejemplo). Así evitas que los visitantes sigan viendo contenido comprometido.
  • Cambiar las contraseñas de todos los accesos críticos (todas estas contraseñas las volveremos a cambiar más adelante):
    • Panel de control del hosting (cPanel, Plesk, panel propio).
    • Acceso a WordPress (todos los usuarios con rol de administrador).
    • FTP / SFTP / SSH.
    • Base de datos (usuario y contraseña del MySQL/MariaDB configurado en wp-config.php).
  • Desactivar tareas cron externas si las hubiera (WebCron, monitorizaciones que llamen a URLs del sitio) para evitar que se sigan ejecutando scripts comprometidos.
  • Generar una copia de seguridad del estado actual, incluso aunque esté infectado. Puede resultar muy útil para análisis forense o para recuperar contenido concreto más adelante.
  • Si tienes una copia de seguridad anterior a la infección puedes optar por eliminar todo el contenido y reestablecer la copia. Esto no es viable en tiendas online o portales con actualizaciones diarias, pero si en portales más estáticos. Con esto solventarás el problema, pero te recomendamos seguir con los siguientes pasos para asegurarte que tu web está libre de malware y evitar futuras infecciones.

Paso 2: Analizar el hosting y el servidor

Muchos ataques aprovechan vulnerabilidades del servidor, de otros sitios alojados en la misma cuenta o de configuraciones inseguras. Por eso, antes de centrarte solo en WordPress, conviene revisar el entorno completo.

  • Revisar los registros del servidor (access.log, error.log, etc.) para detectar:
    • IPs con muchas peticiones sospechosas.
    • Rutas de subida de archivos utilizadas por el atacante.
    • Errores recurrentes que indiquen explotación de vulnerabilidades.
  • Identificar patrones de ataque o archivos subidos por el atacante, como scripts en directorios de subida o en carpetas que no deberían contener PHP.
  • Verificar el consumo de CPU, RAM y procesos para detectar scripts en ejecución que no correspondan a tu web.
  • Comprobar si otros sitios en el mismo hosting también están infectados. Si compartes cuenta con más webs, es posible que el ataque haya afectado a varias instalaciones.

Paso 3: Escaneo profundo de la instalación

3.1. Escaneo automático

Un primer análisis automatizado te ayuda a tener una visión general del alcance de la infección y localizar archivos claramente maliciosos.

Algunas opciones habituales:

  • Wordfence: plugin de seguridad que incluye escaneo de archivos, detección de malware conocido, cambios en archivos de core y alertas de integridad.
  • Sucuri Security: ofrece escaneo de integridad, monitorización y algunas herramientas de hardening básicas.
  • Escáner de malware del hosting: muchos proveedores incluyen un malware scanner integrado en el panel del servidor. Por ejemplo tenemos el «Malware scanner» de «imunify 360» en cPanel.

inmunify 360 en cPanel

Estos escáneres suelen detectar:

  • Archivos modificados en el núcleo de WordPress: el core de WordPress debe estar siempre limpio y sin modificaciones. Si un archivo del núcleo ha sido editado, añadido o contiene código extraño, es una señal de que alguien ha manipulado tu instalación, normalmente con fines maliciosos.
  • Firmas de malware conocidas (backdoors, shells, spam SEO, etc.): Los escáneres comparan tus archivos con una lista de códigos peligrosos que ya conocen. Si encuentran algo que coincide, por ejemplo, un archivo que abre una puerta trasera (backdoor), un “shell” para controlar tu web o código de spam, te avisan. Es como cuando un antivirus reconoce un virus porque ya lo ha visto antes.
  • Inyecciones de código en temas y plugins: un atacante aprovecha archivos existentes para esconder código que no debería estar ahí, por ejemplo dentro de functions.php, en plantillas del tema o en archivos de plugins. Ese código puede servir para enviar spam, crear usuarios falsos, redirigir tu web o volver a infectarla.

3.2 Escaneo manual

El escaneo automático no siempre detecta todas las amenazas, ya que sólo detectan lo que conocen, pero un hacker puede crear código nuevo, modificarlo ligeramente o disfrazarlo para que no coincida con ninguna “firma” conocida. Además, pueden esconderlo en archivos normales del tema o del plugin, donde es más difícil distinguirlo de código legítimo. Por eso el análisis manual sigue siendo necesario. ¿Qué debes buscar?

  • Archivos PHP recientes, con nombres extraños o en carpetas poco habituales:
    • Archivos con nombres aleatorios o similares a los originales (por ejemplo, wp-config-old.php, wp-login2.php).
    • Archivos PHP en carpetas donde normalmente solo hay imágenes, como /wp-content/uploads/.
  • Revisar archivos críticos:
    • wp-config.php: comprobar que no tenga código añadido al inicio o al final.
    • .htaccess: verificar que no existan redirecciones o reglas sospechosas.
    • index.php en la raíz y en los temas: debe tener solo el contenido esperado.
    • Archivos en /wp-includes/: no deberían modificarse manualmente; cualquier cambio puede indicar infección.
  • Detectar inyecciones típicas de código malicioso:
    • Uso abusivo de base64_decode(), eval(), gzinflate() con cadenas largas codificadas.
    • Condicionales como if (isset($_REQUEST[...]) que ejecutan código recibido por URL o formulario.
    • JavaScript oculto, normalmente insertado en plantillas o en campos de contenido de la base de datos.

Paso 4: Sustituir archivos del núcleo de WordPress

Si el núcleo de WordPress está modificado, lo más seguro y rápido suele ser reemplazarlo por una copia limpia.

  1. Descargar una versión limpia de WordPress desde el sitio oficial:
    wordpress.org.
  2. Reemplazar por completo las carpetas del core:
    • /wp-admin/
    • /wp-includes/
  3. No reemplazar la carpeta /wp-content/, ya que ahí se encuentran tus temas, plugins y todos los archivos subidos (imágenes, documentos, etc.). Esa carpeta se limpiará de forma más selectiva en los siguientes pasos.
  4. Si tienes acceso a WP-CLI, ejecutar: wp core verify-checksums para comprobar la integridad del núcleo de WordPress y detectar archivos inesperados.

Paso 5: Revisar y saneamiento de temas y plugins

5.1 Eliminar plugins y temas innecesarios

Cada tema o plugin es una posible puerta de entrada. Si tienes componentes sin uso, desactualizados o abandonados, es el momento de hacer limpieza.

  • Eliminar plugins inactivos que ya no utilizas.
  • Borrar temas antiguos que no estén en uso (mantén solo el tema activo y, si quieres, uno oficial de respaldo).
  • Desinstalar plugins abandonados que lleven mucho tiempo sin actualizaciones o que no sean de confianza.

5.2 Sustituir por versiones limpias

Para los temas y plugins que sí necesitas, lo más seguro es reinstalar una copia limpia.

  • Descargar temas y plugins desde repositorios oficiales (WordPress.org o webs de desarrolladores de confianza).
  • Eliminar la carpeta del plugin o tema sospechoso vía FTP o desde el panel del hosting antes de subir la versión limpia.
  • Reinstalar desde cero y volver a configurar solo lo necesario, evitando reutilizar archivos que puedan estar comprometidos.

5.3 Cómo detectar un tema o plugin infectado

  • Archivos .php en carpetas donde no deberían estar, especialmente dentro de /assets/, /images/, /uploads/ u otras carpetas normalmente reservadas para recursos estáticos.
  • Código extraño en functions.php del tema activo, como llamadas a funciones de ofuscación, hooks que ejecutan código en cada carga de página o inclusión de archivos externos sospechosos.
  • Carpetas de caché con contenido no habitual, como archivos PHP o scripts que no corresponden al plugin de caché que utilizas.

Paso 6: Limpieza de la base de datos

Muchas infecciones no se limitan a los archivos: también se insertan en la base de datos aprovechando campos de contenido, widgets o ajustes.

  • Buscar tablas extrañas creadas por el atacante o por plugins maliciosos. Cualquier tabla que no reconozcas debe revisarse con detalle.
  • Revisar tablas clave:
    • wp_users: comprobar que no existan usuarios administradores desconocidos.
    • wp_options: revisar opciones con URLs extrañas, código incrustado o valores que cargan scripts externos.
    • wp_posts: buscar shortcodes o scripts maliciosos insertados en entradas, páginas o productos.
  • Limpiar opciones autoload infladas. Algunas infecciones aprovechan registros en wp_options con autoload activado para cargar código en cada petición, afectando rendimiento y seguridad.
  • Eliminar inyecciones de spam en:
    • Descripciones de productos.
    • Entradas del blog.
    • Widgets de texto o HTML.
    • Elementos de menús personalizados.

Paso 7: Regenerar contraseñas y claves de seguridad

Aunque ya hayas cambiado contraseñas al principio, después de la limpieza es obligado regenerarlas de nuevo para asegurarte de que el atacante no mantiene acceso.

  • Cambiar TODAS las contraseñas por nuevas, complejas y diferentes entre sí: panel de hosting, usuarios de WordPress, FTP/SFTP, SSH, bases de datos y cualquier otro servicio conectado.
  • Regenerar las salts y claves de seguridad de WordPress editando el archivo wp-config.php:
    • Accede a la API oficial de WordPress.
    • Copia el bloque de claves generado.
    • Reemplaza las constantes AUTH_KEY, SECURE_AUTH_KEY, LOGGED_IN_KEY, etc., en tu wp-config.php.

    Esto invalidará todas las sesiones activas y obligará a iniciar sesión de nuevo, cortando accesos que el atacante pudiera mantener hasta ese momento.

Paso 8: Limpiar tareas programadas y puertas traseras

Muchas infecciones dejan puertas traseras y tareas programadas para reinsertar el malware después de la limpieza. Es esencial localizarlas y eliminarlas.

  • Revisar wp-cron.php y las tareas programadas para identificar cron jobs que llamen a scripts externos o archivos sospechosos.
    Puedes ayudarte de plugins de gestión de cron o de WP-CLI.
  • Buscar scripts externos en tareas programadas, reglas del servidor o en plugins que cargan URLs que no reconoces.
  • Localizar puertas traseras típicas:
    • Archivos PHP ocultos o con nombres similares a archivos legítimos, pero en rutas inusuales.
    • Plugins falsos con nombres genéricos que no recuerdas haber instalado.
    • Funciones que permiten subir archivos sin verificar permisos o sin comprobaciones de seguridad.

Paso 9: Comprobaciones finales

Una vez realizada la limpieza, toca verificar que el sitio está funcionando correctamente y que ya no muestra signos de compromiso. Para ello vamos a llevar a cabo las siguientes tareas:

  • Comprobar que no existan redirecciones extrañas, ni desde .htaccess ni desde plugins o la base de datos. Es recomendable utilizar herramientas como Screaming Frog para asegurar que no existen enlaces salientes o redirecciones extrañas.
  • Revisar tu propiedad en Google Search Console, en el apartado de problemas de seguridad, para ver si Google sigue detectando
    malware, páginas engañosas o redirecciones maliciosas.
  • Realizar un test de funcionamiento general: navegación por las secciones principales, formularios, proceso de compra (si es una
    tienda), panel de administración y cualquier funcionalidad crítica de tu proyecto.

Paso 10: Hardening tras la limpieza

Cuando tu WordPress ya está limpio, el siguiente paso es endurecer la seguridad para reducir al máximo el riesgo de reinfección: limitar intentos de acceso, proteger el panel de administración, mejorar la configuración del servidor, implantar copias de seguridad fiables, etc.

Puedes ver en detalle todas estas medidas en nuestra Guía de seguridad WordPress, donde explicamos cómo reforzar la seguridad de tu sitio paso a paso y con ejemplos.

Conclusión

Desinfectar un WordPress hackeado no se limita a “pasar un antivirus” o reinstalar el núcleo: requiere seguir un proceso ordenado que incluya análisis del servidor, revisión de archivos, limpieza de la base de datos, regeneración de credenciales y comprobaciones finales.

La mejor estrategia a largo plazo es combinar una buena higiene digital (actualizaciones al día, copias de seguridad, mínimos plugins necesarios) con un plan de seguridad WordPress adaptado a tu proyecto.

Si tu web está comprometida, tienes dudas en alguno de estos pasos o necesitas que alguien se encargue de todo el proceso de forma profesional, siempre puedes recurrir a un servicio de mantenimiento WordPress especializado de desinfección y seguridad WordPress para recuperar tu sitio y dejarlo preparado frente a futuros ataques.