🦠 Limpiar malware de un sitio WordPress: checklist paso a paso
Esta guía es para quien administra o desarrolla el sitio y se maneja con el Administrador de archivos, phpMyAdmin y el escritorio de WordPress. Está ordenada como checklist: siga las fases en orden y marque cada punto antes de pasar al siguiente. Calcule entre una y tres horas por sitio.
💡 Si no se siente cómodo con alguno de los pasos, escríbanos antes de empezar. Un paso mal hecho en la base de datos o en wp-config.php puede dejar el sitio fuera de línea.
🛡️ Lo que Imunify360 ya hace por usted (y lo que no)
Todos nuestros servidores están protegidos por Imunify360, que trabaja en segundo plano sobre su cuenta:
- Revisa en tiempo real cada archivo que se sube o se modifica y, una vez por semana, la cuenta completa, incluidas las bases de datos y las tareas programadas (cron).
- Cuando encuentra malware lo limpia automáticamente. Si no puede separar el código malicioso, deja el archivo vacío en lugar de borrarlo.
- Guarda el original de cada archivo limpiado durante 90 días. Si un archivo legítimo resultó afectado, podemos recuperarlo.
- Detiene en el momento los scripts PHP que se comportan de forma maliciosa (Proactive Defense) y bloquea con su WAF los ataques conocidos contra WordPress y sus plugins.
Aun así, que Imunify360 no reporte nada no prueba que el sitio esté limpio. Hay infecciones que ningún escáner reconoce: código malicioso escrito como PHP «normal» dentro de un plugin legítimo, administradores ocultos, spam guardado en la base de datos o páginas que solo se muestran a Google. Esta checklist cubre justamente eso.
🧭 Fase 0: Antes de empezar
- ☐ Decida si restaurar o limpiar. Respaldamos su cuenta a diario con JetBackup y conservamos unos 30 días. Si sabe que el sitio estaba sano en una fecha dentro de ese plazo, restaurar archivos y base de datos de ese día suele ser lo más rápido. Después de restaurar, haga igual las Fases 1, 5 y 6: el agujero por el que entraron sigue abierto.
- ☐ Haga el inventario de instalaciones. Revise todas las instalaciones de WordPress de la cuenta: dominio principal, dominios adicionales, subdominios y carpetas de pruebas o copias viejas (
/old,/test,/wp2,/nuevo). El malware salta entre sitios de la misma cuenta: si limpia uno y deja otro, se vuelve a infectar. - ☐ Cree una carpeta de cuarentena fuera de
public_html, por ejemplo/home/[NOMBRE-DE-CUENTA]/cuarentena. En esta guía los archivos sospechosos se mueven ahí, no se borran: si se equivoca, los puede devolver. - ☐ Anote las versiones de WordPress (está en
wp-includes/version.php, línea$wp_version) y de cada plugin y tema activo. - ☐ No se fíe de las fechas del Administrador de archivos. El malware cambia la fecha de modificación de sus archivos para que parezcan antiguos.
- ☐ Si el sitio está redirigiendo a sus visitas a páginas maliciosas, pídanos en el ticket que lo bloqueemos temporalmente mientras trabaja.
🚪 Fase 1: Accesos fuera de WordPress
Primero se cierran las puertas que el atacante pudo dejar en la cuenta, para que no vuelva a entrar mientras usted limpia.
- ☐ Tareas cron del panel («Trabajos de Cron» o «Cron Jobs»). Lo normal es nada o solo la llamada a
wp-cron.php. Anote y elimine las que no reconozca, sobre todo las que descargan algo (curl,wget) o ejecutan archivos con nombres raros. - ☐ Cuentas FTP: elimine las que usted no creó.
- ☐ Accesos remotos a MySQL (cPanel: «MySQL remoto»): elimine los hosts que no reconozca.
- ☐ Claves SSH y tokens de API (en cPanel, «Acceso SSH» y «Administrar tokens de API»): elimine los que no haya creado usted.
- ☐ Raíz de la cuenta, fuera de
public_html: busque archivos.phpsueltos que no reconozca y muévalos a la cuarentena. No toque las carpetas del sistema (mail,etc,logs,ssl,tmp,.cpanel,.cagefsy otras que empiezan con punto). - ☐ Restos peligrosos dentro de
public_html: volcados de base de datos (.sql,.sql.gz), respaldos.zip, y herramientas comoadminer.php,phpinfo.phposearchreplacedb2.php. Cualquiera los puede descargar o usar desde internet, y muchas veces son la puerta de entrada. Muévalos fuera depublic_html.
⚙️ Fase 2: Núcleo de WordPress
El núcleo (core) no se revisa archivo por archivo: se reemplaza entero por una copia oficial.
- ☐ Descargue la misma versión que anotó desde wordpress.org/download/releases. Usar otra versión ahora puede romper plugins; la actualización se hace en la Fase 5.
- ☐ Suba el zip fuera de
public_htmly descomprímalo ahí. - ☐ Mueva
wp-adminywp-includesde su sitio a la cuarentena y ponga en su lugar las carpetas de la copia oficial. - ☐ Reemplace los archivos sueltos de la raíz del sitio (
index.php,wp-login.php,wp-settings.php,wp-load.php,xmlrpc.phpy el resto dewp-*.php) por los de la copia oficial. No reemplacewp-config.php. - ☐ Cualquier otro
.phpen la raíz del sitio que no venga en el zip oficial y que usted no reconozca: a la cuarentena. - ☐ Revise
wp-config.phplínea por línea comparándolo conwp-config-sample.php. Solo deberían cambiar los datos de la base de datos, las claves (salts), el$table_prefixy las constantes que usted agregó. Señales de alarma:includeorequirede archivos desconocidos,eval,base64_decode,gzinflate, textos largos sin sentido, o código pegado al principio o al final del archivo. - ☐ Reemplace el
.htaccessde la raíz por el .htaccess por defecto de WordPress. Si usa LiteSpeed Cache, después vuelva a guardar la configuración del plugin para que escriba de nuevo su bloque. - ☐ Revise si hay
.user.iniophp.inien el sitio con la directivaauto_prepend_file: hace que un archivo se ejecute antes que WordPress en cada visita. Si no la puso usted, es del atacante.
📦 Fase 3: wp-content (la parte más importante)
Aquí se esconde casi todo el malware que sobrevive a una limpieza.
- ☐ Raíz de
wp-content: lo normal es unindex.phpcasi vacío y las carpetas. Los únicos otros.phplegítimos son los «drop-ins» que crean plugins de caché (advanced-cache.php,object-cache.php, a vecesdb.php). Si no usa el plugin que los crea, a la cuarentena. - ☐
wp-content/mu-plugins: los «plugins obligatorios» se cargan siempre y no aparecen en la lista normal de plugins. Es uno de los escondites favoritos. Si no sabe qué hace un archivo de esta carpeta, a la cuarentena. - ☐ Plugins: elimine todos los inactivos. Cada plugin activo, reinstálelo: borre su carpeta y suba una copia limpia de la misma versión, descargada de wordpress.org o del sitio del desarrollador. Mirar el código no basta, porque el malware se agrega a archivos legítimos y puede parecer PHP normal. Las carpetas con nombres que no reconoce, a la cuarentena.
- ☐ Temas: deje solo el tema activo (y su tema padre, si usa uno hijo) y reinstálelos desde la fuente oficial. En el tema hijo, revise a mano
functions.phpy cada archivo.php. - ☐ Uploads: en
wp-content/uploadsno debería haber archivos.php. Fíjese también en archivos con extensión de imagen o sin extensión que, al abrirlos, empiezan con<?php, y en archivos.htaccessque usted no creó. - ☐ Carpetas con nombre de números o letras al azar (por ejemplo
495633oa8f3e1) dentro dewp-admin,wp-includes,wp-content,.well-knownocgi-bin: casi siempre guardan malware. - ☐ Archivos
.htaccessrepartidos en muchas carpetas que permiten ejecutar solo ciertos archivos PHP. La lista de nombres que permiten suele ser el mapa de los archivos del atacante: búsquelos. - ☐ Vacíe las carpetas de caché (
wp-content/cacheywp-content/litespeed). - ☐ Plugins piratas («nulled») o comprados en sitios que revenden plugins premium como «GPL»: elimínelos y reemplácelos por la versión oficial con licencia. Traen malware de fábrica y no reciben actualizaciones.
🗄️ Fase 4: Base de datos (phpMyAdmin)
- ☐ Exporte la base de datos desde phpMyAdmin («Exportar») antes de editar nada, y guarde el archivo fuera de
public_html. Si su sitio recibe pedidos, el respaldo de anoche no tiene los de hoy. - ☐ Revise el prefijo de las tablas en
$table_prefixdewp-config.php. Muchas veces no eswp_; en los pasos siguientes use el suyo. - ☐ Administradores: el malware puede ocultar usuarios en el escritorio de WordPress, así que revíselos en phpMyAdmin. En la tabla
usermeta, use «Buscar» conmeta_keyigual a[prefijo]capabilitiesymeta_valueLIKE%administrator%, y compare losuser_idcon la tablausers. Señales de un admin falso: usuario, nombre y nombre visible idénticos y al azar, sin entradas publicadas, o correos comoadminbackup@wordpress.org. Verifique antes de borrar: hay instaladores que crean administradores legítimos con correos extraños. - ☐ En la tabla
options, revise quesiteurlyhomesean su dominio, y queusers_can_registeresté en 0 (salvo que usted permita registros) ydefault_roleensubscriber. - ☐ Con «Buscar» sobre toda la base, busque
<script,eval(,base64_decode,position: fixed; top: -yleft:-9999px. Esto encuentra scripts inyectados y enlaces de spam escondidos fuera de la pantalla. Ojo: los códigos de Google Analytics, píxeles y chats también son scripts legítimos. - ☐ Si usa Elementor, el spam puede estar en el diseño de la página y no solo en el texto. Abra la página en Elementor y elimine el widget HTML escondido, o vuelva a una revisión anterior a la infección.
- ☐ Revise los plugins que guardan código en la base de datos, como Code Snippets, WPCode o Insert Headers and Footers: elimine los fragmentos que no haya creado usted.
- ☐ No edite a mano en phpMyAdmin opciones serializadas como
active_plugins: un carácter mal contado deja el sitio caído. Para activar o desactivar plugins use el escritorio de WordPress.
🔑 Fase 5: Claves, sesiones y actualizaciones
Este paso va después de limpiar. Si cambia las claves con el malware todavía dentro, el atacante puede robar las nuevas.
- ☐ Si cree que le robaron las claves (por ejemplo, porque nadie más las tenía), revise con un antivirus el computador desde el que administra el sitio antes de crear las nuevas.
- ☐ Cambie la clave del panel, de las cuentas FTP, de todos los administradores de WordPress y del usuario de la base de datos (y actualícela en
wp-config.php). Si alguna cuenta de correo usa la misma clave, cámbiela también. - ☐ Regenere las claves de seguridad (salts) de
wp-config.phpcon las que entrega api.wordpress.org/secret-key/1.1/salt. Así se cierran todas las sesiones abiertas; cambiar la clave no las cierra. - ☐ En «Usuarios» de WordPress, revise en cada administrador las contraseñas de aplicación y elimine las que no reconozca.
- ☐ Ahora sí, actualice WordPress, plugins y temas a sus últimas versiones.
🔒 Fase 6: Cerrar la puerta
- ☐ Active la verificación en dos pasos para todos los administradores (vea 2FA en WordPress).
- ☐ Impida editar plugins y temas desde el escritorio agregando esta línea en
wp-config.php, antes de la línea/* That's all, stop editing! */:
define( 'DISALLOW_FILE_EDIT', true );
- ☐ Impida que se ejecute PHP en la carpeta de subidas: cree el archivo
wp-content/uploads/.htaccesscon este contenido (permisos 644):
<FilesMatch "\.(?i:php|php3|php4|php5|php7|php8|phtml|phps|pht|shtml|cgi|pl|py)$">
Require all denied
</FilesMatch>
Options -Indexes
- ☐ No guarde respaldos, volcados
.sqlni copias del sitio dentro depublic_html. - ☐ Use solo plugins y temas de wordpress.org o comprados al desarrollador, y elimine los que no use.
- ☐ No hace falta instalar un plugin de firewall: el WAF de Imunify360 ya protege el sitio. Si quiere un plugin de seguridad para alertas o verificación en dos pasos, elija uno reconocido.
✅ Fase 7: Verificar
- ☐ Purgue la caché (LiteSpeed Cache → «Purgar todo»). Si usa Elementor, regenere sus archivos CSS desde Elementor → Herramientas.
- ☐ Abra el sitio en una ventana de incógnito y desde el celular con datos móviles. Revise páginas internas, formularios y el carrito si tiene tienda.
- ☐ Busque en Google
site:su-dominio.com. Si aparecen páginas que usted no creó (casinos, farmacia, textos en japonés o chino), el sitio estaba mostrando spam solo a Google. En Google Search Console, revise «Problemas de seguridad», pida la revisión cuando esté limpio y solicite la retirada de las URL de spam. - ☐ Vuelva a revisar las Fases 3 y 4 a los dos o tres días: ¿archivos nuevos, administradores nuevos, tareas cron nuevas? Si algo reaparece, todavía queda una puerta abierta.
- ☐ Cuando esté seguro de que todo funciona, borre la carpeta de cuarentena y el WordPress descomprimido fuera de
public_html.
🙋 ¿Necesita ayuda?
Escríbanos en https://premiumhosting.cl/soporte/tickets/new/ con el dominio afectado. Podemos ayudarle a:
- Revisar qué detectó y limpió Imunify360 en su cuenta, y recuperar un archivo legítimo que haya sido limpiado.
- Buscar en los registros del servidor por dónde entró el atacante.
- Bloquear el sitio temporalmente mientras lo limpia.
- Restaurar un respaldo de JetBackup.
Si el malware reaparece después de seguir esta guía, no la repita desde cero: escríbanos con lo que encontró y lo revisamos juntos.