Cómo limpiar malware en WordPress paso a paso

Proceso para limpiar malware en WordPress paso a paso

Proceso ordenado para limpiar malware en WordPress sin causar más daño: escaneo, verificación de archivos core, usuarios sospechosos y plugins comprometidos.

Limpiar malware en WordPress: por qué el orden importa más que la velocidad

Limpiar malware en WordPress es una de las tareas más delicadas que puede enfrentar cualquier administrador de un sitio web. La reacción instintiva —borrar archivos, restaurar backups a ciegas, instalar plugins de seguridad sin criterio— suele empeorar el problema. He visto sitios donde la «limpieza» eliminó archivos legítimos, rompió funcionalidades críticas o, peor aún, dejó intacta la puerta trasera que causó la infección original.

El malware en WordPress no es un problema de un solo archivo. Es un sistema: hay un punto de entrada, archivos modificados, posibles usuarios creados sin tu conocimiento y, frecuentemente, código inyectado en la base de datos. Si atacas solo una parte, el resto se regenera. Por eso necesitas un proceso ordenado, no una carrera contra el reloj.

Si acabas de descubrir la infección y aún no has tomado las primeras medidas de contención, te recomiendo leer primero qué hacer en las primeras 24 horas con un WordPress hackeado. Ese artículo cubre el paso previo: aislar, documentar y preparar el terreno. Lo que viene aquí es el trabajo fino: la limpieza real.

Paso 1: Escaneo completo antes de tocar nada

Antes de modificar un solo archivo, necesitas un mapa completo de la infección. Limpiar malware en WordPress sin un escaneo previo es como operar sin radiografía: puedes cortar donde no debes y dejar intacto lo que importa.

Herramientas de escaneo que funcionan

Hay dos niveles de escaneo que deberías ejecutar en paralelo:

  • Escaneo a nivel de servidor: Si tienes acceso SSH, herramientas como Linux Malware Detect (LMD) o ClamAV pueden rastrear el sistema de archivos completo buscando patrones de malware conocidos. Este nivel detecta archivos que los plugins de WordPress no ven porque están fuera del directorio de la instalación.
  • Escaneo a nivel de WordPress: Plugins como Wordfence o Sucuri Security comparan tus archivos contra los repositorios oficiales y buscan código sospechoso (funciones como eval(), base64_decode(), str_rot13() usadas en contextos no habituales). Wordfence, en particular, ofrece un escaneo que verifica la integridad de los archivos core, temas y plugins contra las versiones originales del repositorio de WordPress.

Lo crítico aquí: documenta todo. Cada archivo marcado como sospechoso, cada ruta, cada fecha de modificación. Un documento de texto plano con la lista de hallazgos te ahorrará horas después. No confíes en tu memoria cuando estés en medio de la limpieza.

Qué buscar en los resultados del escaneo

🔒 Tu WordPress protegido y al día

Mantenimiento técnico profesional: actualizaciones, seguridad, escaneos y soporte cuando lo necesitas.

Ver mantenimiento →

No todos los archivos marcados son malware. Los falsos positivos son frecuentes, especialmente en plugins que usan ofuscación legítima o funciones como eval() para motores de plantillas. Prioriza:

  • Archivos PHP en directorios donde no debería haber código ejecutable (como /wp-content/uploads/).
  • Archivos con nombres aleatorios: wp-tmp.php, class-db.php en la raíz, o cualquier archivo que no reconozcas.
  • Archivos core de WordPress con fecha de modificación posterior a tu última actualización.
  • Archivos con permisos 777 o escritura abierta para todos los usuarios del servidor.

Paso 2: Verificar y restaurar los archivos core de WordPress

Los archivos core son el corazón de la instalación: wp-admin/, wp-includes/ y los archivos de la raíz como wp-login.php, wp-cron.php o index.php. El malware los modifica con frecuencia porque se ejecutan en cada carga de página.

Proceso para limpiar los archivos core

