Etiqueta: malware

  • Error 403 Forbidden en WordPress: problema de permisos o malware

    Error 403 Forbidden en WordPress: problema de permisos o malware

    Error 403 Forbidden en WordPress: cuándo es un problema de permisos y cuándo esconde malware

    Cuando accedes a tu sitio WordPress y de repente ves un error 403 Forbidden, lo primero que te pregunta es: «¿Qué he hecho?». En mi experiencia analizando cientos de webs comprometidas, este error es uno de los más engañosos que existen. Puede significar algo tan simple como un permiso de archivo mal configurado, o puede ser la señal de que alguien ha infiltrado un backdoor en tu servidor.

    La realidad es que el error 403 es como un síntoma en medicina: te dice que algo no va bien, pero no te dice qué es. Por eso necesitas un diagnóstico preciso. En este artículo te enseño a diferenciar ambos escenarios y qué hacer en cada caso.

    Qué significa el error 403 Forbidden

    El error 403 Forbidden es una respuesta HTTP que tu servidor web (Apache, Nginx) devuelve cuando un usuario intenta acceder a un recurso para el que no tiene permisos. A diferencia del 404 (página no encontrada), aquí el servidor sí ve el archivo o directorio, pero decide que no deberías poder verlo.

    En WordPress, esto ocurre típicamente cuando:

    • Los permisos de un archivo o carpeta están demasiado restrictivos (p. ej., 000 o 600 cuando deberían ser 644 o 755).
    • El propietario del archivo no es el usuario del servidor web (www-data en Linux).
    • Una regla .htaccess bloquea el acceso deliberadamente.
    • Una directiva Apache o Nginx prohíbe el acceso a ese recurso.
    • Un plugin de seguridad ha bloqueado la IP del visitante.

    Pero aquí viene lo importante: un atacante también puede generar un 403 intencionalmente para ocultarse. Veremos esto más adelante.

    Las 5 causas más comunes del error 403 en WordPress

    1. Permisos de archivos incorrectos (la más habitual)

    En mi experiencia, 7 de cada 10 casos de error 403 que veo son por esto. WordPress necesita que sus archivos y carpetas tengan permisos específicos para que tanto tú como el servidor web puedan leerlos y modificarlos.

    Los permisos correctos son:

    • Carpetas: 755 (rwxr-xr-x)
    • Archivos: 644 (rw-r–r–)
    • wp-config.php: 600 (rw——-) por seguridad

    Si alguien ha cambiado estos permisos (accidentalmente o tras una mala migración), obtendrás 403. Puedes verificarlo vía SSH o tu panel de hosting:

    1. Conecta por SSH o accede al administrador de archivos de tu hosting.
    2. Navega a la raíz de WordPress.
    3. En SSH: ls -la para ver los permisos (columna 1).
    4. Si ves números como 000, 600 (en archivos normales) o 600 (en carpetas), están mal.

    Para corregirlo desde SSH:

    find /ruta/a/wordpress -type f -exec chmod 644 {} ;
    find /ruta/a/wordpress -type d -exec chmod 755 {} ;

    2. Propietario de archivos incorrecto

    Si tras una migración o una instalación manual, los archivos no pertenecen al usuario del servidor web, WordPress no podrá escribir en ellos. Verificar el propietario:

    ls -l /ruta/a/wordpress | head -20

    Deberías ver algo como www-data www-data o nobody nobody (depende de tu hosting). Si ves root o tu usuario de SSH, ahí está el problema. Para corregirlo:

    chown -R www-data:www-data /ruta/a/wordpress

    3. Regla .htaccess que bloquea acceso

    Un archivo .htaccess corrupto o mal configurado puede devolver 403 a todo el mundo. Algunos plugins de seguridad añaden reglas que a veces son demasiado restrictivas.

    Prueba esto: accede a tu hosting y renombra el archivo .htaccess a .htaccess.bak. Si el error desaparece, aquí estaba el culpable. Luego regenera el .htaccess desde WordPress:

    • Ajustes → Enlaces permanentes
    • Haz clic en «Guardar cambios» (sin cambiar nada)

    4. Plugin de seguridad bloqueando tu IP

    Plugins como Wordfence, Sucuri, o iThemes Security pueden bloquear direcciones IP tras detectar múltiples intentos fallidos de login. Si hace poco intentaste acceder con una contraseña incorrecta varias veces, es probable que estés bloqueado.

    Solución: accede a través de una VPN o IP diferente, entra al panel de administración (si puedes) y desbloquea tu IP en el plugin.

    5. Configuración incorrecta de Apache/Nginx

    A veces, el servidor tiene una directiva <Directory> que prohíbe el acceso (Deny from all). Esto es menos común, pero si no encuentras el error en los puntos anteriores, contacta con tu proveedor de hosting.

    ¿Cuándo el error 403 es señal de malware?

    Aquí es donde pongo las antenas en alerta máxima. Un atacante sofisticado puede modificar archivos .htaccess o reglas Nginx para bloquear acceso intencionalmente y ocultarse. Es una técnica de ofuscación.

    Indicadores de que el 403 esconde algo oscuro:

    • El error apareció sin que hayas hecho cambios. Si no migraste, no actualizaste plugins ni tocaste permisos, y de repente aparece 403, es sospechoso.
    • El 403 aparece solo en ciertos directorios. Por ejemplo, ves tu home, pero /wp-admin devuelve 403. Eso puede indicar una regla .htaccess maliciosa que bloquea el acceso administrativo.
    • Hay un .htaccess nuevo o modificado que no creaste. Un atacante a menudo añade reglas como:

      <Files ~ ".php$">
      Deny from all
      </Files>

      Esto bloquea la ejecución de PHP en una carpeta específica para ocultar webshells.
    • Tu Google Search Console muestra un aumento de errores 403. Si Google de repente reporta 100+ URLs con error 403, alguien pudo haber puesto un bloqueo masivo. Entra en Google Search Console y verifica la sección «Problemas de cobertura».
    • Ves archivos PHP raros en directorios que no debería haber. Por ejemplo, /wp-content/uploads/shell.php o /wp-includes/wp-admin.php.

    Paso a paso: diagnóstico profesional del error 403

    Aquí es cómo yo procedo cuando un cliente me llama con este problema:

    Paso 1: Verificar los registros del servidor

    Los logs de Apache o Nginx son la fuente de verdad. Accede a ellos (normalmente en /var/log/apache2/ o /var/log/nginx/):

    tail -100 /var/log/apache2/error.log | grep 403

    Busca patrones. Verás líneas como:

    [client 192.168.1.100] File does not exist: /var/www/html/wp-admin → problema de permisos.
    access to /wp-admin denied by rule → regla .htaccess bloqueando.

    Paso 2: Inspeccionar .htaccess y archivos de configuración web

    Descarga tu .htaccess y revísalo línea a línea. Busca:

    • Directivas Deny from sospechosas.
    • Reglas RewriteRule raras que redirigen al 403.
    • Código ofuscado o comentarios en idiomas extraños.

    Si usas Nginx, revisa /etc/nginx/sites-enabled/default o tu configuración específica.

    Paso 3: Escanear archivos en busca de código malicioso

    Aquí es donde usaría herramientas como:

    • Wordfence CLI (gratuito, desde SSH): detecta backdoors conocidos.
    • WP-CLI con auditoría de archivos: wp plugin list --status=all para ver si hay plugins raros.
    • Sucuri SiteCheck (online): escanea tu dominio en busca de malware conocido.

    Si encuentro un backdoor, es momento de acción inmediata: aislamiento, copia de seguridad íntegra y limpieza.

    Paso 4: Revisar logs de acceso por patrones de ataque

    tail -1000 /var/log/apache2/access.log | grep -i "sql|union|select|xss"

    Esto busca intentos de inyección SQL o XSS. Si encuentras líneas como:

    GET /index.php?id=1 UNION SELECT ... HTTP/1.1

    Confirma que ha habido un intento de explotación.

    Soluciones según el diagnóstico

    Si es problema de permisos:

    1. Corrige los permisos como indiqué anteriormente.
    2. Verifica que el propietario es el usuario del servidor web.
    3. Regenera el .htaccess desde WordPress.
    4. Borra la caché del navegador (Ctrl+Shift+Supr) e intenta acceder.

    Si encontraste código malicioso:

    1. No lo borres aún sin una copia de seguridad limpia. Necesitas una línea de base para comparar.
    2. Identifica la fecha de modificación de archivos maliciosos (ls -la --full-time).
    3. Busca en los logs de acceso qué IP o qué solicitud HTTP lo creó.
    4. Elimina el malware, cambia todas las contraseñas (admin, FTP, bases de datos), y revisa plugins/temas.
    5. Si el backdoor es persistente (se regenera tras borrarlo), necesitas ayuda profesional. No es una tarea para DIY.

    Si hay una regla .htaccess maliciosa:

    Edita el .htaccess y elimina la regla sospechosa. Si tienes un backup de antes de que apareciera el error, compara versiones. Luego valida que la sintaxis es correcta (un error de sintaxis en .htaccess causa 500, pero con ciertos navegadores puede parecer 403).

    Cómo prevenirlo en el futuro

    Una vez resuelto, implementa estas medidas defensivas:

    • Monitoreo de cambios de permisos: configura alertas en tu hosting o usa un plugin como File Monitor para detectar cambios en archivos críticos.
    • Backups regulares: mantén backups automáticos diarios. Si ocurre un ataque, puedes restaurar sin perder semanas de trabajo.
    • Actualiza WordPress y plugins religiosamente. Vulnerabilidades no parcheadas son la puerta de entrada número 1.
    • Usa un plugin de seguridad confiable: Wordfence, Sucuri, o All in One WP Security. Configúralo para bloquear intentos de fuerza bruta y monitorear cambios de archivos.
    • Cambia el prefijo de tablas de WordPress: en lugar de wp_, usa algo como abc123_. Esto dificulta inyecciones SQL.
    • Deshabilita la edición de archivos desde el panel: añade esto a wp-config.php:

      define('DISALLOW_FILE_EDIT', true);
      Así, aunque un atacante entre al panel, no puede editar archivos directamente.
    • Configura autenticación de dos factores (2FA) en wp-login.php. Un atacante sin tu teléfono no puede entrar.
    • Limita intentos de login: usa una regla .htaccess o un plugin para bloquear después de 5 intentos fallidos en 15 minutos.

    Cuándo pedir ayuda profesional

    Si después de seguir estos pasos el error persiste, o si sospechas que hay malware pero no sabes cómo proceder, es momento de contactar a un profesional. En ManuelFolgar.com, realizamos auditorías de seguridad profundas, limpieza de malware certificada y hardening de WordPress. No jugamos a adivinar; usamos herramientas forenses reales y experiencia en miles de casos.

    Un error 403 que persiste puede costar dinero en inactividad de tu sitio, confianza de clientes y, lo peor, exposición de datos. La inversión en diagnóstico profesional se recupera rápidamente.

    Si necesitas ayuda, contacta conmigo aquí. Realizamos evaluación inicial gratuita de tu situación.

  • Ataques a PrestaShop vs WordPress: cuál es más seguro

    Ataques a PrestaShop vs WordPress: cuál es más seguro

    Ataques a PrestaShop vs WordPress: cuál es más seguro

    Cuando analizo un sitio comprometido, la pregunta que más escucho es: «¿cuál de las dos plataformas es más segura?» La realidad es más matizada de lo que parece. Tanto WordPress como PrestaShop sufren ataques constantemente, pero los vectores, la frecuencia y la severidad varían significativamente. En mi experiencia, no se trata de cuál es inherentemente más seguro, sino de cómo cada uno maneja la seguridad y qué responsabilidad recae en el administrador.

    La arquitectura de seguridad: diferencias fundamentales

    WordPress es un CMS de propósito general con un ecosistema masivo de plugins y temas. Esa flexibilidad es su fortaleza y su talón de Aquiles. PrestaShop, en cambio, está específicamente diseñado para comercio electrónico, lo que implica un enfoque más cerrado y orientado a casos de uso concretos.

    Lo que recomiendo siempre a mis clientes: WordPress tiene un core más auditado por la comunidad de seguridad, pero el riesgo real está en las extensiones de terceros. PrestaShop centraliza más funcionalidad en el core, lo que reduce la proliferación de plugins inseguros, pero cuando hay vulnerabilidades, afectan a un porcentaje más alto de instalaciones.

    • WordPress: ~43% de todos los sitios web usan WordPress. Los ataques se distribuyen entre el core (raro), plugins (frecuente) y temas (moderado).
    • PrestaShop: Menos penetración global (~0,2% del top 1 millón), pero altamente concentrado en ecommerce. Los ataques se centran en módulos de pago, carrito y datos de clientes.

    Vectores de ataque más comunes en WordPress

    En WordPress, los tres principales vectores de compromiso que encuentro en auditorías son:

    1. Plugins desactualizados: Un plugin con una vulnerabilidad de inyección SQL publicada hace 6 meses y sin parchear es la puerta más común. Herramientas como Wordfence registran miles de intentos diarios contra plugins populares vulnerables.
    2. Temas nulled: Descargar un tema de un repositorio no oficial es casi garantía de backdoor. He visto cryptominers inyectados en el footer que tardaban meses en detectarse.
    3. Brute force en wp-login.php: Aunque sea un ataque de baja sofisticación, las contraseñas débiles siguen siendo la causa #1 de compromiso en WordPress que he limpiado.

    El malware WordPress típico que encuentro incluye webshells en carpetas /uploads, redirectores SEO incrustados en functions.php, y recientemente, más backdoors persistent que sobreviven a actualizaciones parciales.

    Vectores de ataque en PrestaShop

    PrestaShop enfrenta riesgos diferentes, especialmente críticos porque maneja datos sensibles:

    1. Módulos de pago comprometidos: Los skimmers tipo Magecart (sí, afectan también a PrestaShop) se instalan como módulos maliciosos y roban tarjetas de crédito en tiempo real. Es devastador porque el malware está en la capa de procesamiento de pagos.
    2. Vulnerabilidades en el back-office: Acceso a /admin sin protección, CSRF tokens débiles, y contraseñas de BD expuestas en config/settings.inc.php son hallazgos recurrentes en mis auditorías de PrestaShop.
    3. Módulos de terceros sin auditar: A diferencia de WordPress, el repositorio oficial de módulos de PrestaShop es más restrictivo, pero los módulos instalados manualmente desde proveedores de dudosa reputación son un vector crítico.

    Un dato que veo constantemente: la mayoría de brechas en PrestaShop no son por un 0-day del core, sino por módulos de pago desactualizados o clonados ilegalmente.

    Datos de prevalencia: qué dicen los estudios

    Según análisis de malware web de plataformas como Sucuri, WordPress representa el 80% de todos los sitios comprometidos detectados, pero eso es por volumen. Si normalizamos por número de instalaciones, el porcentaje de sitios WordPress comprometidos es menor que el de PrestaShop.

    Por contra, cuando un sitio PrestaShop se ve comprometido, la severidad es típicamente mayor: exfiltración de datos de clientes, robo de credenciales de pago, y modificación de precios son comunes. En WordPress, el malware suele ser spam SEO o cryptominers, que son disruptivos pero no implican robo directo de datos financieros.

    Mantenimiento y actualizaciones: responsabilidad compartida

    Aquí está el punto clave: ambas plataformas publican parches de seguridad regularmente, pero el éxito depende del administrador.

    WordPress: Las actualizaciones automáticas de core están habilitadas por defecto, lo que es excelente. Pero los plugins y temas no se actualizan automáticamente en la mayoría de instalaciones. He visto clientes con plugins comprometidos durante años sin saberlo.

    PrestaShop: Las actualizaciones requieren intervención manual del administrador o un panel de control que lo gestione. Es más trabajo, pero también significa que hay un punto de control consciente. El problema es que muchos administradores de PrestaShop no pueden permitirse tiempo de downtime, así que retrasan las actualizaciones.

    Lo que siempre recomiendo: independientemente de la plataforma, implementar un plan de actualizaciones forzadas, auditorías trimestrales de plugins/módulos, y monitoreo en tiempo real.

    Hardening: cómo reducir riesgo en cada plataforma

    WordPress hardening esencial:

    • Deshabilitar edición de archivos: añade a wp-config.php: define('DISALLOW_FILE_EDIT', true);
    • Cambiar prefijo de tablas de ‘wp_’ a algo aleatorio en instalación limpia.
    • Proteger wp-config.php con reglas .htaccess.
    • Limitar intentos de login a 5 por IP cada 15 minutos usando Wordfence o iThemes Security.
    • Implementar 2FA en todas las cuentas administrativas.
    • Usar WordPress Security Headers como HSTS, CSP, X-Frame-Options.

    PrestaShop hardening esencial:

    • Renombrar la carpeta /admin a algo impredecible y documentarlo en contraseña de administrador.
    • Proteger /admin con .htaccess de IP whitelist.
    • Cambiar permisos de carpetas a 755 y archivos a 644, nunca 777.
    • Almacenar config/settings.inc.php fuera de la raíz web si es posible.
    • Habilitar CSRF tokens en formularios y validar en servidor.
    • Auditar módulos de pago cada 3 meses: verifica que los archivos coincidan con el hash oficial.
    • Implementar WAF (Web Application Firewall) específico para PrestaShop con reglas ModSecurity.

    Detección de malware: herramientas por plataforma

    Cuando llega un cliente con un sitio comprometido, uso diferentes enfoques según la plataforma:

    WordPress: Ejecuto análisis con Wordfence CLI, verifico wp-content/plugins y wp-content/themes con hashes de repositorio oficial, y uso WP-CLI para listar usuarios y revisar caps de admin. El malware WordPress suele estar en functions.php, wp-config.php, o archivos .php huérfanos en /uploads.

    PrestaShop: Reviso /modules en busca de módulos modificados, analizo config/settings.inc.php para credenciales de BD, e inspecciono la carpeta /admin de PrestaShop y tablas de la BD para webshells. Uso VirusTotal con hashes de archivos .php sospechosos. Algunos backdoors PrestaShop se disfrazan como «módulos de optimización» en el panel administrativo.

    ¿Cuál es más seguro al final?

    La respuesta honesta: ninguno es «más seguro» de forma absoluta. La seguridad depende de cuatro factores:

    1. Modelo de amenaza: Si tu riesgo principal es spam SEO, WordPress es manejable. Si maneja datos de tarjetas de crédito, PrestaShop requiere más cuidado porque el impacto de un compromiso es financiero directo.
    2. Recursos disponibles: WordPress requiere auditoría activa de plugins; PrestaShop requiere menos extensiones pero más endurecimiento del servidor.
    3. Actualización: Ambas plataformas liberan parches de seguridad. La plataforma que uses es menos segura que aquella cuyos parches apliques religiosamente.
    4. Aislamiento: Un sitio WordPress con plugins auditados y actualizados es más seguro que un PrestaShop con módulos pirateados y /admin accesible al mundo.

    Lo que recomiendo siempre a clientes que deben elegir: si tienes ecommerce serio (miles de transacciones), PrestaShop con WAF es defensible. Si es contenido o blog con ecommerce ligero, WordPress con hardening robusto es suficiente. Pero en ambos casos, dedica presupuesto a auditorías de seguridad y monitoreo continuo.

    Casos de estudio reales de compromiso

    Hace tres meses limpié una tienda WordPress con un plugin de carrito comprometido que inyectaba un skimmer en páginas de checkout. El módulo malicioso robó datos de 2.000 clientes. El plugin estaba desactualizando 8 versiones atrás.

    Hace un mes, un cliente PrestaShop vino con su módulo de pago clonado ilegalmente de Stripe. El código malicioso enviaba datos de tarjeta a un servidor en Rusia. El daño fue mayor porque afectó el mismo core de transacciones.

    En ambos casos, el denominador común fue: falta de auditoría periódica y actualización negligente. La plataforma fue secundaria.

    Conclusión: seguridad es un proceso, no un producto

    WordPress y PrestaShop son seguros en manos de administradores conscientes de seguridad. Ambos publican parches de forma oportuna, ambos tienen comunidades de seguridad activas, y ambos pueden ser endurecidos significativamente.

    Lo que recomiendo: independientemente de tu plataforma, establece ciclos de actualización forzada, auditorías trimestrales de extensiones, monitoreo de integridad de archivos, y análisis de logs. Un WordPress sin auditoría es un desastre; un PrestaShop audited y mantenido es fortaleza.

    Si necesitas evaluar el estado real de tu sitio o limpiar un compromiso existente, contacta conmigo en ManuelFolgar.com para una auditoría de seguridad profesional. Realizo análisis de malware, hardening específico de tu plataforma, e implemento monitoreo continuo para evitar futuros compromisos.

  • 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.

  • Mi WordPress fue hackeado: qué hacer ahora mismo

    Mi WordPress fue hackeado: qué hacer ahora mismo

    Mi WordPress fue hackeado: qué hacer ahora mismo

    Cuando descubres que tu WordPress ha sido hackeado, el pánico es la primera reacción. Pero te lo digo desde mi experiencia limpiando cientos de sitios comprometidos: los primeros pasos que tomes en las próximas horas determinarán si recuperas tu web o pierdes meses de trabajo. En este artículo te guío exactamente qué hacer, en qué orden, sin pánico.

    Primero: confirma que realmente está hackeado

    No todos los síntomas son señal de hackeo. Antes de tomar decisiones drásticas, verifica realmente qué está pasando:

    • Google Search Console. Si Google ha desindexado tu sitio o marca páginas como «malware detectado», ahí tienes confirmación oficial. Accede a tu GSC y busca en la sección de Seguridad.
    • Herramientas online gratuitas. Usa Sucuri SiteCheck o VirusTotal para escanear tu dominio. Si ambas detectan malware, es casi seguro.
    • Comportamiento del sitio. ¿Ves anuncios extraños? ¿Redirecciones a sitios de casinos o farmacéuticos? ¿Contenido spam en la base de datos? Son indicios claros de infección.
    • Acceso a cPanel/hosting. Revisa los logs de acceso. Si ves intentos de login fallidos masivos o conexiones desde países raros, tu servidor ha estado bajo ataque.

    Una vez confirmado, pasamos a acción.

    Paso 1: Aísla el sitio inmediatamente (máximo 30 minutos)

    No dejes que el malware siga propagándose. Esto es crítico:

    1. Desactiva todos los plugins. Accede a wp-admin. Si no puedes, conéctate por SFTP/cPanel. Renombra la carpeta /wp-content/plugins/ a /wp-content/plugins-disabled/. Así WordPress no cargará ninguno.
    2. Cambia todas las contraseñas de administrador. Desde otra máquina (no la comprometida), entra en WordPress y crea una nueva contraseña de usuario admin de 20+ caracteres, con mayúsculas, números y símbolos. Si no tienes acceso a wp-admin, usa WP-CLI desde terminal: wp user update 1 --prompt=user_pass.
    3. Revoca tokens y sesiones activas. Si usas plugin de seguridad como Wordfence, cierra todas las sesiones salvo la tuya. Esto expulsará a los atacantes conectados.
    4. Notifica a tu hosting. Llama a soporte y diles que tu WordPress está comprometido. Algunos proveedores pueden suspender temporalmente el sitio o aislarlo en un servidor de cuarentena mientras lo limpias.

    En este punto ya has evitado que el malware continúe infectando más usuarios y ampliando la infección.

    Paso 2: Identifica qué tipo de malware tienes (1-2 horas)

    Saber qué luchas contra es fundamental. Los tipos más frecuentes que encuentro:

    Backdoors y webshells. Son archivos PHP ocultos (a menudo con nombres como shell.php, wp-content/uploads/shell.php o disfrazados como plugins legítimos). Te permiten al atacante acceso permanente, incluso después de cambiar contraseñas. Los busco con:

    find /home/tudominio/public_html -name "*.php" -newermt "2024-01-01" -type f

    Reemplaza la fecha por la del último acceso sospechoso.

    Malware SEO (spam de redirección). Inyecta código en posts y páginas que redirige a usuarios a sitios de apuestas, pornografía o estafas. Lo ves en el HTML cuando inspeccionas un post. Es síntoma de que alguien tiene acceso a tu base de datos.

    Cryptominers o scripts JavaScript maliciosos. Se cargan en el navegador del visitante para minar criptomonedas con su CPU sin saberlo. Detecta ralentización extrema del sitio. Busca en Google Analytics picos de carga extraños.

    Plugins y temas nulled comprometidos. Si descargaste un plugin «premium» de un sitio pirata, viene con malware incrustado. Cuando lo activas, infectas el sitio.

    Para identificarlos con precisión, MalCare hace un escaneo automático en WordPress. También puedo hacerlo yo manualmente revisando logs y ficheros, pero MalCare te da un informe en minutos.

    Paso 3: Crea una copia de seguridad limpia ANTES de limpiar

    Parece contradictorio, pero es esencial. Haz backup de lo que tienes ahora con el malware por si necesitas investigar más tarde o recuperar contenido legítimo. Luego procedes a limpiar.

    En cPanel, descarga:

    • Base de datos completa (SQL dump).
    • Carpeta /public_html/ entera via SFTP.
    • Guárdalos en una unidad externa encriptada.

    Paso 4: Limpia o reinstala WordPress (2-4 horas)

    Tienes dos caminos según severidad:

    Opción A: Limpieza manual (solo si infección leve).

    1. Elimina todos los plugins y temas excepto uno limpio, verificado. Borra manualmente las carpetas de plugins sospechosos.
    2. Descarga los archivos core de WordPress desde WordPress.org e intégralos sobre tu instalación, reemplazando wp-admin/ y wp-includes/. Mantén tu wp-config.php y carpeta /wp-content/ de momento.
    3. Revisa la base de datos buscando tablas o posts extraños. Si hay cientos de posts nuevo que no creaste, son spam SEO inyectado. Bórralos desde phpMyAdmin o WP-CLI.
    4. Busca opciones de la BD maliciosas (suelen estar en wp_options) con valores JavaScript o URLs sospechosas.

    Opción B: Reinstalación limpia (recomendado si infección media-alta).

    1. Elimina completamente /public_html/ menos la carpeta /uploads/ (tus imágenes y archivos).
    2. Descarga WordPress limpio e instálalo de nuevo.
    3. Restaura tu contenido (posts, páginas, usuarios) desde tu backup limpio más antiguo que confíes, o manualmente si tienes pocos posts.
    4. Restaura uploads/ desde backup confiable (escaneándolo antes con VirusTotal).

    Yo siempre recomiendo Opción B: es más lento pero garantiza limpieza 100%. Los atacantes suelen ocultar puertas traseras muy bien.

    Paso 5: Fortifica el sitio contra reinfección (2-3 horas)

    Ahora que está limpio, hazlo inexpugnable:

    WordPress hardening básico:

    • Deshabilita edición de archivos en wp-admin. Añade a wp-config.php: define('DISALLOW_FILE_EDIT', true);
    • Protege wp-config.php con reglas .htaccess: <files wp-config.php> order allow,deny deny from all </files>
    • Cambia el prefijo de tablas de la BD de wp_ a algo aleatorio como xk7m_ (mitiga ataques SQL masivos).
    • Limita intentos de login en wp-login.php a 3 intentos cada 15 minutos mediante .htaccess o plugin.
    • Habilita autenticación de dos factores (2FA) en todos los usuarios admin.

    Plugin de seguridad esencial: Instala Wordfence Security (gratuito con versión premium). Configura:

    • Escaneo de malware automático cada 24h.
    • WAF (Web Application Firewall) activo.
    • Rate limiting para wp-login.
    • Alertas por cambios en archivos core.

    Actualiza todo: WordPress core a última versión, todos los plugins, tema. Plugins desactualizados fueron tu puerta de entrada. Vulnerabilidades conocidas como CVE-2023-xxxx son esploitadas automáticamente por bots.

    Permisos de carpetas correctos:

    chmod 755 /wp-content/
    chmod 755 /wp-content/uploads/
    chmod 644 /wp-config.php
    chmod 600 /wp-config.php (si es posible)

    Esto evita que procesos de web escriban donde no deben.

    Paso 6: Notifica a Google y buscadores (30 minutos)

    Google mantiene el sitio penalizado si cree que sigue infectado. Debes reportar limpieza:

    1. En Google Search Console, ve a Seguridad > Problemas de seguridad.
    2. Haz clic en «Solicitar revisión».
    3. Google enviará un bot a revisar. Si todo está limpio, en 24-48h debería retirar la penalización.
    4. Revisa INCIBE (Instituto Nacional de Ciberseguridad español) para notificaciones si tu sitio fue usado para esparcir malware a otros usuarios españoles.

    Paso 7: Investiga cómo entraron (1-2 horas)

    Esto es crucial para no volver a ser hackeado:

    Vector más común: plugin desactualizado. ¿Tenías Elementor, All in One SEO o WooCommerce sin parchear? Revisa en NVD/CVE qué vulnerabilidades afectaban a esa versión. Aprende la lección: actualiza plugins cada semana mínimo.

    Contraseña débil de admin. Si encontraste intentos fallidos masivos en logs (brute force ataque), tu contraseña era admin123, wordpress o similar. Usa gestor de contraseñas (Bitwarden, 1Password).

    Acceso FTP/SFTP comprometido. Si tus credenciales FTP viajaban en texto plano, un man-in-the-middle atacante puede haberlas interceptado. Usa SFTP (protocolo seguro) de aquí en adelante. Cambia credenciales de hosting.

    Tema o plugin nulled. Si alguna vez descargaste un tema premium de un repositorio pirata, ese fue el origen. Nunca más. Usa temas de repositorios oficiales: WordPress.org, ThemeForest verificado, Elementor directo.

    Monitoreo continuo post-limpieza

    La primera semana tras una infección es crítica. Vigila:

    • Logs de acceso FTP/SFTP: ¿Hay conexiones nuevas no autorizadas? Si sí, atacante aún tiene credenciales. Resetea todas.
    • Base de datos: ¿Aparecen posts spam nuevos? ¿Usuarios desconocidos? Bórralos al instante.
    • Wordfence alertas: Configúralo para notificarte por email de cambios en archivos core, nuevos plugins, cambios de usuarios.
    • Google Search Console: Revisa diariamente que no aparezcan nuevas «URL infectadas detectadas».

    En mi experiencia, si aplicaste estos pasos correctamente, en 95% de casos no hay reinfección. El 5% restante suele ser porque se dejó una puerta trasera muy oculta, o credenciales aún comprometidas.

    ¿Cuándo llamar a un profesional?

    Si después de 4 horas de seguir estos pasos no te sientes seguro, o si la infección es compleja (malware cifrado, múltiples backdoors), es momento de buscar ayuda especializada. Yo ofrezco desde ManuelFolgar.com servicio de limpieza manual integral: escaneo exhaustivo con herramientas forenses, eliminación garantizada de malware, hardening completo, y soporte post-limpieza 30 días.

    Contacta conmigo en ManuelFolgar.com/contacto para una auditoría gratuita de tu WordPress. Te diré exactamente qué está comprometido y cuál es tu mejor opción.

    Resumen de acciones inmediatas

    1. Confirma hackeo con Sucuri SiteCheck y Google Search Console.
    2. Desactiva plugins, cambia contraseñas admin, avisa al hosting (30 min).
    3. Identifica tipo de malware: backdoor, SEO spam, cryptominer, etc. (1-2 horas).
    4. Copia backup con malware por seguridad.
    5. Limpia o reinstala WordPress limpio (2-4 horas).
    6. Aplica hardening: deshabilitar edición, cambiar prefijo BD, 2FA, Wordfence, actualizar todo.
    7. Solicita revisión a Google en Search Console.
    8. Investiga vector de entrada para no repetir error.
    9. Monitorea 7 días vigilando logs, BD, alertas Wordfence.

    El coste de esta limpieza en tiempo es alto, pero es infinitamente menor al daño de un sitio infectado durante meses.

    ¿Sientes que tu WordPress aún está en riesgo o necesitas una limpieza 100% profesional? Yo me encargo. Contacta ahora en ManuelFolgar.com/contacto. Limpio, fortifíco y te dejo tu web segura.