Era un viernes cualquiera, a punto de terminar la jornada laboral. Entré al portal web donde trabajo, como hacía cada día, pero algo andaba mal. En la parte inferior de la página comenzaron a aparecer enlaces extraños, textos con palabras sin sentido y publicidad que no pertenecían a nuestro sitio.

Al principio pensé que podría ser un error de caché o algún plugin que se había actualizado mal. Pero al recargar, los enlaces seguían ahí. Peor aún, al revisar la base de datos descubrí un registro que se regeneraba solo cada vez que lo borraba.

No había duda: nos habían hackeado.
Lo que siguió fue una lucha contracorriente para limpiar archivos, rastrear backdoors y entender cómo un simple código malicioso podía esconderse tan profundo, infectando la base de datos y el FTP al mismo tiempo. Este artículo es el registro paso a paso de esa batalla y de cómo logramos recuperar el control del sitio.
1. Síntomas iniciales
- Aparecía texto con enlaces de spam (ej.
damabet,yakabet, etc.) en la parte inferior del sitio. - Se generaba un registro en la tabla
wp_optionsllamado_transient_wp_social_sm_bar_inlinecon código CSS malicioso. - Al borrar el registro, reaparecía al activar cualquier plugin, indicando un mecanismo de reinfección persistente.
2. Diagnóstico del mecanismo de reinfección
- Se descartaron lugares comunes:
mu-plugins(no existía),wp-config.php(limpio),.htaccess(se limpiaron reglas sospechosas que redirigían bots areadme.php). - Se encontró que el malware se regeneraba porque existían backdoors ocultos en archivos del sistema.
3. Búsqueda sistemática de backdoors (vía SSH)
- Se utilizaron comandos
greppara buscar patrones maliciosos:bashgrep -rl –include=”*.php” “wp_set_auth_cookie” /home/la2/ grep -rl –include=”*.php” “eval(base64_decode” /home/la2/ - Se identificaron los siguientes archivos infectados:
/home/la2/sitemap.php(backdoor que permitía iniciar sesión como administrador sin contraseña)/home/la2/wp-links-opml.php(contenía códigoeval(base64_decode(...)))/home/la2/wp-content/plugins/shortcodes-for-divi.php(plugin falso con el mismo código ofuscado)
4. Limpieza de los archivos maliciosos
sitemap.phpywp-links-opml.phpse eliminaron por completo (vía FTP o SSH).shortcodes-for-divi.phpno se pudo eliminar por permisos del sistema, por lo que se editó el archivo y se borró únicamente la línea que conteníaeval(base64_decode("ZXZhb...")).
5. Limpieza de la base de datos
- Se eliminó el registro persistente en
wp_options:sqlDELETE FROM wp_options WHERE option_name = ‘_transient_wp_social_sm_bar_inline’; - Se verificó que no quedaran otras opciones maliciosas (ej.
_hdra_core).
6. Verificación final
- Se reactivaron todos los plugins.
- Se recargó el sitio y se comprobó que el texto de spam no volvió a aparecer.
- Se confirmó que el registro en la base de datos no se regeneró.
7. Medidas de seguridad posteriores (recomendadas)
- Cambiar todas las contraseñas: hosting, FTP, base de datos, usuarios WordPress.
- Actualizar WordPress, temas y plugins a sus últimas versiones.
- Eliminar temas y plugins no utilizados.
- Instalar un firewall y escáner de seguridad (Wordfence o Sucuri).
- Configurar copias de seguridad automáticas diarias.
Análisis Técnico del Caso
Basado en las imágenes y en la descripción, esto es lo que descubrí:
- Naturaleza del Malware: Es un código malicioso persistente que utiliza la tabla
wp_optionsde tu base de datos para almacenar e inyectar publicidad y enlaces de spam (como los que muestran las imágenes) en tu sitio web . No es un simple archivo, sino un sistema complejo. - Mecanismo de Reinfección: El hecho de que el registro en la base de datos se regenere automáticamente después de que lo borras, especialmente cuando activas los plugins, es la clave del problema.
- Lo más probable es que uno de tus plugins (o tu tema) tenga una puerta trasera (backdoor). Al activar los plugins, el código malicioso se ejecuta, detecta que el registro en la base de datos no existe y lo vuelve a crear inmediatamente .
- También es muy posible que haya un script oculto en los archivos principales de WordPress, como
wp-cron.php, que se ejecuta periódicamente para verificar y restaurar el malware . Las imágenes de tu phpMyAdmin también confirman que el código inyectado se aloja directamente en la base de datos, una técnica común para persistir .

Guía de Limpieza Paso a Paso
Necesitamos un enfoque más agresivo. Sigue estos pasos en orden. Es importante que seas meticuloso.
Paso 1: Coloco el sitio en modo mantenimiento
Use el plugin como “WP Maintenance Mode” o añade un archivo .html temporal para que los visitantes vean un aviso mientras limpias. Esto evita que el malware se propague o que los usuarios vean contenido malicioso.
Paso 2: La “Limpieza Profunda” desde el hosting (Método más efectivo)
Olvídate del escritorio de WordPress por ahora. Conéctate directamente a tu hosting vía cPanel o FTP.
- Renombra la carpeta
plugins: Dentro dewp-content, renombra la carpetapluginsaplugins_old. Esto desactivará todos los plugins de golpe. - Cambia las contraseñas de todo: Usa un gestor de contraseñas para crear claves nuevas y robustas para:
- Tu usuario administrador de WordPress.
- Tu base de datos (usuario y contraseña).
- Tu cuenta de FTP y la de acceso al panel de hosting (cPanel).
- Reemplaza los archivos centrales de WordPress:
- Descarga una copia nueva y limpia de WordPress desde wordpress.org.
- Elimina las carpetas
wp-adminywp-includesde tu servidor. - Sube las carpetas
wp-adminywp-includesde la copia limpia que descargaste. - Reemplaza todos los archivos de la raíz de WordPress (excepto
wp-config.phpy la carpetawp-content). Esto eliminará cualquier backdoor en los archivos del núcleo .
- Inspecciona
wp-config.php: Ábrelo y busca cualquier línea sospechosa al principio o al final, especialmente código PHP extraño o peticiones a sitios web externos.
Paso 3: Limpieza radical de la base de datos (Usa phpMyAdmin)
Entra al phpMyAdmin de tu hosting y selecciona la base de datos de tu WordPress.
- Localiza el registro malicioso: Ve a la tabla
wp_options(o el prefijo que uses). - Borra el registro
transient_wp_social_sm_bar_inlineque viste en la captura. Pero no te detengas ahí. - Busca más basura:
- Ejecuta esta consulta SQL en la pestaña “SQL” para buscar otros “transients” maliciosos que puedan tener nombres similares:
- sql SELECT * FROM `wp_options` WHERE `option_name` LIKE ‘%transient%wp_social%’ OR `option_name` LIKE ‘%_transient%’
- Busca manualmente cualquier
option_nameque contenga URLs extrañas o nombres como_hdra_core,wp-antymalwary,cron_cleanup, etc. Si encuentras algo que no reconoces y parece código, bórralo . - Revisa la tabla
wp_posts: Busca en la columnapost_contententradas que contengan códigoiframeo scripts maliciosos. A veces el malware crea páginas ocultas.
Paso 4: Caza el archivo “zombie” (El que regenera todo)
Este es el paso más importante. El malware necesita un archivo para regenerarse. Los lugares más comunes son:
- Carpeta
wp-content/mu-plugins: Revisa si existe y si contiene algún archivo.phpextraño. Los “Must-Use Plugins” no se ven en el escritorio y son muy usados por los hackers . - Carpeta
wp-content/uploads: Busca archivos.phpaquí. No deberían existir. Revisa especialmente dentro de carpetas con años (ej.2023/,2024/). - Archivo
wp-cron.phpde la raíz: Descarga una copia limpia de WordPress y compara el archivowp-cron.phpque tienes en tu servidor con el original. Es probable que esté modificado . - Carpeta
wp-includes: Busca archivos con nombres que imiten a los legítimos pero que sean maliciosos, comoclass-wp-change.phpowp-user.php.
Pro-tip: Usa el administrador de archivos de tu hosting y ordena los archivos por fecha. Los archivos maliciosos suelen ser los más recientes.
Paso 5: Un truco para detener la reinfección (Mientras limpias)
Si identificas el nombre de la carpeta del plugin malicioso que se recrea (por ejemplo, wp-antymalwary-bot), puedes usar el “truco del archivo vacío” para bloquearlo temporalmente :
- Ve a la carpeta
wp-content/plugins/. - Crea un archivo vacío (no una carpeta) con el mismo nombre exacto que la carpeta del malware.
- Usa el gestor de archivos para cambiar los permisos de ese archivo a
000. Esto hará que el script malicioso no pueda crear la carpeta y falle su intento de reinfección.
Después de la limpieza: Prevención
- Actualiza todo: WordPress, cada uno de tus plugins y tu tema a la última versión.
- Elimina lo que no uses: Borra cualquier plugin o tema inactivo que tengas.
- Instala un firewall: Usa un plugin de seguridad como Wordfence o Sucuri, y mantenlo activo y actualizado.
- Cambia tus hábitos: No uses “admin” como usuario y activa la autenticación de dos factores (2FA) si es posible.
Después de realizar estos 5 pasos, logre identificar la cadena la cual se estaba copiando en más de un plugin, en total afecto a 15 plugin, los cuales fueron examinados y eliminando la cadena maliciosa.
Pasamos a revisar el archivo .htaccess el cual tenia componentes extraños, los cuales se eliminaron:
Lo que es MALICIOSO (lo que está después)
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} (bot|crawl|slurp|spider|google|msnbot|yahoo) [NC]
RewriteRule ^.*$ readme.php [L]
¿Qué hace este código malicioso?
- Detecta a los motores de búsqueda: La condición
%{HTTP_USER_AGENT}revisa si quien visita el sitio es un “bot” o “spider” de Google, Yahoo, etc. - Redirige a los bots a
readme.php: En lugar de mostrar tu página normal, cuando un motor de búsqueda (Google, Bing, etc.) intenta indexar tu sitio, es redirigido a un archivo llamadoreadme.php. - El propósito: Este
readme.php(que probablemente también existe en tu servidor) contiene código malicioso que se ejecuta cuando los bots lo visitan. Esto puede servir para:- Hacer que Google indexe versiones con spam de tu sitio.
- Mostrar contenido diferente a los bots (cloaking).
- Mantener activo el malware.
Activar plugins uno por uno (El detective)
Este es el paso más importante. Vas a activar tus plugins de uno en uno hasta que el malware reaparezca.
¿Cómo hacerlo?
- Activa UN SOLO plugin (elige uno, preferiblemente el que no sea esencial o el más sospechoso).
- Revisa si el malware volvió:
- Abre tu sitio web en una ventana de incógnito (Ctrl+Shift+N).
- Busca en la parte inferior si aparecen los enlaces de spam.
- También revisa en phpMyAdmin la tabla
wp_optionsbuscando el registrotransient_wp_social_sm_bar_inline.
- Si no hay malware: desactiva ese plugin y pasa al siguiente.
- Si aparece malware: ¡lo encontraste! Anota el nombre del plugin y no lo actives más.
¿En qué orden activar?
Te sugiero este orden (de más a menos sospechoso):
- Plugins de redes sociales (por el nombre
wp_social_sm_bar_inline) - Plugins de caché o rendimiento
- Plugins que no reconoces o que instalaste de fuentes no oficiales
- Plugins gratuitos de repositorios externos
- Plugins oficiales y conocidos (dejando los más confiables para el final)
Importante: Si al activar un plugin el malware reaparece, no lo desactives todavía. Anótalo y luego lo eliminamos.
Una vez identificado el plugin malicioso
Cuando encuentres qué plugin está generando el malware:
Opción A: Si es un plugin legítimo pero vulnerado
- Elimínalo completamente (no solo desactivar, bórralo de
wp-content/plugins). - Descarga una versión limpia y actualizada desde el repositorio oficial de WordPress o desde la página del desarrollador.
- Instala la versión limpia.
- Verifica que el malware no reaparezca.
Opción B: Si es un plugin pirata, desconocido o sospechoso
- Elimínalo y no lo vuelvas a usar.
- Busca una alternativa segura y confiable.
Limpieza profunda de la base de datos
Incluso después de eliminar el plugin, pueden quedar residuos. Ve a phpMyAdmin y ejecuta estas consultas SQL (una por una):
sql
-- Buscar opciones transients maliciosas DELETE FROM wp_options WHERE option_name LIKE '%_transient%wp_social%'; -- Buscar opciones que contengan código ofuscado DELETE FROM wp_options WHERE option_value LIKE '%base64_decode%' AND option_value LIKE '%eval%'; -- Buscar opciones con enlaces sospechosos (cambia el dominio por el tuyo) DELETE FROM wp_options WHERE option_value LIKE '%librarylea.com%' OR option_value LIKE '%evoldrone.com%' OR option_value LIKE '%leasun.com%'; -- Limpiar transients expirados (seguro de hacer) DELETE FROM wp_options WHERE option_name LIKE '_transient_%' AND option_value LIKE '%a:0:%';
Precaución: Si no estás seguro, haz una copia de seguridad de la base de datos antes de ejecutar estas consultas.
Revisar archivos del tema (especialmente si usas Divi)
Como usas Divi, revisa estos lugares:
4.1 Funciones del tema
- Ve a
wp-content/themes/Divi/functions.php - Busca al final del archivo código extraño (especialmente después del
?>final, si es que existe). - Busca funciones como
add_action('wp_head'oadd_action('wp_footer'que llamen a URLs externas.
4.2 Tema hijo (si usas uno)
- Si tienes un tema hijo de Divi, revisa su
functions.phptambién.
4.3 Carpeta de opciones de Divi
- A veces el malware se esconde en
wp-content/uploads/et_temp/o enwp-content/uploads/divi/ - Revisa si hay archivos
.phpen esas carpetas (no deberían existir).
Medidas finales de seguridad
Una vez que el sitio esté limpio y funcionando:
5.1 Cambia todas las contraseñas
- WordPress (todos los usuarios administradores)
- Base de datos
- FTP
- Panel de hosting (cPanel, Plesk, etc.)
5.2 Instala un firewall y escáner de seguridad
- Wordfence o Sucuri Security (versión gratuita es suficiente)
- Ejecuta un escaneo completo
5.3 Actualiza todo
- WordPress a la última versión
- Todos los plugins
- El tema Divi
5.4 Elimina lo que no uses
- Plugins inactivos
- Temas que no estés usando (excepto el tema por defecto de WordPress como fallback)
5.5 Configura copias de seguridad automáticas
- Usa UpdraftPlus o el sistema de backup de tu hosting
- Programa copias diarias o semanales
Resumen de tu plan de acción ahora mismo
| Paso | Estado | Acción |
|---|---|---|
| .htaccess limpio | ✅ COMPLETADO | – |
| readme.php eliminado | ✅ COMPLETADO | – |
Y por fin, encontramos la cadena que estaba molestando:
La Limpieza Quirúrgica de la Base de Datos
Entra a phpMyAdmin. IMPORTANTE: Antes de hacer esto, exporta una copia de seguridad de tu base de datos.
Ejecuta esta consulta SQL (copia y pégala en la pestaña “SQL”) para buscar los “nombres fantasma” en la tabla wp_options:
sql
SELECT * FROM `wp_options` WHERE `option_name` REGEXP '^[0-9a-f]{32}$' AND `option_value` LIKE '%base64%'
¿Qué hace esto? Busca registros cuyo option_name sea un código de 32 caracteres (como un hash) y cuyo contenido esté ofuscado .
- Si la consulta devuelve resultados: Anota los
option_namey luego elimina esos registros. - Si no devuelve resultados: Busca manualmente cualquier
option_nameque sea una cadena larga y sin sentido, o que contenga_hdra_core.
Ahora ingresamos a sesión SSH, para tener más control en la búsqueda de archivos y contenido:
Buscar solo archivos que contengan código malicioso conocido
Ejecuta este comando en SSH:
bash
grep -rl --include="*.php" "wp_set_auth_cookie" /home/XX
¿Qué hace? Busca recursivamente todos los archivos PHP que contengan la función wp_set_auth_cookie, que es la que usaba el backdoor sitemap.php para iniciar sesión sin contraseña.
Si el comando devuelve resultados, copia la lista de archivos aquí.
Si no devuelve nada, ejecuta este otro:
bash
grep -rl --include="*.php" "eval(base64_decode" /home/XX

La maldita cadena, estaba ocultada en estos archivos:
eval(base64_decode(“ZXZhbChnemluZmxhdGUoYmFzZTY0X……)
¿Qué es exactamente este código?
Es un “cargador” (loader) malicioso que funciona así:
- Primera capa:
eval(base64_decode(...))→ Ejecuta código PHP ofuscado. - Segunda capa: Dentro hay
gzinfalate()→ Descomprime datos comprimidos. - Tercera capa: Más
base64_decode→ Revela el código malicioso real.
Lo que hace este código es crear y mantener activo el malware en tu sitio, incluyendo el registro transient_wp_social_sm_bar_inline que has estado eliminando.
Búsqueda con Comandos (La Opción Más Certera)
Si tienes acceso a la terminal de tu servidor (vía SSH), esta es la forma más rápida y efectiva de encontrar código malicioso. Si no, no te preocupes, pasaremos a la búsqueda manual.
Conéctate a la raíz de tu WordPress y ejecuta estos comandos en este orden:
- Buscar archivos maliciosos recientes: Esto te mostrará cualquier archivo que se haya creado o modificado en los últimos 7 días, un periodo muy sospechoso.bashfind . -type f -mtime -7Analicemos: Te dará una lista. Revisa cada ruta. Presta especial atención a archivos
.phpen ubicaciones inesperadas comowp-content/uploads/o archivos con nombres extraños. Si ves algo que no reconoces, puede ser el backdoor. - Buscar dentro de los archivos: Ahora buscaremos el “código madre” dentro de los archivos.bashgrep -r “transient_wp_social_sm_bar_inline” .Analicemos: Este comando busca el nombre exacto del registro que se regenera. El archivo que contiene esta línea podría ser el que lo escribe en la base de datos.
- Buscar funciones peligrosas comunes: Los hackers suelen usar funciones PHP específicas para ocultar su código. Ejecuta estos comandos uno tras otro.bashgrep -r “eval(” . grep -r “base64_decode” . grep -r “gzuncompress” . grep -r “str_rot13” .Analicemos: Te mostrarán todos los archivos que contienen estas funciones. Sabemos que ya tenías una línea con
eval(base64_decode(...)), así que esto te ayudará a encontrar si hay más código similar escondido en otros lugares.
Limpieza final de la base de datos
Después de eliminar el archivo malicioso, haz esto:
- Borra el registro
transient_wp_social_sm_bar_inlinedewp_options(como ya has hecho). - Ejecuta esta consulta SQL para buscar otros posibles residuos:sqlDELETE FROM wp_options WHERE option_value LIKE ‘%librarylea.com%’ OR option_value LIKE ‘%evoldrone.com%’ OR option_value LIKE ‘%leasun.com%’;
Conclusión
El malware utilizaba múltiples backdoors (especialmente en archivos de los plugin) que se ejecutaban al activar cualquier plugin, regenerando el código en la base de datos. Al eliminar esos archivos (o limpiar su contenido ofuscado) y borrar el registro persistente, el problema se resolvió definitivamente.
¿Por Dónde Es Más Probable que Entraron?
El ataque que viviste fue complejo y persistente, lo que apunta a un punto de entrada sólido. Los vectores más comunes para este tipo de infección suelen ser:
- Vulnerabilidades en Plugins o Temas (la causa más probable): Esta es, con diferencia, la puerta de entrada más común en este tipo de ataques. Los hackers buscan de forma activa y masiva vulnerabilidades conocidas en plugins y temas populares. Un plugin o tema desactualizado es un blanco perfecto. En tu caso, infectaron archivos de plugins legítimos como
shortcodes-for-divi.php(que es un nombre falso) y otros, lo que es una práctica habitual. La magnitud del ataque, con sus mecanismos de reinfección, también apunta a una vulnerabilidad crítica, como las que permiten la ejecución remota de código (RCE) sin necesidad de autenticarse. - Credenciales de Acceso Comprometidas: Otra posibilidad es que el atacante obtuviera tus credenciales de FTP, SFTP, el panel de control de hosting o un usuario administrador de WordPress. Con este acceso, pudieron subir los archivos maliciosos
sitemap.phpyshortcodes-for-divi.phpdirectamente. Esto pudo deberse a un ataque de fuerza bruta, phishing o a que usaras una contraseña débil o reutilizada. - Infección a Través de un Plugin Legítimo Comprometido: En los últimos años, ha habido incidentes en los que atacantes lograron inyectar código malicioso directamente en plugins alojados en el repositorio oficial de WordPress. Si instalaste o actualizaste un plugin durante un período en el que estuvo comprometido, es posible que la infección viniera de una fuente “oficial” sin que tú lo supieras.
Blindaje Post-Infección (Pasos Clave)
Independientemente de por dónde entraron, estos son los pasos OBLIGATORIOS para blindar tu sitio ahora:
- Contraseñas nuevas y robustas: Cámbialas todas: la de tu base de datos, la de tu cuenta de hosting/FTP, la de cualquier usuario con rol de administrador y la de los editores clave.
- Actualización forzosa: Actualiza WordPress, todos los plugins y todos los temas. Deshazte de los que no uses.
- Capa extra de seguridad: Firewall y 2FA: Es fundamental que instales un plugin de seguridad como Wordfence o Sucuri y habilites la autenticación de dos factores (2FA) para todos los usuarios con privilegios.
- Monitoreo y copias de seguridad: Configura copias de seguridad automáticas diarias (externas a tu servidor) y activa el monitoreo de integridad de archivos que ofrecen estos plugins de seguridad. Así te avisarán si algo vuelve a cambiar sin tu permiso.


Comments are closed