La forma más segura no es «reparar» archivos individuales, sino reemplazar todo el core con archivos limpios:

  1. Descarga la misma versión de WordPress que tienes instalada desde la página oficial de releases. No la última versión; la que coincida con tu instalación actual. Puedes verificar tu versión en el archivo wp-includes/version.php.
  2. Elimina las carpetas wp-admin/ y wp-includes/ del servidor infectado por completo.
  3. Sube las carpetas limpias desde el paquete descargado.
  4. Reemplaza los archivos de la raíz uno a uno: index.php, wp-activate.php, wp-blog-header.php, wp-comments-post.php, wp-cron.php, wp-links-opml.php, wp-load.php, wp-login.php, wp-mail.php, wp-settings.php, wp-signup.php, wp-trackback.php y xmlrpc.php.

No toques wp-config.php ni .htaccess en este paso. Ambos requieren revisión manual, no reemplazo ciego. El wp-config.php contiene tus credenciales de base de datos y sales de seguridad; el .htaccess puede tener redirecciones legítimas de plugins como Yoast o WooCommerce.

Computer screen displaying code and project files
Photo by Bernd 📷 Dittrich on Unsplash

Revisión manual de wp-config.php

Abre wp-config.php y compáralo línea por línea con el archivo de ejemplo wp-config-sample.php del paquete limpio. Busca:

  • Líneas con require, include o eval que no sean parte de la configuración estándar.
  • Código añadido antes del <?php inicial o después de la línea require_once ABSPATH . 'wp-settings.php';.
  • Variables o constantes que no reconozcas.

Si encuentras código sospechoso, elimínalo. Si no estás seguro, compara con una instalación limpia.

Paso 3: Auditoría de usuarios y roles sospechosos

Una táctica habitual del malware en WordPress es crear usuarios administradores ocultos. Estos usuarios permiten al atacante volver a entrar incluso después de limpiar todos los archivos.

Dónde y cómo buscar usuarios fraudulentos

No confíes solo en el panel de «Usuarios» del escritorio de WordPress. El malware puede ocultar usuarios del listado visual. Revisa directamente en la base de datos:

SELECT * FROM wp_users WHERE user_login NOT IN ('tu_usuario_conocido');
SELECT * FROM wp_usermeta WHERE meta_key = 'wp_capabilities' AND meta_value LIKE '%administrator%';

La segunda consulta te muestra todos los usuarios con rol de administrador. Si encuentras alguno que no creaste tú, elimínalo. Pero antes de borrarlo, anota su ID y busca en wp_usermeta y wp_posts qué contenido o metadata dejó asociado.

Cambio de contraseñas y sales de seguridad

Después de eliminar usuarios sospechosos, cambia las contraseñas de todos los administradores legítimos. Usa contraseñas generadas de al menos 20 caracteres. Y regenera las sales de seguridad en wp-config.php usando el generador oficial de WordPress. Esto invalida todas las sesiones activas, forzando a cualquier atacante que tenga una sesión abierta a perder el acceso inmediatamente.

Paso 4: Limpiar malware en WordPress dentro de plugins y temas

La carpeta wp-content/ es donde vive el contenido personalizado de tu sitio: temas, plugins, uploads y, frecuentemente, el malware más difícil de detectar.

Plugins: eliminar y reinstalar, no reparar

Para cada plugin instalado, el proceso más fiable es:

  1. Anota la lista completa de plugins activos (desde la base de datos: SELECT option_value FROM wp_options WHERE option_name = 'active_plugins';).
  2. Elimina físicamente todas las carpetas de plugins en wp-content/plugins/.
  3. Descarga versiones limpias desde el repositorio oficial de WordPress.org o desde el proveedor original (para plugins premium).
  4. Sube las versiones limpias y reactiva solo los que necesitas.

Un detalle que muchos guías omiten: los plugins que llevan meses sin actualización son sospechosos por definición. Si un plugin no ha recibido una actualización en más de un año y hay alternativas mantenidas, este es el momento de cambiarlo. No tiene sentido limpiar para luego reinstalar la misma vulnerabilidad.

