Etiqueta: permisos-archivos

  • Cambiar proprietario de archivos: restaurar permisos correctos tras hackeo

    Cambiar proprietario de archivos: restaurar permisos correctos tras hackeo

    Cambiar propietario de archivos: restaura permisos correctos tras un hackeo

    Cuando analizó un sitio web comprometido, una de las primeras cosas que reviso es la propiedad de los archivos y directorios. En mi experiencia, los hackers casi siempre dejan rastros evidentes: archivos creados por el usuario www-data, root o incluso propietarios fantasma que no debería existir en tu servidor. Restaurar los permisos correctos es crítico para evitar reinfecciones y asegurar que tu sitio funciona bajo la identidad de usuario correcta.

    En este artículo te explicaré cómo identificar propietarios incorrectos, las herramientas que necesitas y los pasos concretos para restaurar tu WordPress o PrestaShop a un estado seguro.

    ¿Por qué los hackers cambian propietarios de archivos?

    Cuando un atacante obtiene acceso a tu servidor (a través de un plugin desactualizado, una contraseña débil o una inyección SQL), lo primero que intenta es ganar persistencia. Cambiar la propiedad de los archivos es una técnica común porque:

    • Evasión de detección: si tu servidor está configurado para que WordPress sea propiedad de tu usuario FTP/SFTP, un archivo de propietario www-data destaca y es un indicador de compromiso.
    • Acceso permanente: un webshell con propietario www-data sigue siendo ejecutable incluso después de que cambies tu contraseña FTP.
    • Dificulta la limpieza: algunos administradores inexpertos no notan que los permisos están mal y el malware persiste silenciosamente.
    • Bloqueo de acceso: en algunos casos, el hacker cambia la propiedad a un usuario de máquina inexistente, bloqueándote incluso a ti.

    He visto casos donde un cliente no podía eliminar archivos mediante FTP porque la propiedad había sido transferida a nobody o a un usuario fantasma. Fue una situación frustrante que podría haberse evitado con auditorías regulares.

    Identificar propietarios y permisos incorrectos

    Conectar por SSH y revisar la estructura

    Si tienes acceso SSH a tu servidor (y lo recomiendo siempre), el primer paso es conectar y listar los archivos con información de propiedad:

    ls -la /ruta/a/tu/wordpress

    La salida te mostrará algo como:

    -rw-r--r-- 1 usuario grupo 1024 Jan 15 10:30 index.php

    Las partes clave son: usuario (owner) y grupo (group). En una instalación correcta de WordPress en un servidor compartido, debería ser algo como:

    • Usuario propietario: tu usuario FTP (ej: miseñoweb, usuario1, etc.) o www-data si estás en un servidor dedicado con PHP-FPM bien configurado.
    • Grupo: www-data, www, httpd o similar (el usuario web del servidor).

    Si ves propietarios raros como root, nobody, mysql o usuarios que no reconoces, es un indicador de compromiso.

    Automatizar la detección con find

    En lugar de revisar archivo por archivo, puedo usar find para detectar anomalías:

    find /ruta/a/wordpress -not -user miusuario -not -user www-data -type f

    Este comando lista todos los archivos que NO son propiedad de tu usuario FTP ni de www-data. Si aparecen archivos, tienes un problema.

    Restaurar propietarios correctos en WordPress

    Opción 1: Cambiar propietario a tu usuario FTP (servidores compartidos)

    En hosting compartido, lo habitual es que los archivos sean propiedad de tu usuario FTP:

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

    Reemplaza miusuario con tu usuario real. El parámetro -R (recursivo) cambia todos los archivos y carpetas dentro del directorio.

    Nota importante: el grupo debe seguir siendo www-data para que el servidor web pueda leer los archivos. No cambies el grupo a tu usuario.

    Opción 2: Cambiar propietario a www-data (servidores dedicados con PHP-FPM)

    Si usas un servidor dedicado con PHP-FPM correctamente configurado, el propietario debe ser www-data en todos los archivos:

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

    Esta es la configuración más segura en servidores modernos porque el proceso PHP se ejecuta como www-data, evitando escaladas de privilegios.

    Restaurar permisos numéricos (CHMOD)

    Una vez hayas corregido el propietario, es hora de los permisos. Los permisos correctos en WordPress son:

    • Directorios: 755 (rwxr-xr-x) – el propietario lee, escribe y ejecuta; otros solo leen y ejecutan.
    • Archivos PHP y datos: 644 (rw-r–r–) – el propietario lee y escribe; otros solo leen.
    • wp-config.php: 600 (rw——-) – solo el propietario puede acceder.
    • carpeta /uploads: 755 en la carpeta, 644 en archivos dentro.

    Para establecer estos permisos desde SSH:

    find /ruta/a/wordpress -type d -exec chmod 755 {} ;
    find /ruta/a/wordpress -type f -exec chmod 644 {} ;
    chmod 600 /ruta/a/wordpress/wp-config.php

    Esto es clave: si los permisos son demasiado permisivos (777 o 666), cualquiera en el servidor puede modificar tus archivos. He encontrado backdoors en sitios que tenían permisos 777 en directorios completos.

    Restaurar permisos en PrestaShop

    PrestaShop es similar, pero con algunas particularidades. La estructura correcta es:

    • Directorios: 755
    • Archivos: 644
    • config/settings.inc.php: 644 (en algunos casos 600)
    • carpeta /upload: 755 con archivos 644

    El propietario debe seguir la misma lógica que WordPress: tu usuario FTP en hosting compartido, www-data en dedicado.

    chown -R miusuario:www-data /ruta/a/prestashop
    find /ruta/a/prestashop -type d -exec chmod 755 {} ;
    find /ruta/a/prestashop -type f -exec chmod 644 {} ;

    Casos especiales: detectar y eliminar webshells

    Después de cambiar propietarios, es posible que haya webshells o backdoors ocultos. Buscar archivos con propietarios sospechosos es un indicador, pero también debes revisar:

    Archivos PHP sospechosos

    Muchos hackers suben archivos con nombres inocentes (shell.php, admin.php, update.php) en directorios menos obvios como wp-content/uploads, plugins desactivados o themes sin usar.

    find /ruta/a/wordpress -name "*.php" -type f -newer /ruta/a/wordpress/index.php

    Este comando lista archivos PHP más nuevos que index.php, lo que puede indicar qué se subió tras el hackeo.

    Archivos con permisos anómalo

    find /ruta/a/wordpress -perm /111 -type f -name "*.php"

    Esto busca archivos PHP ejecutables por el propietario, grupo u otros. Un archivo PHP nunca debería ser ejecutable en el sistema de archivos (el servidor web se encarga de ejecutarlo).

    Verificar cambios con Wordfence CLI o MalCare

    Después de restaurar permisos, te recomiendo usar herramientas especializadas para confirmar que no hay malware residual:

    • Wordfence CLI: escanea archivos WordPress en busca de cambios respecto a versiones oficiales. Es gratuito y muy potente.
    • MalCare: detección automática de webshells y malware incluso si no coincide con firmas conocidas.
    • WP-CLI: con comandos personalizados para revisar integridad de plugins y temas.

    La combinación de cambio de propietarios + análisis de malware es tu mejor defensa. No hagas uno sin el otro.

    Implementar protecciones adicionales tras la restauración

    Deshabilitar edición de archivos

    Una vez hayas limpiado el sitio, evita que nadie (incluso atacantes con acceso al panel admin) pueda editar archivos PHP:

    En wp-config.php, añade:

    define('DISALLOW_FILE_EDIT', true);

    Esto desactiva el editor de archivos en el panel de WordPress, reduciendo la superficie de ataque significativamente.

    Proteger wp-config.php con .htaccess

    En el directorio raíz de WordPress, crea o edita .htaccess:

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

    Esto previene acceso directo al archivo de configuración, incluso si se coloca una inyección.

    Cambiar prefijo de tablas de base de datos

    Si el hacker accedió a la base de datos, también debería cambiar el prefijo (por defecto wp_):

    define('DB_PREFIX', 'wnq42_');

    Esto complica los ataques de inyección SQL dirigidos a tablas específicas. Requiere cierto trabajo de migración, pero vale la pena en sitios críticos.

    Auditoría post-hackeo: la lista de verificación

    Cuando finalices la restauración de propietarios, verifica:

    1. Todos los archivos tienen propietario correcto (tu usuario o www-data, según configuración).
    2. Todos los directorios tienen permisos 755, archivos 644, excepto wp-config.php en 600.
    3. No hay archivos PHP sospechosos en directorios de upload o temas desactivados.
    4. Escaneo antimalware con Wordfence CLI o MalCare sin detecciones.
    5. Cambio de contraseñas de FTP, SSH, base de datos y panel admin.
    6. Actualización de todos los plugins, temas y WordPress al último parche.
    7. Revisión de logs de servidor en /var/log/apache2 o /var/log/nginx para actividad sospechosa.

    En mi experiencia, los sitios que no completan esta lista suelen reinfectarse en 48-72 horas. El cambio de propietarios es solo el primer paso.

    Herramientas recomendadas para automatizar todo esto

    WP-CLI permite automatizar cambios de permisos en WordPress sin escribir comandos complejos:

    wp user list
    wp plugin list
    wp theme verify-checksums

    Con scripts personalizados, puedes combinar chown, chmod y escaneos de integridad en una sola ejecución.

    Si no tienes acceso SSH, algunas empresas de hosting permiten cambiar propietarios a través del panel de control (cPanel, Plesk, etc.). Contacta con soporte si no ves la opción.

    ¿Cuándo llamar a un profesional?

    Si después de cambiar propietarios:

    • Siguen apareciendo archivos sospechosos nuevos.
    • El sitio se ralentiza o muestra errores inexplicables.
    • Las redirecciones no cesan tras limpiar.
    • No tienes acceso SSH y tu proveedor no te ayuda.

    Es momento de buscar ayuda profesional. En ManuelFolgar.com realizamos limpiezas completas de malware, auditorías de seguridad profundas y hardening de servidores. Contacta conmigo para una evaluación sin compromiso.

    Solicita una auditoría de seguridad profesional en ManuelFolgar.com

    Referencias técnicas y fuentes de autoridad

    Para profundizar en estos conceptos, te recomiendo estos recursos oficiales:

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

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