Cómo saber si un plugin nulled tiene una puerta trasera

Instalaste un plugin de pago descargado gratis de una web de nulled, o te lo dejó puesto la agencia que te hizo la web, y ahora te preguntas qué llevaba dentro. La respuesta corta: en una parte de esos paquetes, código añadido que no estaba en el original. La respuesta útil es que se puede comprobar, y que buena parte de las comprobaciones las puedes hacer tú desde el escritorio de WordPress y el gestor de archivos del hosting, sin saber programar.

En este artículo tienes qué buscar, dónde y en qué orden, y también dónde está el límite razonable de lo que deberías hacer por tu cuenta.

Por qué un plugin nulled sale mucho más caro de lo que ahorras

Un plugin nulled es una copia de un producto de pago a la que alguien le ha quitado la comprobación de licencia para que funcione sin clave. Ese «alguien» no lo hace por altruismo: mantiene webs, servidores y catálogos actualizados, y eso cuesta dinero. El modelo de negocio habitual es o bien la publicidad de esas webs, o bien lo que se pueda sacar de las instalaciones que confían en el archivo.

La cuenta es sencilla. Te ahorras el precio de una licencia anual. Si el paquete traía algo dentro, te enfrentas a una limpieza profesional, a la posible pérdida de posicionamiento mientras Google marca el dominio, a explicárselo a tus clientes si había datos personales de por medio y, si hubo acceso a datos, a las obligaciones que eso conlleva. No hay comparación posible entre las dos cifras.

Hay un segundo coste que se ve menos: el plugin nulled nunca se actualiza. Aunque la copia sea limpia, se queda congelada en la versión del día que la descargaste, con los fallos que se hayan publicado desde entonces sin corregir. Es el mismo problema que explicamos en la guía de vulnerabilidades en plugins de WordPress, pero garantizado de antemano.

Qué suele llevar dentro: administradores ocultos, enlaces y cargas remotas

No todos los paquetes llevan algo. Pero cuando lo llevan, se repiten unos pocos patrones:

  • Creación de un usuario administrador al activar el plugin, a veces oculto del listado de usuarios para que no lo veas.
  • Enlaces invisibles insertados en el pie o en la cabecera de la web, apuntando a webs de apuestas, farmacias o préstamos. Tu web se convierte en publicidad de otro y tu posicionamiento paga la factura.
  • Carga de código desde un servidor externo: el plugin descarga instrucciones de fuera cada cierto tiempo. Hoy puede no hacer nada; el día que su dueño quiera, hace lo que le pidan.
  • Un archivo de acceso remoto (lo que se llama una puerta trasera) escondido en una carpeta que no levanta sospechas, normalmente fuera de la propia carpeta del plugin, para sobrevivir a que lo desinstales.
  • Redirecciones condicionales: la web funciona normal para ti, y redirige a otro sitio solo para visitantes que llegan desde el móvil o desde Google. Si te suena el síntoma, tenemos el procedimiento en cómo encontrar y quitar una redirección maliciosa.

Cómo comparar los archivos con la versión original

Esta es la prueba que más vale y casi nadie hace. La idea es simple: si tienes el archivo legítimo, cualquier diferencia salta a la vista.

Si el plugin es gratuito y está en el repositorio oficial

Con acceso por consola tienes una orden que lo comprueba solo, comparando tus archivos con los oficiales:

wp plugin verify-checksums --all

Todo lo que te devuelva como modificado o como archivo que no debería estar ahí merece una mirada. Ojo: esto solo funciona con plugins alojados en wordpress.org. Los plugins de pago, que son justamente los que circulan como nulled, no están ahí.

Si el plugin es de pago

Aquí toca hacerlo a mano. Consigue el zip legítimo (comprando la licencia, que es hacia donde vas a acabar yendo de todas formas, o pidiéndoselo al fabricante si tienes derecho a él) y compara. En Windows te vale cualquier herramienta de comparación de carpetas; si tienes acceso por consola en el servidor, descomprime el original en una carpeta aparte y usa:

diff -r /ruta/plugin-original/ /ruta/wp-content/plugins/plugin-instalado/

