WordPress, webinar seguridad
- Nominalia: https://www.escueladeinternet.com/
vulnerabilidades
- en themes o plugins
- en núcleo WP
- PHP → versión > 8.1
- robo credenciales/suplantación
- fugas de información (logs de error que exponen información sensible)
Amanenazas
- Malware y puertas traseras
- DDOS y fuerza bruta
- inyección SQL
- XSS
- subidas de ficheros no controladas
- secuestro de sesiones (no https o mal configurado)
- redirecciones maliciosas
- ataques por IA
prácticas recomendadas
- Actualizar core, plugins, temas…
- eliminar aquellos que no se usan (el código PHP está ahí)
- no instalar plugins abandonados (más de 9 meses sin actualizarse)
- Instalar de sitios oficiales o confiables
- PHP 8.1
- acceso seguro
- limitar númoro de accesos erróneos
- 2FA
- cambiar usuario «admin»
- contraseñas largas y únicas
- roles apropiados
- sistema de archivos
- 664 archivos
- 600 wp-config.php
- 400 .htaccess
- 755 carpetas
- desactivar feed rss y atom
- desactivar XML-RPC
- ocultar versión WP
- borrar archivos de identificación de WP (readme, license)
- deshabilitar la exploración de directorios
- Debug y log de errores
- desactivar por defecto
- wp-config.php
- .htacess
- Copias de seguridad
- diarios
- guardar fuera del servidor (sobre todo cambios importantes)
- algun plugin para copia interna de restauración rápida
- Monitorizar
- algún plugin de activity log
- alertas por mail para acciones críticas
- análisis malware y cambio de archivos
- escanear semanlmente
- Otros:
- cambiar prefijo BDD
- cabeceras de seguridad
- deshabiliotar enumaración de usuarios
- themeforest + envato (para tener temas actualizados de ese sitio de temas. Hay que vincular con la cuenta que compró el tema)
ejemplo práctico
analisis
- Herramientas → Salud del sitio → Información
- Wordpress
- versión
- Tema activo
- versión
- Servidor
- versión PHP
- versión servidor web
- plugin WordFence
- desactivar en Opciones generales de WordFence → pausar actualizaciones en vivo cuando la ventana pierde el foco
- opciones de exploración y planificación → alta sensibilidad
- iniciar nueva exploración → listado de vulnerabilidades
actualizaciones
- borrar caché antes de actualizar para detectar errores producidos por una actualización (WP Fastest Caache)
- activar plugin de mantenimiento (WP Maintenance)
- Escritorio → actualizaciones
- plugins (no actualizar todas de golpe, dificulta localizar un error)
- temas
- nucleo WP
corrección vulnerabilidadeas
- Eliminar o sustituir abandonados o no en uso
- Planificar sustitución
- plugin sin soporte:
- alternativas equivalentes
- buscar solución a través de IA (claude.ia, por ejemplo)
securización
- Limitar el número de accesos erróneos
- .htaccess (requiere IP Fija en el cliente)
- WordFence
- protección contra ataques de fuerza bruta
- 2FA activo
- WordFence tiene
- Cambiar «admin»
- manual:
- crear nuevo
- eliminar aniguo, asignar el contenido a otro usuario
- Desactivar XML-RPC-API
- https://wordpress.org/plugins/disable-xml-rpc-api/ (Neatma (Amin Nazemi) )
- .htaccess:
<Files xmlrpc.php Oder Deny,Allow Deny from all </Files>
- vinculado al tema:
- functions.php
// Desactivar XML-RPC completamente add_filter('xmlrpc_enabled', '__return_false’); // Eliminar headers de XML-RPC remove_action('wp_head', 'rsd_link’); remove_action('wp_head', 'wlwmanifest_link');
- contraseñas largas y únicas
- WordFence
- Asignar roles apropiados
- plugin (para necesidades especiales): https://es.wordpress.org/plugins/user-role-editor/
- Desactivar feeds y atom
- Desactivar enumeración de usuarios
- WordFence
- Desactivar logs de WP y PHP
- .htaccess
php_flag display_errors Off php_flag display_startup_errors Off php_flag log_errors Off php_value error_reporting 0
- wp-config.php
define('WP_DEBUG', false); define('WP_DEBUG_LOG', false); define('WP_DEBUG_DISPLAY', false); @ini_set('display_errors', 0);
- en caso de necesitar el fichero debug.log:
- .htaccess
# Proteger debug.log <Files debug.log> Order allow,deny Deny from all </Files>
- Ocultar versión de WP
- WordFence
- Borrar ficheros de identificación
- Manual:
- readme.html
- licente.txt
- licencia.txt
- wp-config-sample.php
- Bloqueo en .htaccess:
<FilesMatch "^(readme\.html|license\.txt|licencia\.txt|wp-config-sample\.php)$"> Order Allow,Deny Deny from all </FilesMatch>
- Desactivar exploración de directorios
- buscar en Google: site:<URL> intitle:«index of»
- WordFence
- .htaccess
Options -Indexes
- Cabeceras de seguridad (contra XSS)
- .htaccess
<IfModule mod_headers.c> # ------------------------------------------------------------- # SEGURIDAD BÁSICA DE NAVEGADOR # ------------------------------------------------------------- # Evita que el navegador intente adivinar tipos MIME Header always set X-Content-Type-Options "nosniff" # Previene ataques de clickjacking Header always set X-Frame-Options "SAMEORIGIN" # Referrer-Policy (limita la información enviada en el encabezado Referer) Header always set Referrer-Policy "strict-origin-when-cross-origin" # Obliga a usar HTTPS (solo si tu sitio usa SSL) Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" # ------------------------------------------------------------- # PERMISSIONS POLICY (ANTES Feature-Policy) # Controla las APIs y características disponibles en el navegador # ------------------------------------------------------------- Header always set Permissions-Policy "accelerometer=(), camera=(), geolocation=(), gyroscope=(), microphone=(), payment=(), usb=(), fullscreen=(self)" # ------------------------------------------------------------- # CONTENT SECURITY POLICY (CSP) # Define qué recursos puede cargar el navegador. # Ajusta las URLs de scripts, estilos, imágenes, etc. # ------------------------------------------------------------- Header always set Content-Security-Policy " default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https:; style-src 'self' 'unsafe-inline' https:; img-src 'self' data: https:; font-src 'self' https: data:; connect-src 'self' https:; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; object-src 'none'; upgrade-insecure-requests; " </IfModule>
Desinfección
- contención
- backup
- desinfección
contención
- modo mantenimineto
- cambiar todas las contraseñas
- wordpress admins
- BDD
- FTP
- cerrar todas las sesiones activas
- regenerar las claves de seguridad wp-config.php: https://api.wordpress.org/secret_key/1.1/salt/
backup
- en el estado en que esté…
- ficheros, BDD
- Updraft Plus, WP Vivid
desinfección
- restaurar ficheros originales del Core
- 2 plugins para limpiar:
- WordFence
- GOTMLS
- caso web no funcional
- comprovar versión WP exacta: /wp-includes/version.php →
$wp_version = «X.X.X» - descargar la misma versión desde https://ca.wordpress.org/download/releases/
- borrar todo excepto:
- carpeta wp-content
- ficheros wp-config.php y .htaccess
- subir la versión limpia
- revisar los ficheros que no hemos eliminado:
- caso web funcional
- Usar plugins para desinfectar wp-content
- WordFence
- Opciones Avanzadas de exploración → asegurarnos que no hay exclusiones (si ya estaba instalado)
- GOTMLS (mejor escaneando BDD)
- revisar snipets
- plugin «Framentos de código» o equivalentes
- nombres de archivo en minúscilas
- desactivar barra navegador
- activar emoticonos
- Año actual
- Temas
- personalizar JS
- Widgets: Apariencia → Widgets
plugins recomendados
- WordFence (seguridad)
- GOTMLS (seguridad)
- WP Maintenance (Modo mantenimiento)
- Disable XML-RPC-API
- Per Neatma (Amin Nazemi)
- NS Cloner - Site Copier
