Logo
WP Fix by Blimx

Pharma Hack Forense — Anatomía y Limpieza

Actualizado:
SecurityMalware

Qué es el pharma hack

El pharma hack es la familia de malware WordPress más longeva — primero documentada en 2010, aún activa en 2026. Su objetivo es spam SEO: insertar enlaces a Viagra, Cialis y otras páginas de farmacia en tu sitio para manipular rankings Google para esos términos.

Lo que lo hace peligroso no es el payload — es el cloaking. El hack se esconde de admins logueados y visitantes ordinarios. Solo el bot de Google ve el spam. Para cuando notas que tu sitio está "vendiendo Viagra" en resultados de búsqueda Google, la infección ha estado componiéndose por meses.

Este artículo es nuestro playbook forense completo: cómo detectar, cómo limpiar, y cómo prevenir recurrencia.

Cómo se hace cloaking

El pharma hack usa tres técnicas de cloaking en combinación:

1. Cloaking basado en User-Agent

El hack revisa el header HTTP User-Agent. Si coincide con Googlebot, Bingbot u otro crawler de motor de búsqueda, la página renderiza con spam pharma inyectado. Si coincide con un navegador regular, no se muestra spam.

2. Cloaking basado en Referrer

Algunas variantes solo inyectan cuando el referrer es google.com u otros motores de búsqueda, asegurando que tráfico Google real ve spam mientras visitantes directos no.

3. Cloaking basado en cookie

Si una cookie de "logueado como admin" está presente, el malware sale temprano sin inyectar. Por esto nunca ves nada mal navegando tu propio sitio.

Detección: mira lo que Google ve

La única forma confiable de detectar un pharma hack es buscar tu sitio como si fueras Googlebot:

curl -A "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" \
     -H "Referer: https://www.google.com/" \
     https://yoursite.com/ | grep -iE "viagra|cialis|pharmacy|levitra|tadalafil"

Si el output contiene keywords de farmacia, estás infectado.

Alternativa: Google Search Console → URL Inspection → Test Live URL. Mira el HTML renderizado. Si ves enlaces farmacéuticos ahí pero no en tu navegador, ese es el hack confirmado.

Dónde vive el payload

Hemos categorizado sitios infectados en cuatro patrones de payload:

Patrón A — Residente en base de datos

El contenido malicioso se guarda en la tabla wp_options, a menudo en nombres custom como wp_inject_data, wp_seo_cache, o entradas con nombre aleatorio. El código PHP que lee y sirve esto está en un solo archivo añadido a wp-content/plugins/ o wp-content/mu-plugins/.

Patrón B — Inyección en functions.php del tema

Un bloque PHP fuertemente ofuscado (a menudo codificado en base64 múltiples veces) añadido al functions.php del tema activo. El bloque se decodifica en runtime, busca el contenido pharma de un servidor C2 remoto, inyecta.

Patrón C — Modificación de archivos del core

Un archivo del core de WordPress (a menudo wp-blog-header.php o index.php) recibe una pequeña inyección @include('/path/to/malware') al inicio. El malware real vive fuera de wp-content/.

Patrón D — Backdoor en wp-config.php

Un pequeño eval() o require_once() al inicio de wp-config.php cargando código remoto o un archivo local oculto. La variante más difícil porque wp-config.php normalmente se confía.

Procedimiento de limpieza forense

No solo borres archivos que encuentres. El hack siempre tiene backdoors que re-infectan. El proceso limpio es:

Fase 1 — Identificación

cd /var/www/yoursite

# Encuentra archivos PHP modificados recientemente
find . -name "*.php" -mtime -30 -type f | grep -v "wp-content/cache"

# Encuentra archivos con patrones sospechosos
grep -rE "eval\(.*base64_decode|preg_replace.*\/e|system\(.*\\$_" --include="*.php" .

# Encuentra archivos no-estándar en directorios del core
ls -la wp-admin/ wp-includes/ | grep -v "^d"

Guarda un snapshot de cada archivo marcado:

mkdir -p /tmp/forensics-$(date +%Y%m%d)
cp suspicious_file.php /tmp/forensics-$(date +%Y%m%d)/

Fase 2 — Limpieza de base de datos

