Eliminar malware de WordPress: plan paso a paso
Eliminar malware de WordPress en ocho pasos: contener el sitio, conservar pruebas, hallar el punto de entrada, limpiar desde fuentes fiables, renovar claves y reforzar.
También en: English Deutsch Français Italiano Polski Português Türkçe
Para eliminar el malware de WordPress de forma fiable hay que sustituir todo lo posible por copias de fuentes de confianza, cerrar el agujero por el que entró el atacante y cambiar cada secreto que haya podido ver. Borrar el archivo sospechoso que ha encontrado no basta, porque los atacantes suelen dejarse más de una vía para volver.
Este plan tiene ocho pasos. Sígalos en orden y tome notas sobre la marcha: las necesitará para Google, para su proveedor de hosting y quizá para la autoridad de protección de datos. Si aún no tiene claro que el sitio esté comprometido, empiece por nuestras 12 señales de que un WordPress ha sido hackeado.
Antes de eliminar el malware de WordPress: ¿limpiar, restaurar o pedir ayuda?
Decida esto antes que nada, porque condiciona el resto del plan.
- Restaure una copia limpia si sabe aproximadamente cuándo empezó la infección y tiene una copia de seguridad anterior a esa fecha. Aun así necesitará los pasos 3, 5 y 6; si no, el atacante volverá por el mismo agujero. Los pedidos, comentarios o mensajes de formularios posteriores a la copia se perderán, salvo que los exporte antes.
- Llame a un profesional si la web cobra pagos o guarda datos sensibles, si la infección ha vuelto tras una limpieza anterior, si hay varias webs afectadas en el mismo servidor, si necesita un informe forense para una aseguradora o una autoridad, o si no se maneja con soltura en la línea de comandos. Muchos proveedores de hosting también ofrecen este servicio.
- Límpielo usted mismo si dispone de acceso SSH y WP-CLI, de una lista de los plugins y temas que utiliza y de tiempo para hacerlo bien.
Contener: frenar el daño y conservar las pruebas
Paso 1: Contenga el daño
Desconecte el sitio o restrinja el acceso para que los visitantes no se infecten. wp maintenance-mode activate muestra a los visitantes un aviso de mantenimiento, pero solo afecta a las peticiones que cargan WordPress: un archivo de puerta trasera al que se llame directamente se sigue ejecutando. La contención real se hace en el servidor, así que pida a su proveedor que bloquee el acceso público o lo limite a su dirección IP.
Después, bloquee el acceso al área de administración. Este comando cierra la sesión de todos los usuarios:
wp user list --field=ID | xargs -n 1 wp user session destroy --all
Cambie su propia contraseña de administrador desde un dispositivo limpio. Anote las cuentas desconocidas, pero no las borre hasta después del paso 2. En un sitio infectado puede añadir --skip-plugins --skip-themes a los comandos de WP-CLI para que no se ejecute el código de plugins y temas; los plugins must-use y wp-config.php se siguen cargando.
Paso 2: Haga una instantánea del estado infectado
Antes de cambiar nada, guarde el sitio hackeado tal como está: lo necesitará para encontrar el punto de entrada, para responder a una aseguradora o a una autoridad, y como red de seguridad si la limpieza rompe algo.
# ejecutar en la raíz de WordPress; ~/evidence debe quedar fuera de la raíz web
mkdir -p ~/evidence
wp db export ~/evidence/db-infected-$(date +%F).sql
tar -czf ~/evidence/files-infected-$(date +%F).tar.gz .
sha256sum ~/evidence/*
La línea sha256sum registra sumas de verificación, para que más adelante pueda demostrar que las copias no han cambiado. Descargue también los registros de acceso y de errores; muchos proveedores solo los guardan durante un tiempo limitado.
Limpiar: cerrar el agujero y sustituir lo que se ha tocado
Paso 3: Encuentre el punto de entrada
Si se salta este paso, quizá tenga que volver a limpiar el mismo sitio la semana que viene. Los puntos de entrada típicos son plugins o temas vulnerables, contraseñas robadas o reutilizadas y otras webs infectadas en la misma cuenta de hosting.
- Plugins y temas vulnerables. Ejecute
wp plugin list --fields=name,status,version,updateywp theme listy busque cada elemento desactualizado en una base de datos de vulnerabilidades. La rapidez importa: según la empresa de seguridad Patchstack, en 2025 la mediana ponderada del tiempo hasta la explotación masiva de las vulnerabilidades más explotadas fue de 5 horas (State of WordPress Security in 2026). - Credenciales robadas. Compruebe cuándo se crearon las cuentas de administrador desconocidas y busque inicios de sesión desde direcciones IP que no le resulten familiares.
- Registros del servidor. Busque peticiones POST a archivos poco habituales en torno al momento en que cambió el primer archivo.
grep '"POST ' access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head -20
find . -type f -name '*.php' -mtime -14 -printf '%TY-%Tm-%Td %TH:%TM %p\n' | sort
Sustituya access.log por su propio archivo de registro. El primer comando enumera las rutas que han recibido más peticiones POST; el segundo, los archivos PHP modificados en los últimos 14 días. Las marcas de tiempo se pueden falsificar, así que tómelas como indicios. Si no encuentra el punto de entrada, póngase en lo peor: sustituya todos los plugins y temas y renueve todas las credenciales.
Paso 4: Limpie a partir de fuentes fiables
Sustituir antes que reparar: una copia nueva de la fuente oficial es más fiable que intentar descifrar código ofuscado.
Núcleo de WordPress. Borre wp-admin y wp-includes y vuelva a descargar la misma versión, para que desaparezcan también los archivos sobrantes escondidos en esas carpetas. Ejecute esto en la raíz de WordPress, la carpeta que contiene wp-load.php y wp-admin:
VER=$(wp core version)
[ -n "$VER" ] && [ -f wp-load.php ] && rm -rf wp-admin wp-includes && \
wp core download --version="$VER" --skip-content --force
wp core verify-checksums --include-root
La segunda línea no borra nada si no se ha encontrado una versión o si usted no está en la raíz de WordPress. --include-root (WP-CLI 2.8 o posterior) enumera además los archivos desconocidos de la carpeta raíz.
Plugins y temas. Sustituya cada carpeta de plugin y de tema por una copia nueva de WordPress.org o del área de descargas del proveedor. Para los plugins de WordPress.org, wp plugin install <slug> --force sobrescribe la copia instalada; después, wp plugin verify-checksums --all informa de los archivos modificados y añadidos. Borre todo lo que no use y no reinstale nunca a partir de una copia «nulled» (pirateada).
Subidas. La carpeta de subidas no se puede reinstalar, así que hay que inspeccionarla: busque archivos PHP con find wp-content/uploads -type f -iname '*.php', compare la carpeta con una copia anterior a la infección y elimine todo lo que no sea contenido multimedia.
Configuración y drop-ins. Revise a mano wp-config.php, .htaccess, .user.ini, wp-content/mu-plugins y los drop-ins como object-cache.php.
Base de datos. El malware también se esconde en entradas, opciones, usuarios y eventos programados:
wp user list --role=administrator --skip-plugins --skip-themes
wp option get siteurl && wp option get home
wp db search '<script' --all-tables
wp cron event list --fields=hook,next_run_relative,recurrence
wp db search también encuentra scripts legítimos, como los fragmentos de analítica. Elimine administradores desconocidos, entradas de spam y opciones inyectadas solo después de revisar cada caso.
Paso 5: Renueve todas las credenciales y los salts
Parta de la base de que el atacante ha leído wp-config.php y todos los secretos almacenados en el servidor. Cambie:
- todas las cuentas de WordPress con permisos de administrador o de editor, y revoque las contraseñas de aplicación que no reconozca;
- el panel de control del hosting, SFTP/FTP y SSH, incluidas las claves SSH autorizadas;
- la contraseña de la base de datos, a la vez en el hosting y en
wp-config.php; - las claves API guardadas en plugins: pagos, SMTP, almacenamiento de copias de seguridad, CDN;
- la cuenta de correo que recibe los restablecimientos de contraseña de los administradores.
A continuación, sustituya las claves de autenticación y los salts de wp-config.php. Según la documentación para desarrolladores de WordPress, cambiarlos invalida todas las cookies existentes, de modo que todo el mundo tiene que volver a iniciar sesión, incluido un atacante con una sesión robada.
wp config shuffle-salts
Seguimiento: reforzar, vigilar, documentar
Paso 6: Refuerce el sitio
- Actualice el núcleo, los plugins y los temas; nuestra guía sobre plugins vulnerables de WordPress trata las auditorías y las actualizaciones automáticas.
- Añada
define( 'DISALLOW_FILE_EDIT', true );awp-config.phppara eliminar los editores de archivos del escritorio.DISALLOW_FILE_MODSva más allá y bloquea también las actualizaciones desde el escritorio y las automáticas, así que úselo solo si actualiza por otra vía. - Active la autenticación de dos factores para todos los administradores. El núcleo de WordPress no la incluye.
- Bloquee la ejecución de PHP en la carpeta de subidas. Con Apache 2.4, en
wp-content/uploads/.htaccess:
<FilesMatch "\.(?i:php|phtml|phar)$">
Require all denied
</FilesMatch>
En nginx, coloque esta regla antes de su bloque general location ~ \.php$, porque nginx aplica la primera location con expresión regular que coincida:
location ~* ^/wp-content/uploads/.*\.(php|phtml|phar)$ { deny all; }
Ejecute nginx -t antes de recargar y compruebe después que las imágenes se siguen cargando.
Paso 7: Vigile y solicite revisiones
Vigile el sitio de cerca durante las semanas siguientes: repita las comprobaciones de sumas de verificación y de la carpeta de subidas, compare las listas de archivos con su estado limpio y lea los registros de acceso. Si la infección vuelve, el punto de entrada sigue abierto, y ese es el momento de llamar a un profesional.
Security Audit & Compliance, de secaudit.eu, puede ayudarle en esta fase: mantiene una línea base de integridad de archivos, verifica las sumas de verificación del núcleo y busca administradores ocultos, eventos cron sospechosos y spam SEO oculto. Detecta e informa; no limpia el sitio por usted.
Si Google marcó el sitio, abra Problemas de seguridad en Search Console cuando todo esté limpio, elija Solicitar revisión y describa lo que ha corregido. Según Google, las revisiones tardan alrededor de un día en casos de phishing, unos días en los de malware y hasta varias semanas en los de spam por hackeo. Solicite la exclusión de las listas de bloqueo de correo solo cuando el spam haya cesado.
Paso 8: Evalúe la brecha según el RGPD y documéntela
Este paso es el último de la lista, pero su plazo empieza a correr el primer día. Si quedaron expuestos, se modificaron o dejaron de estar disponibles datos de clientes, cuentas de usuario, mensajes de formularios o pedidos, el hackeo suele constituir una violación de la seguridad de los datos personales. En ese caso debe notificarla a su autoridad de control (en España, la AEPD) sin dilación indebida y, de ser posible, a más tardar 72 horas después de haber tenido constancia de ella, salvo que sea improbable que constituya un riesgo (art. 33 del RGPD). Si el riesgo para las personas es alto, también debe informarlas a ellas (art. 34).
Decida lo que decida, documente los hechos, sus efectos y las medidas correctoras adoptadas: el art. 33, apartado 5, lo exige para todas las brechas, incluso las que no se notifican. Nuestra guía sobre la notificación en 72 horas recorre la evaluación paso a paso. Si su organización está sujeta a la Directiva NIS2, los incidentes significativos requieren además una alerta temprana en 24 horas; consulte la ley nacional de transposición de la NIS2 en su país.
Preguntas frecuentes
¿Puede un plugin de seguridad eliminar el malware por mí?
Algunas herramientas ofrecen la limpieza automática del malware conocido. Ninguna puede decirle con certeza cómo entró el atacante ni qué contraseñas se llevó, así que los pasos 3, 5 y 6 siguen siendo cosa suya.
¿Reinstalar el núcleo de WordPress borra mi contenido?
No. Las entradas, las páginas y los ajustes están en la base de datos, y con --skip-content no se tocan ni los plugins, ni los temas, ni las subidas. Solo se sustituyen los archivos del núcleo de wp-admin, wp-includes y la carpeta raíz; wp-config.php se conserva.
Este artículo es información general, no asesoramiento jurídico.
Compruebe su propio sitio
Security Audit & Compliance es el plugin de WordPress de secaudit.eu: busca malware, spam oculto, archivos del núcleo modificados y código vulnerable, y relaciona sus hallazgos con el art. 32 del RGPD, el art. 21 de NIS2 y el OWASP Top 10.
Ver qué comprueba el plugin