Un sitio tomado no suele quedar desfigurado. La desfiguración es rara porque acaba con el acceso; lo común son páginas de spam, redirecciones que solo se disparan para quien llega desde un buscador, y correo enviado desde tu servidor. A ti, con la sesión abierta y tecleando la dirección directamente, todo te parece bien.

Las señales

  • Resultados de búsqueda de tu dominio que tú no escribiste.
  • Correo salido de tu servidor que rebota en cantidades que no sabes explicar.
  • Un salto de procesador o de tráfico saliente sin salto de visitantes.
  • Un visitante que informa de una redirección que tú no consigues reproducir.
  • Tu proveedor o un navegador advirtiendo sobre el sitio.

Cuatro órdenes

# 1. files changed in the last week, ignoring the ones that should change
find /var/www/site -type f -mtime -7 -not -path '*/storage/*' -not -path '*/cache/*' | head -50

# 2. PHP where PHP has no business being
find /var/www/site/uploads /var/www/site/public/img -name '*.php*' 2>/dev/null

# 3. the shapes an injected shell takes
grep -rEl 'eval\(|base64_decode\(|gzinflate\(|assert\(\$' /var/www/site --include='*.php' | head

# 4. logins that succeeded
sudo grep "Accepted" /var/log/auth.log | tail -20

Compara contra algo de fiar

Si el código está en git, la respuesta más rápida del mundo es git status en el servidor: todo lo modificado o sin seguimiento que tú no pusiste ahí es tu respuesta en una línea. Para un gestor de contenidos, vuelve a descargar la misma versión y compara con ella los archivos del núcleo.

La base de datos también cuenta

El contenido inyectado vive muchas veces en la base de datos y no en los archivos, y por eso un escaneo de archivos limpio demuestra menos de lo que se cree; consulta Malware en la base de datos, no en los archivos.

Si encuentras algo, no empieces borrando. Copia primero el sitio entero y los registros: son el único testimonio de cómo entraron, y sin ellos cerrarás el expediente dejando la puerta abierta. Después sigue Limpiar bien un sitio hackeado.