Temas: el mismo principio

Si usas un tema del repositorio oficial, elimínalo y descárgalo de nuevo. Si usas un tema personalizado o premium, compara archivo por archivo con la versión original del desarrollador. Presta especial atención a:

  • functions.php: es el archivo más atacado de cualquier tema. Busca funciones que no reconozcas, especialmente las que usan wp_enqueue_script para cargar JavaScript externo desconocido.
  • header.php y footer.php: inyecciones de scripts de redirección o minería de criptomonedas suelen aparecer aquí.
  • Cualquier archivo PHP que no forme parte del tema original.

La carpeta uploads: territorio peligroso

La carpeta wp-content/uploads/ debería contener solo imágenes, PDFs y otros archivos multimedia. No debería haber ningún archivo PHP aquí. Ejecuta una búsqueda recursiva:

find wp-content/uploads/ -name "*.php" -type f

Cualquier archivo PHP encontrado en uploads es casi con certeza malware. Elimínalo. Los atacantes usan esta carpeta porque muchas configuraciones de servidor permiten la ejecución de PHP en ella por defecto.

Paso 5: Revisar la base de datos

El malware no siempre vive en archivos. Código malicioso inyectado en la base de datos puede ejecutarse cada vez que WordPress carga una página, un widget o un comentario.

Tablas prioritarias para revisar

  • wp_options: busca opciones con nombres que no reconozcas, especialmente las que contienen código serializado con funciones PHP. Las filas siteurl y home deben apuntar a tu dominio real, no a un dominio externo.
  • wp_posts: busca contenido con <script>, <iframe> o llamadas a dominios externos en el campo post_content. Una consulta útil: SELECT ID, post_title FROM wp_posts WHERE post_content LIKE '%<script%' AND post_content LIKE '%eval%';
  • wp_comments: los comentarios con spam pueden contener inyecciones XSS. Revisa comentarios pendientes y aprobados que contengan HTML sospechoso.

Si tu base de datos tiene miles de registros comprometidos, no intentes limpiar uno por uno. Usa consultas SQL con REPLACE para eliminar patrones específicos de código inyectado, pero siempre haz un backup de la base de datos antes de ejecutar cualquier consulta masiva.

Paso 6: Verificación posterior a la limpieza

Has limpiado archivos, usuarios, plugins y base de datos. Ahora necesitas confirmar que la limpieza fue efectiva y que no dejaste nada atrás.

Lista de verificación post-limpieza

  1. Ejecuta un segundo escaneo completo con las mismas herramientas del paso 1. Compara los resultados: todo lo que apareció antes debería haber desaparecido.
  2. Verifica Google Search Console: si Google detectó malware, habrá una alerta en la sección «Problemas de seguridad». Después de limpiar, solicita una revisión. Google suele responder en 24-72 horas.
  3. Comprueba listas negras: herramientas como VirusTotal o el escáner de Sucuri SiteCheck te muestran si tu dominio está en alguna lista negra de navegadores o antivirus.
  4. Monitoriza durante 7-14 días: algunas infecciones tienen «reinfección programada» mediante cron jobs de WordPress (wp_cron) o cron jobs del servidor. Revisa ambos.

Cron jobs: el vector olvidado

Los atacantes frecuentemente registran tareas programadas que reinstalan el malware horas o días después de la limpieza. Revisa:

  • WP-Cron: instala temporalmente el plugin WP Crontrol y revisa todas las tareas programadas. Elimina cualquiera que no corresponda a un plugin conocido.
  • Cron del servidor: si tienes acceso SSH, ejecuta crontab -l para tu usuario y para el usuario del servidor web (www-data, apache, nginx). Busca entradas que apunten a archivos PHP sospechosos.

Errores frecuentes al limpiar malware en WordPress

