Desinfectar WordPress con WP CLI de forma segura
Guía completa para desinfectar WordPress con WP-CLI de forma segura, paso a paso, detectando malware, limpiando archivos y reforzando la seguridad.
Índice
- Introducción: por qué usar WP-CLI para desinfectar WordPress
- Requisitos previos y medidas de seguridad antes de empezar
- Primeros pasos: comprobaciones rápidas con WP-CLI
- Detección de malware y archivos sospechosos desde la terminal
- Limpieza del core, plugins y temas con WP-CLI
- Desinfección de la base de datos de WordPress
- Reforzar la seguridad y prevenir nuevos ataques
- Automatización y scripts de limpieza con WP-CLI
- Errores comunes al desinfectar WordPress con WP-CLI
- Preguntas frecuentes
Introducción: por qué usar WP-CLI para desinfectar WordPress
Desinfectar un sitio WordPress comprometido suele ser una tarea urgente y delicada. Cuando el panel de administración está inaccesible, el servidor va lento o el malware se regenera una y otra vez, WP-CLI se convierte en una herramienta clave para recuperar el control. WP-CLI es la interfaz de línea de comandos oficial de WordPress, que permite gestionar el sitio directamente desde la terminal, sin depender del navegador ni del panel de control.
Utilizar WP-CLI para limpiar un WordPress hackeado aporta varias ventajas: rapidez, precisión, automatización y la posibilidad de actuar incluso cuando el backend está caído. Sin embargo, también implica riesgos si se ejecutan comandos destructivos sin copia de seguridad o sin entender su alcance. Esta guía explica, paso a paso, cómo desinfectar WordPress con WP-CLI de forma segura, minimizando el tiempo de inactividad y reduciendo la probabilidad de reinfección.
Objetivo de esta guía: que puedas identificar, limpiar y reforzar un WordPress comprometido usando WP-CLI, siguiendo un flujo de trabajo ordenado y seguro, apto tanto para administradores de sistemas como para desarrolladores y agencias.
Requisitos previos y medidas de seguridad antes de empezar
Antes de ejecutar cualquier comando de limpieza con WP-CLI, es imprescindible preparar el entorno y reducir riesgos. Un error en la terminal puede dejar el sitio inoperativo o provocar pérdida de datos. Por ello, conviene seguir una serie de pasos previos que garanticen un margen de seguridad suficiente.
Comprobar acceso y entorno
- Acceso SSH al servidor con un usuario que tenga permisos sobre los archivos del sitio.
- PHP y WP-CLI instalados y accesibles desde la línea de comandos (
wp --info). - Ruta del sitio WordPress localizada (por ejemplo,
/var/www/htmlo similar). - Conocer el entorno: producción, staging o desarrollo, para evitar limpiar el sitio equivocado.
Crear copias de seguridad completas
Nunca inicies una desinfección sin una copia de seguridad reciente. Si el servidor lo permite, puedes generar backups desde la propia terminal, combinando WP-CLI con herramientas del sistema.
- Copia de la base de datos con WP-CLI:
wp db export backup-inicial.sql. - Copia de archivos con
taro similar:tar -czf backup-archivos.tar.gz ./. - Descargar las copias a tu equipo local o a un almacenamiento externo seguro.
Aislar el sitio comprometido
Para evitar que el malware se propague o que los visitantes sigan expuestos, es recomendable aislar el sitio mientras se realiza la limpieza.
- Activar una página de mantenimiento temporal (a nivel de servidor o plugin, si es seguro).
- Restringir acceso por IP o mediante autenticación básica HTTP, si es posible.
- Desactivar temporalmente tareas cron externas que puedan reinyectar código.
Consejo: documenta cada cambio que realices (comandos ejecutados, archivos modificados, plugins eliminados). Esta trazabilidad te ayudará a revertir pasos si algo falla y a entender el origen del incidente más adelante.
Primeros pasos: comprobaciones rápidas con WP-CLI
Con el entorno asegurado, el siguiente paso es realizar comprobaciones rápidas para entender el alcance del compromiso. WP-CLI permite obtener información clave sobre el estado del sitio, usuarios, plugins y temas en pocos segundos.
Verificar la versión de WordPress y el estado del core
Versiones antiguas de WordPress son un vector de ataque frecuente. Comprueba qué versión está instalada y si el core está modificado.
wp core versionpara ver la versión actual.wp core verify-checksumspara comprobar la integridad de los archivos del core.
Si verify-checksums devuelve archivos alterados, es una señal clara de posible infección en el núcleo de WordPress, o de modificaciones manuales que deberán revisarse.
Revisar usuarios administradores sospechosos
Muchos ataques añaden usuarios administradores ocultos o con nombres genéricos. WP-CLI facilita listar y gestionar usuarios sin entrar al panel.
- Listar usuarios administradores:
wp user list --role=administrator --fields=ID,user_login,user_email,display_name. - Eliminar administradores sospechosos:
wp user delete ID --reassign=ID_SEGURO. - Forzar cambio de contraseña para todos los usuarios:
wp user update ID --user_pass=CONTRASENA_SEGURA.
Comprobar plugins y temas instalados
Plugins y temas desactualizados o abandonados son otra vía habitual de infección. Es importante identificar cuáles están activos y su estado.
- Listar plugins:
wp plugin list --fields=name,status,version,update. - Listar temas:
wp theme list --fields=name,status,version,update. - Desactivar todos los plugins de golpe (temporalmente):
wp plugin deactivate --all.
Buenas prácticas: anota qué plugins estaban activos antes de desactivarlos todos. Después de la limpieza, solo deberías reactivar los que sean estrictamente necesarios y estén actualizados.
Detección de malware y archivos sospechosos desde la terminal
Aunque WP-CLI no es un antivirus, combinado con comandos del sistema permite localizar patrones típicos de malware en archivos PHP, JavaScript y otros recursos. El objetivo es identificar archivos añadidos o modificados de forma maliciosa para poder actuar sobre ellos con precisión.
Patrones comunes de código malicioso
Muchos scripts maliciosos comparten características reconocibles. Algunos patrones frecuentes son:
- Uso intensivo de funciones como
eval,base64_decode,gzinflate,str_rot13. - Código ofuscado con largas cadenas de caracteres aparentemente aleatorios.
- Archivos PHP en directorios donde normalmente no debería haberlos (por ejemplo, en
uploads). - Cabeceras de archivos de tema o plugin alteradas con código extraño antes o después del comentario estándar.
Uso de comandos de búsqueda en combinación con WP-CLI
Desde la carpeta raíz de WordPress, puedes usar herramientas como grep o find para localizar posibles infecciones. Aunque no son infalibles, ayudan a reducir el área de búsqueda.
- Buscar funciones sospechosas en archivos PHP:
grep -R "base64_decode" -n . | head - Localizar archivos PHP dentro de
wp-content/uploads:find wp-content/uploads -type f -name "*.php" - Listar archivos modificados recientemente:
find . -type f -mtime -3 -printf "%TY-%Tm-%Td %TT %p\n" | sort
Estos comandos no eliminan nada por sí mismos, pero te ofrecen una lista de archivos que conviene revisar manualmente o comparar con versiones limpias.
Complementar con plugins de seguridad vía WP-CLI
En algunos casos, puede ser útil instalar temporalmente un plugin de seguridad que ofrezca escaneo de malware, gestionándolo con WP-CLI para no depender del panel.
- Instalar un plugin de seguridad:
wp plugin install wordfence --activate(ejemplo). - Revisar su documentación para lanzar escaneos desde WP-CLI, si lo soporta.
- Desactivar o desinstalar el plugin una vez finalizada la limpieza, si no se va a usar a largo plazo.
Importante: no confíes únicamente en el escaneo automático. Combina herramientas de seguridad con revisión manual, verificación de checksums del core y comparación con copias de seguridad o repositorios oficiales de plugins y temas.
Limpieza del core, plugins y temas con WP-CLI
Una vez identificados indicios de infección, el siguiente paso es restaurar el núcleo de WordPress, los plugins y los temas a versiones limpias. WP-CLI facilita reinstalar componentes oficiales sin necesidad de subir archivos manualmente por FTP, lo que acelera el proceso y reduce errores.
Reinstalar el core de WordPress
Si wp core verify-checksums ha detectado archivos alterados, lo más seguro es reinstalar el core completo. Este proceso no afecta a la base de datos ni a los archivos de wp-content.
- Descargar y reinstalar el core:
wp core download --force --skip-content - Volver a verificar checksums:
wp core verify-checksums
Con --skip-content te aseguras de que no se sobrescriban temas, plugins ni archivos subidos. El objetivo es dejar la carpeta raíz y wp-admin, wp-includes en estado limpio.
Actualizar y reinstalar plugins comprometidos
Los plugins son una de las partes más vulnerables del ecosistema WordPress. Debes asegurarte de que todos estén actualizados y libres de modificaciones maliciosas.
- Actualizar todos los plugins:
wp plugin update --all - Reinstalar un plugin concreto desde el repositorio oficial:
wp plugin install nombre-plugin --force - Eliminar plugins que no uses o que sean de dudosa procedencia:
wp plugin delete nombre-plugin
Si sospechas que un plugin premium ha sido el origen del ataque, descarga una copia limpia desde la web oficial del proveedor y súbela manualmente, o utiliza su sistema de actualización propio si lo tiene.
Limpiar y reemplazar temas
Los temas, especialmente los que incluyen constructores visuales o funciones avanzadas, también pueden ser objetivo de inyección de código. Es recomendable reinstalar el tema activo y eliminar los que no se utilicen.
- Actualizar todos los temas:
wp theme update --all - Reinstalar un tema del repositorio oficial:
wp theme install nombre-tema --force - Eliminar temas inactivos que no sean necesarios:
wp theme delete nombre-tema
Recomendación: mantén solo un tema hijo (si lo usas), el tema padre correspondiente y, como máximo, un tema por defecto de WordPress para emergencias. Menos temas instalados significa menos superficie de ataque y menos archivos que revisar en futuras auditorías.
Desinfección de la base de datos de WordPress
Muchos ataques no se limitan a los archivos: también inyectan código malicioso en la base de datos, especialmente en entradas, widgets, opciones y campos personalizados. WP-CLI ofrece comandos para inspeccionar y limpiar estos datos de forma más ágil que desde el panel.
Exportar y trabajar sobre una copia
Antes de modificar la base de datos, crea una exportación adicional específica para esta fase de limpieza. Así podrás revertir cambios si un reemplazo masivo afecta a contenido legítimo.
- Exportar base de datos:
wp db export antes-limpieza-db.sql - Opcional: descargar el archivo SQL y analizarlo con un editor de texto o herramientas de búsqueda.
Buscar patrones maliciosos en contenido y opciones
Algunos tipos de malware insertan iframes, scripts o redirecciones en el contenido de las entradas o en opciones globales. Con WP-CLI puedes localizar estos patrones y limpiarlos con comandos de búsqueda y reemplazo.
- Buscar una cadena sospechosa en la base de datos (modo solo lectura):
wp db query "SELECT * FROM wp_posts WHERE post_content LIKE '%cadena_sospechosa%' LIMIT 20" - Revisar opciones sospechosas:
wp option list --search=redirect --fields=option_name,option_value | head
Adapta los patrones de búsqueda a lo que hayas detectado en los archivos (por ejemplo, dominios maliciosos, fragmentos de JavaScript, iframes ocultos, etc.).
Uso seguro de wp search-replace
El comando wp search-replace permite reemplazar cadenas en toda la base de datos. Es muy potente, pero también peligroso si se usa sin pruebas previas. Siempre debes comenzar con un simulacro.
- Simular un reemplazo sin aplicar cambios:
wp search-replace 'cadena_maliciosa' '' --dry-run - Si el resultado es correcto, ejecutar el reemplazo real:
wp search-replace 'cadena_maliciosa' '' - Limitar el reemplazo a tablas concretas si es necesario, usando
--tables=wp_posts,wp_postmeta.
Precaución: evita usar patrones demasiado genéricos que puedan eliminar contenido legítimo. Siempre realiza un --dry-run y revisa una muestra de los resultados antes de aplicar cambios definitivos en la base de datos.
Reforzar la seguridad y prevenir nuevos ataques
Limpiar un WordPress comprometido es solo la mitad del trabajo. Para que la desinfección sea duradera, debes reforzar la seguridad del sitio y del servidor. WP-CLI puede ayudarte a aplicar algunas de estas medidas de forma rápida y consistente.
Actualizar todo el ecosistema
Mantener el núcleo, los plugins y los temas actualizados es una de las defensas más efectivas contra vulnerabilidades conocidas.
- Actualizar WordPress a la última versión estable:
wp core update - Actualizar la base de datos si es necesario:
wp core update-db - Actualizar plugins y temas:
wp plugin update --allwp theme update --all
Endurecer la configuración de WordPress
Algunas medidas de hardening pueden aplicarse directamente sobre el archivo wp-config.php y otros elementos de configuración. Aunque WP-CLI no cubre todo el hardening, sí facilita tareas relacionadas con claves de seguridad y depuración.
- Regenerar claves y salts de autenticación (editando
wp-config.phpcon valores nuevos desde la API oficial). - Desactivar la edición de archivos desde el panel añadiendo:
define('DISALLOW_FILE_EDIT', true); - Limitar el número de revisiones de entradas y el autosave para reducir datos innecesarios.
Mejorar la seguridad de accesos y usuarios
Muchos ataques se aprovechan de contraseñas débiles o cuentas compartidas. Desde WP-CLI puedes gestionar usuarios de forma masiva y aplicar políticas más estrictas.
- Revisar todos los usuarios y roles:
wp user list --fields=ID,user_login,role - Reducir privilegios a cuentas que no necesiten ser administradores.
- Forzar cambios de contraseña periódicos y recomendar el uso de gestores de contraseñas.
Extra: combina estas medidas con seguridad a nivel de servidor (firewall de aplicaciones web, bloqueo de IPs maliciosas, desactivación de funciones peligrosas en PHP, etc.) para crear una defensa en profundidad que no dependa solo de WordPress.
Automatización y scripts de limpieza con WP-CLI
Si gestionas varios sitios o realizas tareas de desinfección con frecuencia, automatizar parte del proceso con scripts basados en WP-CLI puede ahorrarte mucho tiempo y reducir errores humanos. La clave está en diseñar scripts seguros, bien documentados y fáciles de adaptar a cada proyecto.
Diseñar un flujo de trabajo automatizado
Un script típico de limpieza puede incluir pasos como:
- Creación de copias de seguridad de archivos y base de datos.
- Verificación y reinstalación del core de WordPress.
- Actualización de plugins y temas.
- Ejecutar búsquedas de patrones maliciosos conocidos.
- Aplicar comandos de
search-replacepredefinidos (siempre con opción de--dry-run).
Estos pasos pueden escribirse en un script .sh o integrarse en herramientas de orquestación más avanzadas, siempre con variables configurables por proyecto.
Buenas prácticas al crear scripts con WP-CLI
Para que tus scripts sean fiables y reutilizables, ten en cuenta las siguientes recomendaciones:
- Usar rutas relativas al directorio de WordPress y comprobar que estás en la carpeta correcta antes de ejecutar comandos.
- Incluir comprobaciones de errores tras cada paso crítico y detener el script si algo falla.
- Registrar la salida de los comandos en un archivo de log para auditoría posterior.
- Permitir ejecutar el script en modo simulación (sin cambios destructivos) mediante una variable o parámetro.
Recuerda: la automatización no sustituye al análisis experto. Usa los scripts como apoyo para tareas repetitivas, pero mantén siempre una fase de revisión manual para confirmar que la desinfección ha sido completa y que el sitio funciona correctamente.
Errores comunes al desinfectar WordPress con WP-CLI
Trabajar con WP-CLI ofrece mucha potencia, pero también aumenta el impacto de los errores. Conocer los fallos más habituales te ayudará a evitarlos y a mantener un enfoque más seguro durante todo el proceso de desinfección.
No hacer copias de seguridad antes de actuar
El error más grave y frecuente es empezar a borrar archivos o a ejecutar search-replace sin tener una copia de seguridad reciente. Si algo sale mal, puedes perder datos irrecuperables o dejar el sitio inservible.
- Haz siempre al menos una copia de la base de datos y otra de los archivos.
- Verifica que los backups se han creado correctamente y que puedes restaurarlos.
Ejecutar comandos destructivos sin pruebas
Comandos como wp search-replace, wp plugin delete o wp theme delete pueden tener efectos irreversibles. Ejecutarlos sin simulación previa o sin revisar el alcance es una fuente habitual de problemas.
- Utiliza siempre
--dry-runcuando esté disponible. - Revisa una muestra de los resultados antes de aplicar cambios masivos.
Confiar solo en la reinstalación del core
Reinstalar el core de WordPress es un paso importante, pero no suficiente. El malware suele residir en wp-content, la base de datos o incluso en el servidor a nivel de sistema.
- Complementa la reinstalación del core con revisión de plugins, temas y base de datos.
- Si el servidor ha sido comprometido a nivel de sistema, considera una reinstalación completa del entorno.
No investigar la causa raíz del ataque
Limpiar los síntomas sin entender cómo se produjo la intrusión aumenta la probabilidad de reinfección. Es fundamental identificar la vulnerabilidad explotada para poder corregirla.
- Revisa logs del servidor (acceso y error) en busca de patrones sospechosos.
- Consulta bases de datos de vulnerabilidades para plugins y temas utilizados.
- Evalúa la necesidad de auditorías de seguridad más profundas.
En resumen, la clave para desinfectar WordPress con WP-CLI de forma segura es combinar prudencia, copias de seguridad, pruebas previas y una visión global del sistema. No te limites a “apagar el fuego”; refuerza la seguridad para que no vuelva a producirse.
Preguntas frecuentes
A continuación se responden algunas de las dudas más habituales sobre el uso de WP-CLI para desinfectar WordPress de forma segura.
¿Es suficiente WP-CLI para limpiar por completo un WordPress hackeado?
WP-CLI es una herramienta muy potente para gestionar y limpiar WordPress, pero por sí sola no garantiza una desinfección total. Debe combinarse con análisis de logs, herramientas de seguridad adicionales y, en algunos casos, con la revisión del servidor a nivel de sistema. WP-CLI facilita tareas como reinstalar el core, actualizar plugins y temas, y limpiar la base de datos, pero no sustituye a una auditoría de seguridad completa.
¿Puedo usar WP-CLI si el panel de administración de WordPress no funciona?
Sí. Una de las grandes ventajas de WP-CLI es que funciona independientemente del panel de administración. Mientras tengas acceso SSH al servidor y WP-CLI esté instalado, podrás gestionar el sitio, desactivar plugins, reinstalar el core y realizar tareas de limpieza incluso si el backend está caído o inaccesible por el ataque.
¿Es peligroso usar wp search-replace para eliminar malware de la base de datos?
Puede serlo si se utiliza sin precaución. wp search-replace modifica directamente los datos de la base de datos, por lo que un patrón mal definido puede borrar o corromper contenido legítimo. Para usarlo con seguridad, haz siempre una copia de seguridad previa, ejecuta primero el comando con --dry-run, revisa los resultados y limita el alcance a tablas concretas cuando sea posible.
¿Cómo sé si la desinfección con WP-CLI ha sido completa?
No existe una garantía absoluta, pero puedes aumentar la confianza siguiendo varios pasos: verificar checksums del core, reinstalar plugins y temas desde fuentes oficiales, escanear archivos y base de datos en busca de patrones maliciosos, revisar logs del servidor y monitorizar el sitio durante varios días para detectar comportamientos anómalos. Si es un proyecto crítico, considera una auditoría externa especializada.
¿Qué hago si el sitio se reinfecta después de limpiarlo con WP-CLI?
Una reinfección suele indicar que la vulnerabilidad original sigue abierta o que existe una puerta trasera oculta. En ese caso, revisa de nuevo usuarios, plugins y temas, analiza los logs de acceso en busca de patrones repetidos, verifica que el servidor esté actualizado y correctamente configurado, y considera migrar el sitio a un entorno más seguro. También es recomendable cambiar todas las credenciales relacionadas (FTP, SSH, base de datos, panel de hosting y cuentas de administrador de WordPress).
¿Necesitas orientación personalizada?
Te ayudamos a entender tus opciones y el siguiente paso.