-- Busca opciones sospechosas
SELECT option_name, LEFT(option_value, 100) FROM wp_options
WHERE option_value LIKE '%eval%'
   OR option_value LIKE '%base64%'
   OR LENGTH(option_value) > 100000;

-- Busca usuarios admin ocultos
SELECT u.ID, u.user_login, u.user_email, u.user_registered
FROM wp_users u
JOIN wp_usermeta um ON u.ID = um.user_id
WHERE um.meta_key = 'wp_capabilities' AND um.meta_value LIKE '%administrator%';

-- Busca contenido spam en posts
SELECT ID, post_title FROM wp_posts
WHERE post_content REGEXP 'viagra|cialis|tadalafil';

Borra opciones maliciosas, dropea usuarios admin no autorizados, limpia posts spam.

Fase 3 — Restauración de archivos

Restaura el core de WordPress de una descarga limpia:

wp core download --skip-content --force

Esto reescribe todos los archivos del core con versiones verificadas. No toca wp-content/.

Para temas y plugins:

# Reinstala cada plugin activo
wp plugin list --field=name --status=active | xargs -I {} wp plugin install {} --force

# Reinstala el tema
wp theme install <theme-slug> --force

Si usas un tema custom, restáuralo de control de versiones o un backup conocido limpio.

Fase 4 — Caza de backdoors

Esta es la fase crítica. Los backdoors son archivos PHP pequeños, a menudo únicos por infección. Busca exhaustivamente:

# Archivos en ubicaciones inusuales
find wp-content/uploads/ -name "*.php" -type f
# Archivos con modificación muy reciente pero nombres de aspecto original
find . -name "*.php" -mtime -60 -type f -exec grep -l "eval\|base64_decode" {} \;

# Archivos ocultos
find . -name ".*.php" -type f

Para cada archivo PHP encontrado en uploads/, bórralo. Uploads nunca debería contener PHP ejecutable.

Fase 5 — Rotación de credenciales

El pharma hack a menudo deja una caché de credenciales robadas. Rota todo:

  • Todas las contraseñas de usuarios WordPress
  • Contraseña de base de datos (actualiza ambos MySQL y wp-config.php)
  • Salts de WordPress en wp-config.php (usa https://api.wordpress.org/secret-key/1.1/salt/)
  • Claves API de cualquier servicio tercero
  • Contraseñas FTP/SSH
  • Contraseña del panel del hosting

Fase 6 — Re-enviar a Google

Una vez el sitio esté limpio:

  1. Google Search Console → Security Issues → Request Review
  2. Incluye una descripción breve de qué se infectó y qué limpiaste
  3. Espera 24-72 horas para que Google re-crawlee

Hasta que Google revise, tu sitio puede quedar marcado como "deceptive" en resultados de búsqueda.

Setup de prevención

Tras la limpieza, despliega el endurecimiento que previene recurrencia:

  • WAF (Cloudflare Pro) con ruleset gestionado de WordPress → bloquea ~80% de intentos automatizados de re-infección
  • Monitoreo de integridad de archivos → alerta en cualquier archivo PHP nuevo en wp-content/
  • DISALLOW_FILE_EDIT = true en wp-config.php
  • 2FA en cada cuenta administrator
  • Backups diarios fuera del sitio con simulacros mensuales de restauración
  • Suscripción Patchstack → alertas de 24 horas en CVEs de plugins

Errores comunes durante limpieza de pharma hack

  • Solo borrar enlaces spam visibles — se pierde el backdoor; el sitio se re-infecta en horas
  • Confiar en "auto-clean" de Wordfence — su scanner atrapa el archivo obvio pero raramente las opciones de base de datos o inyecciones del core
  • No rotar credenciales — el atacante a menudo vuelve por login admin robado
  • Saltar el resubmit al motor de búsqueda — el sitio queda blacklisteado innecesariamente

Cuándo llamar a un especialista

Un pharma hack que sobrevivió una limpieza básica es señal de múltiples vectores de compromiso. Sin trabajo a nivel forense, estarás limpiando el mismo hack mensualmente.

Eliminación de malware de emergencia — típicamente limpiamos pharma hacks en 4-8 horas incluyendo el paso de endurecimiento. Para respuesta más amplia a hacks ve reparación de sitio hackeado.