Lo que te interesa no es cualquier diferencia (las hay legítimas por versión), sino dos cosas concretas: archivos que existen en tu copia y no en la original, y archivos donde hay líneas añadidas que no estaban. Presta especial atención a los que se ejecutan siempre: el archivo principal del plugin y todo lo que esté en carpetas del tipo includes/.

Truco rápido si no puedes comparar

Busca archivos recientes que no cuadren con la fecha de instalación. Con consola:

find wp-content/ -name "*.php" -mtime -30 -ls

Te lista los PHP modificados en los últimos treinta días. Si tú no has tocado nada y aparecen veinte, ya tienes por dónde tirar. Sin consola, ordena por fecha en el gestor de archivos del hosting, que también sirve.

Señales en la base de datos: usuarios, opciones y tareas programadas

Los archivos son la mitad de la historia. La otra mitad está en la base de datos, y hay tres sitios donde mirar.

Usuarios administradores

Empieza por Usuarios > Todos los usuarios y filtra por «Administrador». Pero no te fíes solo de esa pantalla: existen técnicas para esconder un usuario de ese listado sin borrarlo. La comprobación buena es contra la base de datos, desde phpMyAdmin:

SELECT u.ID, u.user_login, u.user_email, u.user_registered
FROM wp_users u
JOIN wp_usermeta m ON u.ID = m.user_id
WHERE m.meta_key = 'wp_capabilities'
  AND m.meta_value LIKE '%administrator%';

Cambia el prefijo wp_ por el que uses (lo tienes en wp-config.php, en la línea $table_prefix). Si el número de administradores que devuelve esta consulta no coincide con los que ves en el escritorio, tienes un problema serio y ya no estás ante una sospecha.

Opciones cargadas en cada visita

Hay código que se guarda en la tabla de opciones y se ejecuta en cada carga de página. Búscalo por tamaño:

SELECT option_name, LENGTH(option_value) AS tam
FROM wp_options
WHERE autoload = 'yes'
ORDER BY tam DESC
LIMIT 20;

Una opción enorme con un nombre sin sentido, tipo cadena de letras aleatorias, no es normal. Ábrela y mira qué contiene antes de tocar nada.

Tareas programadas

Muchas reinfecciones se apoyan en una tarea programada que reconstruye lo que borras. Si tienes consola:

wp cron event list

Busca eventos cuyo nombre no reconozcas o que no corresponda a ningún plugin que tengas instalado. Sin consola, hay plugins gratuitos de gestión de tareas programadas que te muestran la misma lista desde el escritorio.

Cómo revisar código sospechoso sin ser programador

No necesitas entender el código: necesitas reconocer las señales de que alguien ha querido esconder algo. El código legítimo de un plugin comercial es legible; el código insertado suele estar comprimido, codificado o metido todo en una línea kilométrica.

Si tienes acceso por SSH, esta búsqueda te da la mayoría de los casos en un segundo:

grep -rniE "eval(|base64_decode|gzinflate|str_rot13|create_function|assert(|$_COOKIE[" wp-content/plugins/ --include=*.php

Si no tienes SSH, casi todos los gestores de archivos de cPanel y Plesk tienen una función de búsqueda de texto dentro de archivos; y si te has descargado la carpeta a tu ordenador, cualquier editor de texto decente busca en carpetas enteras.