Después de participar en docenas de procesos de limpieza, estos son los errores que veo repetirse:

  • Restaurar un backup sin verificar si ya estaba infectado. El malware puede llevar semanas o meses instalado antes de activarse. Tu backup de «hace una semana» puede contener la misma puerta trasera.
  • Cambiar solo la contraseña de WordPress y olvidar la de FTP, cPanel y la base de datos. Si el atacante tiene credenciales FTP, volverá a entrar independientemente de lo que hagas en WordPress.
  • Instalar un plugin de seguridad y asumir que «ya está». Un plugin de seguridad sobre una instalación comprometida es como poner una alarma en una casa donde el ladrón ya está dentro.
  • No actualizar WordPress, temas y plugins después de la limpieza. Si la infección entró por una vulnerabilidad conocida, dejar la misma versión instalada es invitar al atacante a volver.
  • Olvidar la carpeta de uploads. Como mencioné antes, es el escondite favorito del malware precisamente porque muchos administradores no la revisan.

Preguntas frecuentes sobre limpiar malware en WordPress

¿Puedo limpiar malware en WordPress sin acceso SSH?

Sí, pero es considerablemente más lento. Puedes usar el gestor de archivos de cPanel y plugins como Wordfence para el escaneo. Sin embargo, para infecciones graves que afectan archivos fuera del directorio de WordPress, el acceso SSH o al menos FTP completo es prácticamente necesario.

¿Cuánto tiempo lleva una limpieza completa?

Depende de la extensión de la infección. Un sitio pequeño con una inyección localizada puede limpiarse en 2-4 horas. Un sitio con WooCommerce, múltiples plugins y malware en la base de datos puede requerir 8-12 horas de trabajo distribuido en varios días, incluyendo la fase de monitorización posterior.

¿Debo reinstalar WordPress desde cero?

Solo como último recurso. Una reinstalación completa implica perder la base de datos, lo que significa perder todo el contenido. El proceso descrito en este artículo permite limpiar sin perder datos. La reinstalación total solo tiene sentido si la base de datos también está irrecuperablemente comprometida.

¿Los plugins de seguridad pueden prevenir futuras infecciones?

Reducen el riesgo significativamente, pero no lo eliminan. Un plugin de seguridad bien configurado (firewall, limitación de intentos de login, escaneos periódicos) es una capa más de protección. Pero la seguridad real viene de mantener todo actualizado, usar contraseñas fuertes y aplicar el principio de mínimos privilegios en usuarios y permisos de archivo.

Si tras leer este proceso sientes que la complejidad excede tu nivel técnico o el tiempo disponible, es una decisión inteligente delegar. Un profesional con experiencia en este tipo de situaciones puede hacer la limpieza de forma más rápida y con menor riesgo de daño colateral. Puedes consultar las opciones de mantenimiento WordPress para entender qué tipo de soporte técnico existe para estos casos.

Mi opinión como desarrollador WordPress

En mi experiencia, la mayoría de limpiezas de malware que acaban mal no fallan por falta de herramientas, sino por falta de método. He visto administradores borrar carpetas enteras del core pensando que estaban eliminando la infección, cuando en realidad el código malicioso estaba en un archivo PHP dentro de uploads que nadie revisó. Lo que más me ha enseñado trabajar en estos casos es que la paciencia rinde más que la velocidad: documentar cada hallazgo antes de actuar, verificar dos veces antes de borrar, y no dar la limpieza por terminada hasta que pasen al menos dos semanas sin señales de reinfección. El proceso no es glamuroso, pero funciona.

¿Necesitas ayuda con tu proyecto? Trabajo con negocios y agencias en WordPress, WooCommerce, IA e integraciones. Escríbeme y lo vemos juntos.

fernandodomecq
// Sobre el autor

fernandodomecq

Desarrollador WordPress freelance especializado en WooCommerce, integraciones e IA. Escribo sobre proyectos web, agencias y buenas prácticas técnicas.

Ver todos los artículos
// Compartir
// contacto — respuesta en < 24h

¿Hablamos de
tu proyecto?

hola@fernandomecq.com