Un análisis de archivos limpio no es un sitio limpio. Los scripts inyectados viven tan ricamente en el contenido: el cuerpo de una entrada, un widget, una fila de ajustes, una opción del tema. Reinstalar la aplicación sustituye los archivos y deja todos esos exactamente donde estaban.

Búscalo

SELECT * FROM wp_posts
 WHERE post_content LIKE '%<script%'
    OR post_content LIKE '%eval(%'
    OR post_content LIKE '%base64_decode%'
 LIMIT 50;

SELECT option_name, LEFT(option_value, 120) FROM wp_options
 WHERE option_value LIKE '%<script%' LIMIT 50;

La misma idea vale para cualquier esquema: las columnas de texto que ven los visitantes, más la tabla de ajustes. Buscar una etiqueta script en contenido que jamás debería llevar una encuentra la mayor parte.

O busca directamente en todo el volcado

Más rápido que adivinar tablas, y funciona en un esquema que no conoces.

mysqldump -u user -p dbname > /tmp/scan.sql
grep -n -E '<script|eval\(|base64_decode|document\.write' /tmp/scan.sql | head -40
shred -u /tmp/scan.sql

Límpialo

  1. Haz antes una copia de la base — estás a punto de lanzar sentencias UPDATE sobre contenido en producción.
  2. Arregla una fila a mano — confirma la cadena exacta y que al quitarla queda un contenido válido.
  3. Y después el resto, con un alcance estrecho — UPDATE wp_posts SET post_content = REPLACE(post_content, '<script src="//bad.example"></script>', '') WHERE post_content LIKE '%bad.example%';
  4. Compara el recuento antes y después — un REPLACE que toca más filas de las que encontró tu SELECT significa que el patrón es demasiado amplio.
No lances nunca un REPLACE amplio sobre todas las columnas de texto a la vez. Es la forma más rápida de convertir una intrusión en pérdida de datos, y la copia que hiciste hace dos minutos pasa a ser el único ejemplar de tu contenido.

Y después cierra la puerta

El contenido se inyecta a través de algo: un complemento viejo, una contraseña de administrador robada, una carpeta de subidas con permiso de escritura. Limpiar las filas sin encontrar eso significa que vuelve en cuestión de días. Consulta Limpiar un sitio comprometido.