Qué significa lo que encuentres, sin tecnicismos:

  • eval(: ejecuta como programa un texto. Casi nunca hay una razón buena para que esté ahí.
  • base64_decode, gzinflate, str_rot13: convierten un galimatías en código legible justo antes de ejecutarlo. Es la forma clásica de esconder algo a simple vista. Aparecen también en usos legítimos, así que no es una condena, pero sí una bandera.
  • Líneas larguísimas de letras y números sin espacios: eso es carga escondida, no es código de un producto comercial.
  • Direcciones de internet dentro del código apuntando a dominios que no son los del fabricante.

Y una carpeta que casi nadie mira: /wp-content/mu-plugins/. Lo que está ahí se ejecuta siempre y no aparece en la lista de plugins del escritorio. Si existe y tú no la creaste, mira qué hay dentro.

Aquí conviene ser honesto sobre el límite. Encontrar una de estas señales es algo que puedes hacer tú. Determinar qué hacía exactamente ese código, desde cuándo estaba, qué se llevó y si dejó algo más es otro oficio. Si llegas a ese punto, para y pide ayuda en vez de borrar a lo loco: borrar destruye justo las pruebas que hacen falta para saber el alcance.

Quitar el plugin no elimina lo que ya te dejó dentro

Este es el error más caro de todos. Desinstalar el plugin nulled es necesario, pero no cierra el asunto, porque lo que hizo el primer día sigue ahí:

  • El usuario administrador que creó sigue existiendo, con su contraseña, y puede volver a entrar por la puerta principal.
  • Los archivos que dejó fuera de su carpeta siguen en su sitio: en uploads, en mu-plugins, en la raíz del sitio o dentro de otro plugin. Es un patrón general de este tipo de compromisos, y lo detallamos en cómo acaban apareciendo archivos PHP en la carpeta de subidas.
  • Las tareas programadas siguen ejecutándose y pueden recrear lo que borres.
  • Las modificaciones en wp-config.php, en .htaccess o en el tema activo se quedan donde estaban.

Por eso una web que tuvo un plugin nulled con sorpresa dentro no se arregla desinstalando: se limpia entera. Y si el paquete incluía además un gestor de archivos dentro de WordPress, la urgencia sube varios puntos; ahí te interesa leer por qué un gestor de archivos en WordPress es el objetivo preferido y qué hacer si lo tienes.

Regularizar la web: comprar la licencia y limpiar bien

El plan, en orden y sin rodeos:

  1. No borres todavía. Haz una copia completa del estado actual y guárdala aparte. Si luego hay que averiguar qué pasó, esa copia es la única prueba que vas a tener.
  2. Compra la licencia legítima del plugin, o sustitúyelo por una alternativa que puedas pagar. Reinstalar el mismo nulled «pero de otra web» es repetir el problema.
  3. Borra la carpeta del plugin nulled entera y sube la versión oficial desde cero. No la sobrescribas encima: los archivos añadidos que no existan en el original se quedarían.
  4. Revisa usuarios administradores con la consulta de arriba y elimina lo que no reconozcas.
  5. Cambia todas las contraseñas: administradores de WordPress, panel del hosting, FTP y base de datos.
  6. Cierra las sesiones abiertas renovando las claves de seguridad de wp-config.php (las líneas AUTH_KEY y siguientes). Generas un juego nuevo desde el servicio oficial de WordPress y las pegas encima de las antiguas. Eso expulsa a todo el mundo, incluido tú.
  7. Repasa tareas programadas, mu-plugins y la carpeta de subidas.
  8. Comprueba desde fuera: mira el código fuente de tu portada buscando enlaces que tú no has puesto, y revisa en Search Console si hay páginas indexadas que no reconozcas.

Y una recomendación que ahorra discusiones: si la web te la lleva una agencia y descubres que el plugin nulled lo puso ella, pídele por escrito la lista de plugins con su licencia. No es desconfianza, es saber qué estás pagando y de qué respondes tú ante tus clientes.

Si al hacer estas comprobaciones te has encontrado con un usuario que no reconoces, archivos raros o código escondido, ya no estás ante una sospecha: estás ante un compromiso con una fecha de inicio que conviene determinar. Si necesitas confirmar si ya tenías una puerta trasera dentro y hasta dónde llegó, un analista puede reconstruirlo a partir de los registros y decirte con datos qué pasó y desde cuándo, en vez de dejarlo en una intuición.

Seguir leyendo en esta sección

Ver todo en Seguridad de plugins WordPress → · Mapa completo del sitio

Seguridad Online es una publicación de PathSentinel — ARCADIA DEVSEC CLOUD S.L. Escribimos a partir de trabajo real de respuesta a incidentes.

¿Quieres saber si tu web tiene algo raro? Analízala gratis con PathScan

Vigilancia 24/7 · Investigación por analista · Muro de Honor · Mapa del sitio