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 --forceEsto 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> --forceSi 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 fPara 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:
- Google Search Console → Security Issues → Request Review
- Incluye una descripción breve de qué se infectó y qué limpiaste
- 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 = trueenwp-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.

