📝 Checklist Sécurité Audit WordPress
Audit WordPress : wp-config, plugins, thèmes, base de données, .htaccess, SSL/TLS, WAF, sauvegardes et monitoring.
Checklist d'audit sécurité WordPress couvrant la configuration wp-config.php, la gestion des plugins et thèmes, le durcissement de la base de données, les règles .htaccess, la configuration SSL/TLS, le déploiement WAF, les stratégies de sauvegarde et le monitoring en continu.
📑 Table des matières
CHECKLIST SÉCURITÉ AUDIT SITE WEB WORDPRESS
AYI NEDJIMI CONSULTANTS (ANC)
Version : 1.0
Date : 04/04/2026
Classification : CONFIDENTIEL
Auteur : AYI NEDJIMI CONSULTANTS
Type d’audit : Audit de Sécurité Site Web WordPress
📋 LÉGENDE
Statut d’Évaluation
- ✅ Conforme - Le contrôle est correctement implémenté
- ❌ Non-conforme - Le contrôle n’est pas implémenté ou défaillant
- ⚠️ Partiellement conforme - Le contrôle est partiellement implémenté
- N/A Non applicable - Le contrôle ne s’applique pas au contexte
Niveau de Criticité
- 🔴 Critique - Risque très élevé, correction immédiate requise
- 🟠 Élevé - Risque élevé, correction prioritaire
- 🟡 Moyen - Risque modéré, correction à planifier
- 🟢 Faible - Risque faible, amélioration recommandée
⚡ MODE DÉCOUVERTE RAPIDE — 15 QUESTIONS CLÉS
Cette section permet une évaluation rapide des points critiques de sécurité WordPress en 15 minutes.
DR.1 — Version WordPress Actuelle
Question : La version WordPress est-elle à jour (< 30 jours) ? Vérification :
wpscan --url https://example.com --enumerate vp
wp core check-update
Statut : ☐ ✅ ☐ ❌ ☐ ⚠️ ☐ N/A
DR.2 — Plugins et Thèmes à Jour
Question : Tous les plugins et thèmes sont-ils à jour et exempts de vulnérabilités connues ? Vérification :
wpscan --url https://example.com --enumerate vp,vt --plugins-detection aggressive
wp plugin list --update=available
Statut : ☐ ✅ ☐ ❌ ☐ ⚠️ ☐ N/A
DR.3 — Pare-feu Applicatif (WAF)
Question : Un WAF est-il configuré et actif (Wordfence, Sucuri, Cloudflare) ? Vérification : Test d’injection SQL basique, vérification headers Statut : ☐ ✅ ☐ ❌ ☐ ⚠️ ☐ N/A
DR.4 — Sauvegardes Automatisées
Question : Des sauvegardes automatisées sont-elles configurées et testées ? Vérification : Vérification plugin backup, planification, stockage externe Statut : ☐ ✅ ☐ ❌ ☐ ⚠️ ☐ N/A
DR.5 — Authentification Multi-Facteurs (2FA)
Question : La 2FA est-elle activée pour tous les comptes administrateurs ? Vérification : Test connexion admin, plugin 2FA installé Statut : ☐ ✅ ☐ ❌ ☐ ⚠️ ☐ N/A
DR.6 — SSL/TLS et HTTPS Forcé
Question : Le site utilise-t-il exclusivement HTTPS avec un certificat valide ? Vérification :
curl -s -I https://example.com | grep -i strict-transport-security
openssl s_client -connect example.com:443 -servername example.com
Statut : ☐ ✅ ☐ ❌ ☐ ⚠️ ☐ N/A
DR.7 — XML-RPC Désactivé
Question : XML-RPC est-il désactivé pour prévenir les attaques par déni de service ? Vérification :
curl -X POST https://example.com/xmlrpc.php -d "<?xml version='1.0'?><methodCall><methodName>system.listMethods</methodName></methodCall>"
Statut : ☐ ✅ ☐ ❌ ☐ ⚠️ ☐ N/A
DR.8 — REST API Sécurisée
Question : L’API REST WordPress est-elle restreinte et authentifiée ? Vérification :
curl https://example.com/wp-json/wp/v2/users/
curl https://example.com/wp-json/wp/v2/posts/
Statut : ☐ ✅ ☐ ❌ ☐ ⚠️ ☐ N/A
DR.9 — Permissions Fichiers Correctes
Question : Les permissions fichiers suivent-elles les recommandations (644/755) ? Vérification : wp-config.php (600), .htaccess (644), répertoires (755) Statut : ☐ ✅ ☐ ❌ ☐ ⚠️ ☐ N/A
DR.10 — wp-config.php Protégé
Question : Le fichier wp-config.php est-il protégé contre l’accès web direct ? Vérification :
curl -s https://example.com/wp-config.php
curl -s https://example.com/wp-config.php.bak
Statut : ☐ ✅ ☐ ❌ ☐ ⚠️ ☐ N/A
DR.11 — Utilisateurs Administrateurs Minimaux
Question : Le nombre d’utilisateurs admin est-il minimal et justifié ? Vérification :
wp user list --role=administrator
wpscan --url https://example.com --enumerate u
Statut : ☐ ✅ ☐ ❌ ☐ ⚠️ ☐ N/A
DR.12 — Headers de Sécurité HTTP
Question : Les headers de sécurité essentiels sont-ils configurés ? Vérification :
curl -s -I https://example.com | grep -E "X-Frame-Options|X-Content-Type-Options|Content-Security-Policy"
Statut : ☐ ✅ ☐ ❌ ☐ ⚠️ ☐ N/A
DR.13 — Base de Données Sécurisée
Question : La base de données utilise-t-elle un préfixe personnalisé et des privilèges minimaux ? Vérification : Inspection wp-config.php, test connexion DB Statut : ☐ ✅ ☐ ❌ ☐ ⚠️ ☐ N/A
DR.14 — Monitoring et Journalisation
Question : Un système de monitoring des activités suspectes est-il en place ? Vérification : Plugin d’audit log, alertes de sécurité configurées Statut : ☐ ✅ ☐ ❌ ☐ ⚠️ ☐ N/A
DR.15 — Plan de Réponse aux Incidents
Question : Un plan de réponse aux incidents de sécurité est-il documenté ? Vérification : Documentation disponible, contacts d’urgence définis Statut : ☐ ✅ ☐ ❌ ☐ ⚠️ ☐ N/A
📊 INFORMATIONS CLIENT
Informations Générales
- URL du site : ________________________________
- Environnement : ☐ Production ☐ Staging ☐ Développement
- Date d’audit : ________________________________
- Auditeur : ____________________________________
Configuration Technique
- Version WordPress : ___________________________
- Version PHP : _________________________________
- Version MySQL/MariaDB : _______________________
- Serveur Web : ☐ Apache ☐ Nginx ☐ LiteSpeed ☐ IIS
- Hébergeur : ___________________________________
- Type d’hébergement : ☐ Shared ☐ VPS ☐ Dédié ☐ Cloud ☐ Infogéré
Plugins et Thèmes
- Nombre de plugins actifs : ____________________
- Nombre de plugins inactifs : ___________________
- Thème actif : _________________________________
- Child theme utilisé : ☐ Oui ☐ Non
- Thèmes inactifs : _____________________________
Utilisateurs et Trafic
- Nombre d’administrateurs : ____________________
- Nombre total d’utilisateurs : __________________
- Trafic mensuel (visiteurs uniques) : ___________
- Pics de trafic identifiés : ____________________
Sécurité Existante
- Plugin de sécurité installé : ☐ Wordfence ☐ Sucuri ☐ iThemes Security ☐ All In One WP Security ☐ Autre : ______________
- WAF externe : ☐ Cloudflare ☐ Sucuri ☐ AWS WAF ☐ Autre : ______________
- Service de backup : ☐ UpdraftPlus ☐ BackWPup ☐ VaultPress ☐ Hébergeur ☐ Autre : ______________
🛡️ SECTIONS D’AUDIT DÉTAILLÉES
S1 — INSTALLATION & CONFIGURATION DE BASE (20 contrôles)
Cette section couvre les aspects fondamentaux de l’installation et de la configuration sécurisée de WordPress.
1.1.1 — Version WordPress Actuelle et Supportée
Niveau : 🔴
Référence : OWASP A06 / CIS WordPress 1.1 / NIST 800-53 SI-2
MITRE ATT&CK : T1190
Description : WordPress doit être maintenu à jour avec la dernière version stable. Les versions obsolètes contiennent des vulnérabilités critiques exploitées activement par les attaquants. Une mise à jour dans les 30 jours suivant la publication est recommandée.
Vérification :
# Vérification avec WPScan
wpscan --url https://example.com --enumerate vp --no-banner
# Vérification via wp-cli
wp core check-update
wp core version
# Vérification manuelle
curl -s https://example.com/ | grep -o 'content="WordPress [0-9.]*"'
Remédiation :
- Effectuer une sauvegarde complète avant mise à jour
- Tester en environnement de staging
wp core update
wp core update-db
- Activer les mises à jour automatiques mineures :
// Dans wp-config.php
define( 'WP_AUTO_UPDATE_CORE', 'minor' );
Valeur par défaut : Mises à jour automatiques mineures activées depuis WordPress 3.7
1.1.2 — Version PHP Supportée et Sécurisée
Niveau : 🔴
Référence : OWASP A06 / CIS WordPress 1.2 / NIST 800-53 SI-2
MITRE ATT&CK : T1190
Description : PHP doit être maintenu dans une version supportée officiellement (PHP 8.0+). Les versions obsolètes de PHP présentent des vulnérabilités de sécurité critiques et des problèmes de performance.
Vérification :
# Via wp-cli
wp eval "echo PHP_VERSION;"
# Via WPScan
wpscan --url https://example.com --enumerate vp --no-banner | grep -i php
# Test direct
curl -s https://example.com/wp-content/themes/twentytwentyone/index.php
Remédiation :
- Mettre à niveau vers PHP 8.1+ minimum
- Configurer php.ini sécurisé :
expose_php = Off
allow_url_fopen = Off
allow_url_include = Off
display_errors = Off
log_errors = On
Valeur par défaut : Dépend de l’hébergeur, souvent PHP 7.4 ou antérieur
1.1.3 — Configuration wp-config.php Sécurisée
Niveau : 🔴
Référence : OWASP A05 / CIS WordPress 2.1 / NIST 800-53 AC-3
MITRE ATT&CK : T1005
Description : Le fichier wp-config.php contient les informations de connexion à la base de données et les clés de sécurité. Il doit être protégé contre l’accès web direct et configuré avec les bonnes pratiques de sécurité.
Vérification :
# Test accès direct
curl -s https://example.com/wp-config.php
curl -s https://example.com/wp-config.php.bak
# Vérification permissions
ls -la wp-config.php
# Vérification contenu (sur serveur)
grep -E "(DB_PASSWORD|AUTH_KEY)" wp-config.php
Remédiation :
- Déplacer wp-config.php hors de web root ou protéger via .htaccess :
<Files wp-config.php>
order allow,deny
deny from all
</Files>
- Définir les permissions appropriées :
chmod 600 wp-config.php
- Ajouter les constantes de sécurité essentielles
Valeur par défaut : Permissions 644, souvent accessible via web
1.1.4 — Clés de Sécurité SALT Configurées
Niveau : 🟠
Référence : OWASP A02 / CIS WordPress 2.2 / NIST 800-53 SC-12
MITRE ATT&CK : T1552
Description : Les clés SALT renforcent la sécurité des cookies et des sessions utilisateurs. Elles doivent être uniques, complexes et changées régulièrement pour prévenir les attaques de décryptage.
Vérification :
# Vérification présence des clés
grep -E "(AUTH_KEY|SECURE_AUTH_KEY|LOGGED_IN_KEY|NONCE_KEY)" wp-config.php
# Test avec wp-cli
wp config get AUTH_KEY
wp config get SECURE_AUTH_KEY
Remédiation :
- Générer de nouvelles clés via https://api.wordpress.org/secret-key/1.1/salt/
- Ajouter dans wp-config.php :
define('AUTH_KEY', 'votre-clé-unique-ici');
define('SECURE_AUTH_KEY', 'votre-clé-unique-ici');
define('LOGGED_IN_KEY', 'votre-clé-unique-ici');
define('NONCE_KEY', 'votre-clé-unique-ici');
define('AUTH_SALT', 'votre-clé-unique-ici');
define('SECURE_AUTH_SALT', 'votre-clé-unique-ici');
define('LOGGED_IN_SALT', 'votre-clé-unique-ici');
define('NONCE_SALT', 'votre-clé-unique-ici');
- Renouveler les clés tous les 6 mois
Valeur par défaut : Clés par défaut ou vides lors de l’installation
1.1.5 — Préfixe Table Base de Données Personnalisé
Niveau : 🟡
Référence : OWASP A03 / CIS WordPress 2.3 / NIST 800-53 SC-28
MITRE ATT&CK : T1190
Description : Le préfixe par défaut “wp_” facilite les attaques d’injection SQL automatisées. Un préfixe personnalisé ajoute une couche d’obscurité contre les attaques génériques.
Vérification :
# Via wp-config.php
grep "table_prefix" wp-config.php
# Via wp-cli
wp config get table_prefix
# Test base de données
mysql -e "SHOW TABLES LIKE 'wp_%'" database_name
Remédiation :
- Avant installation, modifier wp-config.php :
$table_prefix = 'xyz123_';
- Pour une installation existante, utiliser un plugin ou script :
wp search-replace "wp_" "xyz123_" --dry-run
wp db export backup.sql
# Puis renommer les tables manuellement
Valeur par défaut : wp_
1.1.6 — Mode Debug Désactivé en Production
Niveau : 🟠
Référence : OWASP A09 / CIS WordPress 2.4 / NIST 800-53 SI-11
MITRE ATT&CK : T1005
Description : Le mode debug révèle des informations sensibles sur la structure du site et les erreurs système. Il doit être désactivé en production pour éviter la divulgation d’informations.
Vérification :
# Vérification wp-config.php
grep "WP_DEBUG" wp-config.php
# Test via wp-cli
wp config get WP_DEBUG
# Forcer une erreur pour tester
curl -s https://example.com/?debug=1
Remédiation :
- Dans wp-config.php :
define('WP_DEBUG', false);
define('WP_DEBUG_LOG', false);
define('WP_DEBUG_DISPLAY', false);
define('SCRIPT_DEBUG', false);
- Supprimer le fichier debug.log existant :
rm wp-content/debug.log
Valeur par défaut : WP_DEBUG false
1.1.7 — Édition de Fichiers Désactivée
Niveau : 🟠
Référence : OWASP A01 / CIS WordPress 2.5 / NIST 800-53 AC-6
MITRE ATT&CK : T1105
Description : L’éditeur de fichiers intégré à WordPress permet de modifier les thèmes et plugins depuis l’interface d’administration. Cette fonctionnalité représente un risque majeur en cas de compromission d’un compte administrateur.
Vérification :
# Vérification wp-config.php
grep "DISALLOW_FILE_EDIT" wp-config.php
# Test interface admin
# Aller dans Apparence > Éditeur de thème
Remédiation :
- Ajouter dans wp-config.php :
define('DISALLOW_FILE_EDIT', true);
- Vérifier que le menu “Éditeur” disparaît de l’admin
Valeur par défaut : Édition activée
1.1.8 — Installation de Plugins/Thèmes Contrôlée
Niveau : 🟠
Référence : OWASP A01 / CIS WordPress 2.6 / NIST 800-53 CM-7
MITRE ATT&CK : T1505
Description : Restreindre l’installation de plugins et thèmes depuis l’interface d’administration réduit les risques d’installation de code malveillant en cas de compromission.
Vérification :
# Vérification wp-config.php
grep -E "(DISALLOW_FILE_MODS|WP_FILESYSTEM_METHOD)" wp-config.php
# Test interface admin - tentative d'installation
Remédiation :
- Pour désactiver complètement :
define('DISALLOW_FILE_MODS', true);
- Pour contrôler les permissions :
define('FS_METHOD', 'direct');
define('WP_FILESYSTEM_METHOD', 'direct');
Valeur par défaut : Installation libre pour les administrateurs
1.1.9 — Révisions de Posts Limitées
Niveau : 🟢
Référence : CIS WordPress 2.7 / NIST 800-53 SC-28
MITRE ATT&CK : T1005
Description : WordPress conserve par défaut un historique illimité des révisions d’articles. Limiter ce nombre évite l’accumulation de données sensibles et améliore les performances.
Vérification :
# Vérification wp-config.php
grep "WP_POST_REVISIONS" wp-config.php
# Via wp-cli
wp config get WP_POST_REVISIONS
# Compter les révisions existantes
wp post list --post_type=revision --format=count
Remédiation :
- Limiter les révisions dans wp-config.php :
define('WP_POST_REVISIONS', 3);
- Nettoyer les révisions existantes :
wp post delete $(wp post list --post_type=revision --format=ids) --force
Valeur par défaut : Révisions illimitées
1.1.10 — Corbeille Automatique Configurée
Niveau : 🟢
Référence : CIS WordPress 2.8 / NIST 800-53 SC-28
MITRE ATT&CK : T1005
Description : Les éléments supprimés restent dans la corbeille WordPress indéfiniment par défaut. Configurer une purge automatique évite l’accumulation de contenu supprimé potentiellement sensible.
Vérification :
# Vérification wp-config.php
grep "EMPTY_TRASH_DAYS" wp-config.php
# Vérifier contenu corbeille
wp post list --post_status=trash --format=count
Remédiation :
- Configurer la purge automatique :
define('EMPTY_TRASH_DAYS', 7);
- Purger manuellement la corbeille :
wp post delete $(wp post list --post_status=trash --format=ids) --force
Valeur par défaut : 30 jours
1.1.11 — Version MySQL/MariaDB Supportée
Niveau : ��
Référence : OWASP A06 / CIS WordPress 1.3 / NIST 800-53 SI-2
MITRE ATT&CK : T1190
Description : La base de données doit utiliser une version supportée de MySQL (8.0+) ou MariaDB (10.3+). Les versions obsolètes contiennent des vulnérabilités critiques et manquent de fonctionnalités de sécurité modernes.
Vérification :
# Via wp-cli
wp db version
# Connexion directe
mysql -V
# Via PHP
wp eval "echo 'MySQL: ' . $wpdb->db_version();"
Remédiation :
- Mettre à niveau vers MySQL 8.0+ ou MariaDB 10.5+
- Vérifier la compatibilité WordPress après migration
- Optimiser les paramètres de sécurité MySQL
Valeur par défaut : Dépend de l’hébergeur
1.1.12 — Constantes de Sécurité Avancées
Niveau : 🟡
Référence : OWASP A05 / CIS WordPress 2.9 / NIST 800-53 SC-8
MITRE ATT&CK : T1040
Description : WordPress offre plusieurs constantes pour renforcer la sécurité : forcer HTTPS, sécuriser les cookies, contrôler les redirections. Ces configurations durcissent la sécurité globale.
Vérification :
# Vérifier les constantes de sécurité
grep -E "(FORCE_SSL_ADMIN|COOKIE_DOMAIN|WP_HTTP_BLOCK_EXTERNAL)" wp-config.php
Remédiation :
- Ajouter les constantes de sécurité :
define('FORCE_SSL_ADMIN', true);
define('COOKIE_DOMAIN', '.example.com');
define('COOKIEHASH', md5('example.com'));
define('WP_HTTP_BLOCK_EXTERNAL', true);
define('WP_ACCESSIBLE_HOSTS', 'api.wordpress.org,*.github.com');
Valeur par défaut : Non configurées
1.1.13 — Répertoire wp-content Personnalisé
Niveau : 🟡
Référence : CIS WordPress 2.10 / NIST 800-53 SC-28
MITRE ATT&CK : T1083
Description : Personnaliser le répertoire wp-content ajoute une couche d’obscurité et complique la reconnaissance automatisée de l’architecture WordPress par les attaquants.
Vérification :
# Vérification wp-config.php
grep -E "(WP_CONTENT_DIR|WP_CONTENT_URL)" wp-config.php
# Structure répertoires
ls -la | grep -v wp-content
Remédiation :
- Avant installation, dans wp-config.php :
define('WP_CONTENT_DIR', ABSPATH . 'assets/');
define('WP_CONTENT_URL', 'https://example.com/assets/');
- Déplacer le répertoire wp-content vers assets/
- Mettre à jour les liens dans la base de données
Valeur par défaut : wp-content/
1.1.14 — URL d’Administration Personnalisée
Niveau : 🟡
Référence : CIS WordPress 2.11 / NIST 800-53 SC-28
MITRE ATT&CK : T1083
Description : Modifier l’URL d’accès à l’administration (/wp-admin/) réduit l’exposition aux attaques par force brute automatisées qui ciblent l’URL standard.
Vérification :
# Test accès standard
curl -s -I https://example.com/wp-admin/
curl -s -I https://example.com/wp-login.php
# Vérifier plugin de sécurité installé
wp plugin list | grep -i security
Remédiation :
- Utiliser un plugin comme “WPS Hide Login” :
wp plugin install wps-hide-login --activate
wp option update whl_page "admin-secure-$(openssl rand -hex 6)"
- Ou via .htaccess (méthode avancée) :
RewriteRule ^admin-secret/?$ /wp-admin/ [L]
RewriteRule ^wp-admin/$ /404/ [L]
Valeur par défaut : /wp-admin/ et /wp-login.php
1.1.15 — Suppression Fichiers par Défaut
Niveau : 🟡
Référence : OWASP A09 / CIS WordPress 2.12 / NIST 800-53 CM-7
MITRE ATT&CK : T1083
Description : WordPress installe des fichiers par défaut qui révèlent des informations sur la version et la configuration : readme.html, license.txt, wp-config-sample.php. Ces fichiers doivent être supprimés.
Vérification :
# Test présence fichiers par défaut
curl -s https://example.com/readme.html
curl -s https://example.com/license.txt
curl -s https://example.com/wp-config-sample.php
ls -la readme.html license.txt wp-config-sample.php
Remédiation :
- Supprimer les fichiers sensibles :
rm readme.html license.txt wp-config-sample.php
rm wp-admin/install.php wp-admin/upgrade.php
- Bloquer via .htaccess :
<FilesMatch "(readme|license|changelog|install)">
Order allow,deny
Deny from all
</FilesMatch>
Valeur par défaut : Fichiers présents après installation
1.1.16 — Configuration Memory Limit Appropriée
Niveau : 🟢
Référence : CIS WordPress 1.4 / NIST 800-53 SI-7
MITRE ATT&CK : T1498
Description : Une limite mémoire insuffisante peut causer des erreurs et des vulnérabilités. Une limite trop élevée peut permettre des attaques par déni de service. La valeur doit être équilibrée selon les besoins.
Vérification :
# Via wp-cli
wp eval "echo 'Memory Limit: ' . ini_get('memory_limit');"
# Via WPScan
wpscan --url https://example.com --enumerate vp | grep -i memory
Remédiation :
- Dans wp-config.php :
ini_set('memory_limit', '256M');
define('WP_MEMORY_LIMIT', '256M');
define('WP_MAX_MEMORY_LIMIT', '512M');
- Surveiller l’utilisation mémoire réelle
Valeur par défaut : 40M ou 128M selon la configuration
1.1.17 — Configuration Timezone Sécurisée
Niveau : 🟢
Référence : CIS WordPress 2.13 / NIST 800-53 AU-8
MITRE ATT&CK : T1070
Description : Un fuseau horaire correct est essentiel pour la synchronisation des logs, la planification des tâches et la corrélation d’événements de sécurité. Les timestamps incorrects compliquent l’analyse forensique.
Vérification :
# Via wp-cli
wp option get timezone_string
wp eval "echo date_default_timezone_get();"
# Interface admin
# Réglages > Général > Fuseau horaire
Remédiation :
- Configurer le fuseau horaire :
wp option update timezone_string "Europe/Paris"
- Dans wp-config.php :
date_default_timezone_set('Europe/Paris');
Valeur par défaut : UTC ou fuseau du serveur
1.1.18 — Limitation Taille Upload Sécurisée
Niveau : 🟡
Référence : OWASP A04 / CIS WordPress 2.14 / NIST 800-53 SI-10
MITRE ATT&CK : T1105
Description : Limiter la taille des fichiers uploadés prévient les attaques par déni de service et réduit les risques d’upload de fichiers malveillants volumineux.
Vérification :
# Via wp-cli
wp eval "echo 'Upload Max: ' . ini_get('upload_max_filesize');"
wp eval "echo 'Post Max: ' . ini_get('post_max_size');"
# Interface admin
# Médias > Ajouter
Remédiation :
- Dans wp-config.php :
ini_set('upload_max_filesize', '10M');
ini_set('post_max_size', '10M');
ini_set('max_execution_time', 60);
- Via .htaccess :
php_value upload_max_filesize 10M
php_value post_max_size 10M
Valeur par défaut : 2M à 32M selon l’hébergeur
1.1.19 — Configuration Cron Sécurisée
Niveau : 🟡
Référence : CIS WordPress 2.15 / NIST 800-53 CM-6
MITRE ATT&CK : T1053
Description : Le système cron WordPress (wp-cron) peut être exploité pour des attaques par déni de service. Le désactiver et utiliser le cron système améliore la sécurité et les performances.
Vérification :
# Vérifier wp-config.php
grep "DISABLE_WP_CRON" wp-config.php
# Tester wp-cron
curl https://example.com/wp-cron.php
wp cron event list
Remédiation :
- Désactiver wp-cron dans wp-config.php :
define('DISABLE_WP_CRON', true);
- Configurer cron système :
# Crontab
*/15 * * * * curl -s https://example.com/wp-cron.php >/dev/null 2>&1
Valeur par défaut : wp-cron activé
1.1.20 — Configuration Error Reporting Sécurisée
Niveau : 🟠
Référence : OWASP A09 / CIS WordPress 2.16 / NIST 800-53 SI-11
MITRE ATT&CK : T1005
Description : Les erreurs PHP affichées peuvent révéler des informations sensibles sur la structure du serveur et les chemins de fichiers. L’affichage doit être désactivé en production.
Vérification :
# Forcer une erreur PHP
curl -s "https://example.com/wp-content/themes/active-theme/functions.php"
# Vérifier configuration
wp eval "echo 'Display Errors: ' . ini_get('display_errors');"
Remédiation :
- Dans wp-config.php :
ini_set('display_errors', 0);
ini_set('log_errors', 1);
ini_set('error_log', ABSPATH . 'wp-content/debug.log');
- Protéger le fichier de log :
<Files debug.log>
Order allow,deny
Deny from all
</Files>
Valeur par défaut : Dépend de la configuration PHP
S2 — AUTHENTIFICATION & GESTION DES UTILISATEURS (25 contrôles)
Cette section traite de la sécurité des comptes utilisateurs, de l’authentification et des contrôles d’accès.
2.1.1 — Politique de Mots de Passe Forte
Niveau : 🔴
Référence : OWASP A07 / CIS WordPress 3.1 / NIST 800-53 IA-5
MITRE ATT&CK : T1110.001
Description : WordPress ne impose pas de politique de mots de passe par défaut. Des mots de passe faibles facilitent les attaques par force brute et par dictionnaire. Une politique stricte est essentielle pour la sécurité des comptes.
Vérification :
# Énumérer les utilisateurs
wp user list --field=user_login
wpscan --url https://example.com --enumerate u --no-banner
# Tester force brute (avec autorisation)
wp user check-password admin password123
Remédiation :
- Installer un plugin de politique de mots de passe :
wp plugin install force-strong-passwords --activate
- Ou ajouter dans functions.php :
function enforce_strong_passwords($errors, $update, $user) {
$password = $_POST['pass1'];
if (!empty($password) && strlen($password) < 12) {
$errors->add('weak_password', 'Le mot de passe doit contenir au moins 12 caractères.');
}
return $errors;
}
add_action('user_profile_update_errors', 'enforce_strong_passwords', 10, 3);
Valeur par défaut : Aucune politique appliquée
2.1.2 — Authentification Multi-Facteurs (2FA/MFA)
Niveau : 🔴
Référence : OWASP A07 / CIS WordPress 3.2 / NIST 800-53 IA-2
MITRE ATT&CK : T1110
Description : L’authentification à deux facteurs est cruciale pour protéger les comptes administrateurs. Elle ajoute une couche de sécurité même en cas de compromission du mot de passe.
Vérification :
# Vérifier plugins 2FA installés
wp plugin list | grep -iE "(two|2fa|authenticator|otp)"
# Tester connexion admin sans 2FA
curl -d "log=admin&pwd=password" https://example.com/wp-login.php
Remédiation :
- Installer un plugin 2FA réputé :
wp plugin install two-factor --activate
# ou
wp plugin install google-authenticator --activate
# ou
wp plugin install wordfence --activate
- Configurer pour tous les administrateurs
- Forcer l’activation pour les rôles sensibles
Valeur par défaut : Non activée
2.1.3 — Limitation Tentatives de Connexion
Niveau : 🔴
Référence : OWASP A07 / CIS WordPress 3.3 / NIST 800-53 AC-7
MITRE ATT&CK : T1110.001
Description : WordPress permet un nombre illimité de tentatives de connexion par défaut, facilitant les attaques par force brute. Limiter les tentatives et implémenter un délai progressif est essentiel.
Vérification :
# Tester attaque force brute
curl -d "log=admin&pwd=wrong1" https://example.com/wp-login.php
curl -d "log=admin&pwd=wrong2" https://example.com/wp-login.php
curl -d "log=admin&pwd=wrong3" https://example.com/wp-login.php
# Vérifier si compte bloqué
Remédiation :
- Plugin de limitation des tentatives :
wp plugin install limit-login-attempts-reloaded --activate
wp option update limit_login_allowed_retries 3
wp option update limit_login_lockout_duration 1800
- Ou via Wordfence :
wp plugin install wordfence --activate
Valeur par défaut : Tentatives illimitées
2.1.4 — Protection reCAPTCHA
Niveau : 🟠
Référence : OWASP A07 / CIS WordPress 3.4 / NIST 800-53 SI-3
MITRE ATT&CK : T1110.003
Description : L’intégration de reCAPTCHA sur les formulaires de connexion, d’inscription et de contact prévient les attaques automatisées et le spam.
Vérification :
# Vérifier présence reCAPTCHA sur wp-login
curl -s https://example.com/wp-login.php | grep -i recaptcha
curl -s https://example.com/wp-login.php | grep -i "google.com/recaptcha"
Remédiation :
- Installer un plugin reCAPTCHA :
wp plugin install google-captcha --activate
- Configurer les clés API Google reCAPTCHA
- Activer sur : connexion, inscription, commentaires, contact
Valeur par défaut : Non configuré
2.1.5 — Gestion Roles Utilisateurs Restrictive
Niveau : 🟠
Référence : OWASP A01 / CIS WordPress 3.5 / NIST 800-53 AC-6
MITRE ATT&CK : T1078
Description : Appliquer le principe du moindre privilège en assignant les rôles minimaux nécessaires. Éviter la prolifération des comptes administrateurs et auditer régulièrement les permissions.
Vérification :
# Lister utilisateurs par rôle
wp user list --role=administrator --format=table
wp user list --role=editor --format=table
wp user list --format=table --fields=user_login,roles
# Énumération externe
wpscan --url https://example.com --enumerate u1-100 --no-banner
Remédiation :
- Auditer et réduire les administrateurs :
wp user set-role user2 editor
wp user set-role user3 author
- Créer des rôles personnalisés si nécessaire :
wp plugin install members --activate
- Supprimer les comptes inutiles :
wp user delete unused_user --reassign=1
Valeur par défaut : Rôle admin souvent sur-utilisé
2.1.6 — Prévention Énumération Utilisateurs
Niveau : 🟡
Référence : OWASP A01 / CIS WordPress 3.6 / NIST 800-53 SC-28
MITRE ATT&CK : T1087
Description : WordPress permet l’énumération des utilisateurs via diverses méthodes (?author=1, /wp-json/wp/v2/users/, etc.). Cette information facilite les attaques ciblées et doit être bloquée.
Vérification :
# Test énumération classique
curl -s "https://example.com/?author=1" | grep -o "author/[^/]*"
curl -s "https://example.com/wp-json/wp/v2/users/" | jq '.[].slug'
# Via WPScan
wpscan --url https://example.com --enumerate u --no-banner
Remédiation :
- Bloquer via .htaccess :
# Bloquer énumération ?author=
RewriteCond %{QUERY_STRING} ^author=([0-9]+) [NC]
RewriteRule ^(.*)$ /? [R=301,L]
# Bloquer API users
RewriteRule ^wp-json/wp/v2/users /404 [R=404,L]
- Ou via functions.php :
// Bloquer énumération utilisateurs
add_action('wp', 'prevent_user_enumeration');
function prevent_user_enumeration() {
if (is_author() || (isset($_GET['author']) && !is_admin())) {
wp_redirect(home_url(), 301);
exit;
}
}
Valeur par défaut : Énumération possible
2.1.7 — Désactivation XML-RPC
Niveau : 🔴
Référence : OWASP A10 / CIS WordPress 3.7 / NIST 800-53 CM-7
MITRE ATT&CK : T1190
Description : XML-RPC permet l’accès distant à WordPress mais est souvent exploité pour des attaques par amplification DDoS et force brute. Il doit être désactivé si non utilisé.
Vérification :
# Test XML-RPC actif
curl -X POST https://example.com/xmlrpc.php \
-d "<?xml version='1.0'?><methodCall><methodName>system.listMethods</methodName></methodCall>"
# Test attaque amplification
curl -X POST https://example.com/xmlrpc.php \
-d "<?xml version='1.0'?><methodCall><methodName>system.multicall</methodName><params><param><value><array><data><value><struct><member><name>methodName</name><value><string>wp.getUsersBlogs</string></value></member></struct></value></data></array></value></param></params></methodCall>"
Remédiation :
- Désactiver via functions.php :
add_filter('xmlrpc_enabled', '__return_false');
remove_action('wp_head', 'rsd_link');
- Bloquer via .htaccess :
<Files xmlrpc.php>
Order allow,deny
Deny from all
</Files>
- Via plugin de sécurité :
wp plugin install disable-xml-rpc --activate
Valeur par défaut : XML-RPC activé
2.1.8 — Sécurisation wp-login.php
Niveau : 🟠
Référence : OWASP A07 / CIS WordPress 3.8 / NIST 800-53 AC-3
MITRE ATT&CK : T1110
Description : La page de connexion WordPress est une cible privilégiée des attaques. Implémenter des mesures de protection spécifiques : HTTPS forcé, headers de sécurité, masquage des erreurs.
Vérification :
# Tester page de connexion
curl -s -I https://example.com/wp-login.php
curl -s https://example.com/wp-login.php | grep -i "motdepasse\|username\|erreur"
# Test redirection HTTPS
curl -s -I http://example.com/wp-login.php
Remédiation :
- Forcer HTTPS pour l’admin :
define('FORCE_SSL_ADMIN', true);
- Personnaliser les erreurs de connexion :
function custom_login_error() {
return 'Identifiants incorrects.';
}
add_filter('login_errors', 'custom_login_error');
- Ajouter headers de sécurité :
<FilesMatch "wp-login.php">
Header always set X-Frame-Options "DENY"
Header always set X-Content-Type-Options "nosniff"
</FilesMatch>
Valeur par défaut : Protection basique uniquement
2.1.9 — Audit Sessions Utilisateurs
Niveau : 🟡
Référence : OWASP A02 / CIS WordPress 3.9 / NIST 800-53 AU-3
MITRE ATT&CK : T1078
Description : Surveiller et auditer les sessions utilisateurs actives permet de détecter les accès non autorisés et les sessions concurrentes suspectes.
Vérification :
# Lister sessions actives
wp user session list --all
# Vérifier metadata utilisateurs
wp user meta list 1 | grep session
Remédiation :
- Installer plugin d’audit des sessions :
wp plugin install user-session-control --activate
- Configurer expiration des sessions :
// Limiter durée des sessions
function custom_session_expire($expiration, $user_id, $remember) {
return $remember ? DAY_IN_SECONDS * 7 : HOUR_IN_SECONDS * 2;
}
add_filter('auth_cookie_expiration', 'custom_session_expire', 10, 3);
Valeur par défaut : Sessions illimitées dans le temps
2.1.10 — Protection Comptes Inactifs
Niveau : 🟡
Référence : OWASP A01 / CIS WordPress 3.10 / NIST 800-53 AC-2
MITRE ATT&CK : T1078
Description : Les comptes utilisateurs inactifs représentent un risque de sécurité. Ils doivent être identifiés, désactivés ou supprimés selon une politique définie.
Vérification :
# Utilisateurs sans connexion récente
wp user list --format=csv --fields=user_login,user_registered | head
# Via plugin d'audit
wp plugin list | grep -i "activity\|audit\|log"
Remédiation :
- Auditer l’activité utilisateur :
wp plugin install wp-security-audit-log --activate
- Script de désactivation automatique :
function disable_inactive_users() {
$inactive_days = 90;
$users = get_users(array('meta_key' => 'last_activity', 'meta_compare' => '<', 'meta_value' => date('Y-m-d', strtotime("-{$inactive_days} days"))));
foreach ($users as $user) {
wp_update_user(array('ID' => $user->ID, 'user_status' => 1));
}
}
Valeur par défaut : Comptes inactifs conservés indéfiniment
2.1.11 — Sécurisation Mot de Passe Administrateur
Niveau : 🔴
Référence : OWASP A07 / CIS WordPress 3.11 / NIST 800-53 IA-5
MITRE ATT&CK : T1110
Description : Le compte administrateur principal est la cible prioritaire des attaquants. Son mot de passe doit être extrêmement robuste et changé régulièrement.
Vérification :
# Identifier le compte admin principal
wp user list --role=administrator --field=user_login | head -1
# Tenter connexion avec mots de passe communs (avec autorisation)
Remédiation :
- Générer mot de passe fort :
wp user update admin --user_pass="$(openssl rand -base64 32)"
- Renommer le compte admin :
wp user update admin --user_login=newadminname
- Implémenter rotation régulière des mots de passe
Valeur par défaut : Souvent “admin/admin” ou mots de passe faibles
2.1.12 — Configuration Cookies Sécurisés
Niveau : 🟠
Référence : OWASP A02 / CIS WordPress 3.12 / NIST 800-53 SC-23
MITRE ATT&CK : T1539
Description : Les cookies d’authentification doivent être configurés avec les attributs de sécurité appropriés : Secure, HttpOnly, SameSite pour prévenir les attaques de détournement.
Vérification :
# Analyser les cookies
curl -c cookies.txt -b cookies.txt -s https://example.com/wp-login.php
cat cookies.txt
# Vérifier attributs sécurité
curl -s -I -D headers.txt https://example.com/wp-login.php
grep -i "set-cookie" headers.txt
Remédiation :
- Configurer cookies sécurisés :
// Dans wp-config.php
ini_set('session.cookie_secure', 1);
ini_set('session.cookie_httponly', 1);
ini_set('session.cookie_samesite', 'Strict');
define('COOKIE_DOMAIN', '.example.com');
- Via .htaccess :
<IfModule mod_headers.c>
Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure;SameSite=Strict
</IfModule>
Valeur par défaut : Cookies sans attributs de sécurité
2.1.13 — Restriction Accès par IP
Niveau : 🟡
Référence : OWASP A01 / CIS WordPress 3.13 / NIST 800-53 AC-3
MITRE ATT&CK : T1078
Description : Limiter l’accès administratif à des adresses IP spécifiques ajoute une couche de sécurité, particulièrement efficace pour les équipes avec IPs fixes.
Vérification :
# Tester accès depuis IP non autorisée
curl -s -I https://example.com/wp-admin/ --interface 8.8.8.8
# Vérifier .htaccess ou configuration serveur
grep -A 10 -B 2 "allow\|deny" .htaccess
Remédiation :
- Protection via .htaccess :
<Directory "/wp-admin">
Order deny,allow
Deny from all
Allow from 192.168.1.0/24
Allow from 203.0.113.5
</Directory>
- Via plugin de sécurité :
wp plugin install all-in-one-wp-security-and-firewall --activate
Valeur par défaut : Accès libre depuis toutes les IPs
2.1.14 — Audit Trail Authentifications
Niveau : 🟡
Référence : OWASP A09 / CIS WordPress 3.14 / NIST 800-53 AU-2
MITRE ATT&CK : T1078
Description : Enregistrer toutes les tentatives d’authentification (succès et échecs) permet de détecter les attaques et d’analyser les patterns suspects d’accès.
Vérification :
# Vérifier logs d'activité
wp plugin list | grep -iE "(log|audit|activity)"
# Examiner fichiers de log
ls -la wp-content/uploads/wp-security-audit-log/
tail -f wp-content/debug.log | grep -i login
Remédiation :
- Installer plugin d’audit complet :
wp plugin install wp-security-audit-log --activate
- Configurer logs personnalisés :
function log_login_attempts($user_login, $user = null) {
$ip = $_SERVER['REMOTE_ADDR'];
$user_agent = $_SERVER['HTTP_USER_AGENT'];
error_log("Login attempt: {$user_login} from {$ip} - {$user_agent}");
}
add_action('wp_login_failed', 'log_login_attempts');
add_action('wp_login', 'log_login_attempts', 10, 2);
Valeur par défaut : Logs minimaux dans les logs serveur
2.1.15 — Protection Contre Attaques Timing
Niveau : 🟡
Référence : OWASP A07 / CIS WordPress 3.15 / NIST 800-53 SC-5
MITRE ATT&CK : T1110
Description : Les différences de temps de réponse entre utilisateur valide/invalide peuvent révéler des informations. Uniformiser les temps de réponse prévient les attaques par analyse temporelle.
Vérification :
# Mesurer temps de réponse
time curl -d "log=validuser&pwd=wrongpass" https://example.com/wp-login.php
time curl -d "log=invaliduser&pwd=wrongpass" https://example.com/wp-login.php
# Comparer les différences
Remédiation :
- Uniformiser les temps de réponse :
function uniform_login_response() {
// Délai fixe pour toutes les réponses
usleep(rand(500000, 1000000)); // 0.5-1 seconde
}
add_action('login_init', 'uniform_login_response');
- Utiliser des hashes constants :
function secure_login_check($user, $password) {
$stored_hash = '$2y$10$dummy.hash.for.timing.protection';
password_verify($password, $stored_hash); // Calcul constant
return $user;
}
Valeur par défaut : Temps de réponse variables
2.1.16 — Gestion Expiration Mots de Passe
Niveau : 🟡
Référence : OWASP A07 / CIS WordPress 3.16 / NIST 800-53 IA-5
MITRE ATT&CK : T1110
Description : Forcer le renouvellement périodique des mots de passe, particulièrement pour les comptes privilégiés, réduit l’impact d’une compromission de credentials.
Vérification :
# Vérifier plugins de gestion des mots de passe
wp plugin list | grep -iE "(password|expir)"
# Examiner métadonnées utilisateurs
wp user meta list 1 | grep -iE "(password|expir)"
Remédiation :
- Plugin d’expiration des mots de passe :
wp plugin install force-password-reset --activate
- Code personnalisé :
function check_password_age($user_login, $user = null) {
$last_change = get_user_meta($user->ID, 'password_last_change', true);
$max_age = 90 * DAY_IN_SECONDS; // 90 jours
if ($last_change && (time() - $last_change > $max_age)) {
wp_redirect(admin_url('profile.php?password_expired=1'));
exit;
}
}
add_action('wp_login', 'check_password_age', 10, 2);
Valeur par défaut : Mots de passe sans expiration
2.1.17 — Protection Reset Mot de Passe
Niveau : 🟠
Référence : OWASP A07 / CIS WordPress 3.17 / NIST 800-53 IA-5
MITRE ATT&CK : T1110
Description : Le processus de réinitialisation des mots de passe peut être exploité pour des attaques par énumération et déni de service. Il doit être sécurisé et limité.
Vérification :
# Tester reset de mot de passe
curl -d "user_login=admin" https://example.com/wp-login.php?action=lostpassword
curl -d "user_login=nonexistent" https://example.com/wp-login.php?action=lostpassword
# Vérifier rate limiting
Remédiation :
- Limiter les demandes de reset :
function limit_password_reset() {
$ip = $_SERVER['REMOTE_ADDR'];
$transient = 'pwd_reset_' . md5($ip);
if (get_transient($transient)) {
wp_die('Trop de demandes. Réessayez dans 15 minutes.');
}
set_transient($transient, true, 15 * MINUTE_IN_SECONDS);
}
add_action('lostpassword_post', 'limit_password_reset');
- Masquer les messages d’erreur :
function generic_reset_message() {
return 'Si cet utilisateur existe, un email a été envoyé.';
}
add_filter('lostpassword_errors', 'generic_reset_message');
Valeur par défaut : Reset illimité avec messages révélateurs
2.1.18 — Authentification Applications Tierces
Niveau : 🟡
Référence : OWASP A02 / CIS WordPress 3.18 / NIST 800-53 IA-2
MITRE ATT&CK : T1078
Description : Les applications tierces utilisant l’API WordPress doivent utiliser des méthodes d’authentification sécurisées : Application Passwords, OAuth, JWT plutôt que les credentials directs.
Vérification :
# Vérifier Application Passwords
wp user application-password list admin
# Tester authentification API
curl -u "admin:password" https://example.com/wp-json/wp/v2/users/me
Remédiation :
- Configurer Application Passwords :
wp user application-password create admin "Mon App Mobile" --porcelain
- Désactiver authentification basique pour API :
add_filter('rest_authentication_errors', function($result) {
if (!empty($result)) {
return $result;
}
if (!is_user_logged_in() && !isset($_SERVER['PHP_AUTH_USER'])) {
return new WP_Error('rest_not_logged_in', 'Authentification requise.', array('status' => 401));
}
return $result;
});
Valeur par défaut : Authentification basique possible
2.1.19 — Séparation Comptes Fonctionnels
Niveau : 🟡
Référence : OWASP A01 / CIS WordPress 3.19 / NIST 800-53 AC-6
MITRE ATT&CK : T1078
Description : Séparer les comptes techniques/fonctionnels des comptes utilisateurs humains améliore la traçabilité et permet un contrôle d’accès granulaire.
Vérification :
# Identifier les comptes de service
wp user list --format=table --fields=user_login,user_email,roles
# Vérifier les dernières connexions
wp plugin install wp-security-audit-log --activate
Remédiation :
- Créer comptes dédiés :
wp user create api-service api@example.com --role=editor --user_pass="$(openssl rand -base64 32)"
wp user create backup-service backup@example.com --role=subscriber --user_pass="$(openssl rand -base64 32)"
- Restreindre les permissions :
// Rôle personnalisé pour services
function create_service_role() {
add_role('api_service', 'Service API', array(
'read' => true,
'edit_posts' => true,
'publish_posts' => false
));
}
add_action('init', 'create_service_role');
Valeur par défaut : Comptes mixtes humains/services
2.1.20 — Monitoring Escalade Privilèges
Niveau : 🟠
Référence : OWASP A01 / CIS WordPress 3.20 / NIST 800-53 AU-6
MITRE ATT&CK : T1078
Description : Surveiller les changements de rôles et permissions utilisateurs permet de détecter les escalades de privilèges malveillantes ou accidentelles.
Vérification :
# Vérifier historique des changements de rôles
wp plugin list | grep -iE "(audit|security|log)"
# Examiner les logs d'activité
Remédiation :
- Monitoring automatisé :
function monitor_role_changes($user_id, $role, $old_roles) {
$user = get_userdata($user_id);
$new_roles = $user->roles;
if ($old_roles != $new_roles) {
error_log("SECURITY: Role change for user {$user->user_login}: " .
implode(',', $old_roles) . " -> " . implode(',', $new_roles));
// Alerter l'administrateur
wp_mail('admin@example.com', 'Changement de rôle détecté',
"L'utilisateur {$user->user_login} a changé de rôle.");
}
}
add_action('set_user_role', 'monitor_role_changes', 10, 3);
- Plugin d’audit complet :
wp plugin install wp-security-audit-log --activate
Valeur par défaut : Changements non surveillés
2.1.21 — Protection Contre User Enumeration API
Niveau : 🟡
Référence : OWASP A01 / CIS WordPress 3.21 / NIST 800-53 SC-28
MITRE ATT&CK : T1087
Description : L’API REST WordPress expose par défaut les informations utilisateurs. Cette exposition doit être contrôlée pour empêcher la reconnaissance et le profilage des utilisateurs.
Vérification :
# Test exposition utilisateurs via API
curl -s https://example.com/wp-json/wp/v2/users/ | jq '.[] | {id, name, slug}'
curl -s https://example.com/wp-json/wp/v2/users/1 | jq '{id, name, slug, roles}'
Remédiation :
- Restreindre l’accès à l’API utilisateurs :
// Bloquer complètement l'endpoint users
add_filter('rest_endpoints', function($endpoints) {
if (isset($endpoints['/wp/v2/users'])) {
unset($endpoints['/wp/v2/users']);
}
if (isset($endpoints['/wp/v2/users/(?P<id>[\d]+)'])) {
unset($endpoints['/wp/v2/users/(?P<id>[\d]+)']);
}
return $endpoints;
});
- Ou limiter aux utilisateurs connectés :
add_filter('rest_user_query', function($prepared_args, $request) {
if (!is_user_logged_in()) {
return new WP_Error('rest_user_cannot_view', 'Accès non autorisé.', array('status' => 401));
}
return $prepared_args;
}, 10, 2);
Valeur par défaut : API utilisateurs publique
2.1.22 — Gestion Sessions Concurrentes
Niveau : 🟡
Référence : OWASP A02 / CIS WordPress 3.22 / NIST 800-53 AC-12
MITRE ATT&CK : T1078
Description : Limiter le nombre de sessions simultanées par utilisateur et détecter les connexions concurrentes suspectes peut révéler des compromissions de comptes.
Vérification :
# Examiner les sessions actives
wp user session list --all --format=table
# Compter sessions par utilisateur
wp user list --format=ids | xargs -I {} wp user session list {} --format=count
Remédiation :
- Limiter les sessions concurrentes :
function limit_concurrent_sessions($user_login, $user) {
$sessions = WP_Session_Tokens::get_instance($user->ID);
$all_sessions = $sessions->get_all();
if (count($all_sessions) > 2) { // Max 2 sessions
// Détruire les sessions anciennes
$sessions->destroy_others($_COOKIE[LOGGED_IN_COOKIE]);
}
}
add_action('wp_login', 'limit_concurrent_sessions', 10, 2);
- Alertes de connexions multiples :
function alert_concurrent_login($user_login, $user) {
$sessions = WP_Session_Tokens::get_instance($user->ID);
if (count($sessions->get_all()) > 1) {
wp_mail($user->user_email, 'Nouvelle connexion détectée',
'Une nouvelle connexion a été détectée sur votre compte.');
}
}
add_action('wp_login', 'alert_concurrent_login', 10, 2);
Valeur par défaut : Sessions multiples illimitées
2.1.23 — Protection Mot de Passe en Transit
Niveau : 🔴
Référence : OWASP A02 / CIS WordPress 3.23 / NIST 800-53 SC-8
MITRE ATT&CK : T1040
Description : Tous les échanges de mots de passe doivent être chiffrés via HTTPS. HTTP doit être complètement désactivé pour les pages d’authentification.
Vérification :
# Tester redirection HTTPS
curl -I http://example.com/wp-login.php
curl -I http://example.com/wp-admin/
# Vérifier force SSL
grep "FORCE_SSL_ADMIN" wp-config.php
Remédiation :
- Forcer HTTPS pour l’administration :
// wp-config.php
define('FORCE_SSL_ADMIN', true);
- Redirection .htaccess :
RewriteCond %{HTTPS} off
RewriteRule ^(wp-admin|wp-login\.php).*$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
- Headers de sécurité HTTPS :
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
</IfModule>
Valeur par défaut : HTTP autorisé
2.1.24 — Authentification Forte pour API
Niveau : 🟠
Référence : OWASP A02 / CIS WordPress 3.24 / NIST 800-53 IA-2
MITRE ATT&CK : T1078
Description : L’API REST WordPress doit utiliser des méthodes d’authentification robustes : JWT, OAuth2, ou Application Passwords plutôt que l’authentification basique.
Vérification :
# Tester authentification API
curl -u "admin:password" https://example.com/wp-json/wp/v2/posts
# Vérifier plugins d'authentification
wp plugin list | grep -iE "(jwt|oauth|auth)"
Remédiation :
- Installer JWT Authentication :
wp plugin install jwt-authentication-for-wp-rest-api --activate
- Configuration JWT :
// wp-config.php
define('JWT_AUTH_SECRET_KEY', 'your-secret-key');
define('JWT_AUTH_CORS_ENABLE', true);
- Désactiver auth basique :
add_filter('rest_authentication_errors', function($result) {
if (isset($_SERVER['PHP_AUTH_USER'])) {
return new WP_Error('rest_authentication_error', 'Authentification basique désactivée.');
}
return $result;
});
Valeur par défaut : Authentification basique autorisée
2.1.25 — Politique Verrouillage Compte
Niveau : 🟠
Référence : OWASP A07 / CIS WordPress 3.25 / NIST 800-53 AC-7
MITRE ATT&CK : T1110
Description : Définir une politique claire de verrouillage des comptes après échecs d’authentification, avec procédures de déverrouillage sécurisées.
Vérification :
# Tester politique de verrouillage
# (Nécessite plusieurs tentatives d'échec)
for i in {1..5}; do
curl -d "log=admin&pwd=wrong$i" https://example.com/wp-login.php
done
# Vérifier état du verrouillage
Remédiation :
- Configuration Wordfence :
wp plugin install wordfence --activate
wp option update wordfence_ls_maxFailures 5
wp option update wordfence_ls_duration 1800
- Politique personnalisée :
function advanced_account_lockout($username) {
$lockout_key = 'failed_login_' . md5($username);
$failed_count = get_transient($lockout_key) ?: 0;
if ($failed_count >= 3) {
// Verrouillage progressif
$lockout_duration = min(pow(2, $failed_count - 3) * 300, 86400); // Max 24h
set_transient($lockout_key . '_locked', true, $lockout_duration);
wp_die("Compte temporairement verrouillé. Réessayez dans " .
human_time_diff(time() + $lockout_duration) . ".");
}
}
add_action('wp_login_failed', 'advanced_account_lockout');
Valeur par défaut : Pas de verrouillage automatique
S3 — PLUGINS & EXTENSIONS (25 contrôles)
Cette section couvre la sécurité des plugins WordPress, leur gestion et leur surveillance.
3.1.1 — Inventaire Complet des Plugins
Niveau : 🔴
Référence : OWASP A06 / CIS WordPress 4.1 / NIST 800-53 CM-8
MITRE ATT&CK : T1190
Description : Maintenir un inventaire complet et à jour de tous les plugins installés est essentiel pour la gestion des vulnérabilités et la réduction de la surface d’attaque.
Vérification :
# Lister tous les plugins
wp plugin list --format=table --fields=name,status,version,update_version
# Scanner avec WPScan
wpscan --url https://example.com --enumerate vp --plugins-detection aggressive --no-banner
# Plugins inactifs
wp plugin list --status=inactive
Remédiation :
- Documenter tous les plugins :
wp plugin list --format=csv --fields=name,version,status,auto_update > plugins_inventory.csv
- Supprimer plugins inactifs :
wp plugin delete $(wp plugin list --status=inactive --field=name)
- Audit régulier :
# Script d'audit mensuel
#!/bin/bash
wp plugin list --field=name | while read plugin; do
echo "Plugin: $plugin - $(wp plugin get $plugin --field=version)"
done
Valeur par défaut : Plugins accumulés sans inventaire
3.1.2 — Plugins Obsolètes et Abandonnés
Niveau : 🔴
Référence : OWASP A06 / CIS WordPress 4.2 / NIST 800-53 SI-2
MITRE ATT&CK : T1190
Description : Les plugins obsolètes ou abandonnés par leurs développeurs représentent un risque critique car ils ne reçoivent plus de correctifs de sécurité.
Vérification :
# Vérifier mises à jour disponibles
wp plugin list --update=available
# Scanner plugins obsolètes avec WPScan
wpscan --url https://example.com --enumerate vp --plugins-version-detection aggressive
# Vérifier dernière mise à jour
wp plugin list --format=json | jq '.[] | {name: .name, version: .version}'
Remédiation :
- Identifier plugins sans mise à jour récente :
# Plugins sans update depuis 2 ans
wp plugin list --format=json | jq '.[] | select(.last_updated < "2022-01-01")'
- Remplacer ou supprimer :
wp plugin deactivate abandoned-plugin
wp plugin delete abandoned-plugin
# Chercher alternative
wp plugin search "alternative functionality"
- Surveillance automatisée :
function check_abandoned_plugins() {
$plugins = get_plugins();
foreach ($plugins as $plugin_file => $plugin_data) {
// Vérifier âge dernière mise à jour
$last_updated = get_plugin_data($plugin_file)['Version'];
// Alerter si > 2 ans
}
}
wp_schedule_event(time(), 'monthly', 'check_abandoned_plugins');
Valeur par défaut : Plugins conservés indéfiniment
3.1.3 — Vulnérabilités Connues (Base WPScan)
Niveau : 🔴
Référence : OWASP A06 / CIS WordPress 4.3 / NIST 800-53 SI-2
MITRE ATT&CK : T1190
Description : Vérifier régulièrement les plugins contre la base de vulnérabilités WPScan pour identifier les risques de sécurité connus et non patchés.
Vérification :
# Scan vulnérabilités avec API key
wpscan --url https://example.com --enumerate vp --plugins-detection aggressive --api-token YOUR_API_TOKEN
# Vérification spécifique
wpscan --url https://example.com --enumerate vp --plugins-detection aggressive | grep -A 5 -B 5 "vulnerabilities"
Remédiation :
- Audit automatisé quotidien :
#!/bin/bash
wpscan --url https://example.com --enumerate vp --api-token $WPSCAN_TOKEN --format json > daily_scan.json
if grep -q "vulnerabilities" daily_scan.json; then
mail -s "Vulnérabilités détectées" admin@example.com < daily_scan.json
fi
- Mise à jour immédiate des plugins vulnérables :
wp plugin update --all
- Surveillance continue :
// Hook pour vérifier avant activation
function check_plugin_vulnerabilities($plugin) {
// Intégration API WPScan
$response = wp_remote_get("https://wpscan.com/api/v3/plugins/{$plugin}");
// Analyser réponse et bloquer si vulnérable
}
add_action('activate_plugin', 'check_plugin_vulnerabilities');
Valeur par défaut : Aucune vérification automatique
3.1.4 — Permissions et Capacités des Plugins
Niveau : 🟠
Référence : OWASP A01 / CIS WordPress 4.4 / NIST 800-53 AC-6
MITRE ATT&CK : T1078
Description : Auditer les permissions demandées par les plugins et s’assurer qu’elles respectent le principe du moindre privilège. Certains plugins demandent des droits excessifs.
Vérification :
# Examiner les capacités des plugins
wp eval "
\$plugins = get_plugins();
foreach (\$plugins as \$plugin => \$data) {
echo \$plugin . ' - ' . \$data['Name'] . PHP_EOL;
}
"
# Vérifier hooks et actions
grep -r "add_action\|add_filter" wp-content/plugins/ | head -20
Remédiation :
- Audit des permissions :
function audit_plugin_capabilities() {
$active_plugins = get_option('active_plugins');
foreach ($active_plugins as $plugin) {
$plugin_data = get_plugin_data(WP_PLUGIN_DIR . '/' . $plugin);
// Analyser les hooks et capabilities
echo "Plugin: " . $plugin_data['Name'] . " - Version: " . $plugin_data['Version'] . "\n";
}
}
- Restriction des plugins par rôle :
function restrict_plugin_access() {
if (!current_user_can('manage_options')) {
remove_menu_page('plugins.php');
}
}
add_action('admin_menu', 'restrict_plugin_access');
Valeur par défaut : Permissions larges non auditées
3.1.5 — Plugins Nulled et Piratés
Niveau : 🔴
Référence : OWASP A08 / CIS WordPress 4.5 / NIST 800-53 SI-3
MITRE ATT&CK : T1505
Description : Les plugins piratés ou “nulled” contiennent souvent des backdoors, malwares ou code malveillant. Ils représentent un risque critique pour la sécurité.
Vérification :
# Scanner fichiers suspects
find wp-content/plugins/ -name "*.php" -exec grep -l "eval\|base64_decode\|gzinflate" {} \;
# Vérifier intégrité avec checksums officiels
wp plugin verify-checksums --all
# Rechercher backdoors connues
grep -r "c99\|r57\|webshell" wp-content/plugins/
Remédiation :
- Supprimer immédiatement les plugins suspects :
wp plugin deactivate suspicious-plugin
wp plugin delete suspicious-plugin
- Scanner régulièrement :
# Script de détection malware
#!/bin/bash
find wp-content/ -name "*.php" | xargs grep -l "eval.*base64_decode\|system.*\$_" > suspicious_files.txt
if [ -s suspicious_files.txt ]; then
mail -s "Fichiers suspects détectés" admin@example.com < suspicious_files.txt
fi
- Politique d’acquisition stricte :
// Bloquer installation depuis sources non officielles
function restrict_plugin_sources($result, $action, $args) {
if ($action == 'install-plugin') {
// Vérifier source officielle WordPress.org
if (!str_contains($args['source'], 'downloads.wordpress.org')) {
return new WP_Error('unauthorized_source', 'Installation uniquement depuis WordPress.org autorisée.');
}
}
return $result;
}
add_filter('upgrader_pre_download', 'restrict_plugin_sources', 10, 3);
Valeur par défaut : Aucun contrôle des sources
3.1.6 — Auto-Update des Plugins Critiques
Niveau : 🟠
Référence : OWASP A06 / CIS WordPress 4.6 / NIST 800-53 SI-2
MITRE ATT&CK : T1190
Description : Activer les mises à jour automatiques pour les plugins de sécurité critiques assure une protection rapide contre les vulnérabilités nouvellement découvertes.
Vérification :
# Vérifier statut auto-update
wp plugin auto-updates status
wp plugin list --format=table --fields=name,auto_update
# Plugins de sécurité installés
wp plugin list | grep -iE "(security|firewall|backup|malware)"
Remédiation :
- Activer auto-update pour plugins critiques :
wp plugin auto-updates enable wordfence
wp plugin auto-updates enable updraftplus
wp plugin auto-updates enable sucuri-scanner
- Configuration globale :
// wp-config.php - Auto-update tous les plugins
define('WP_AUTO_UPDATE_CORE', true);
add_filter('auto_update_plugin', '__return_true');
- Auto-update sélectif :
function selective_plugin_auto_update($update, $item) {
$security_plugins = array(
'wordfence/wordfence.php',
'updraftplus/updraftplus.php',
'sucuri-scanner/sucuri.php'
);
return in_array($item->plugin, $security_plugins);
}
add_filter('auto_update_plugin', 'selective_plugin_auto_update', 10, 2);
Valeur par défaut : Auto-update désactivé
3.1.7 — Réduction Surface d’Attaque
Niveau : 🟠
Référence : OWASP A04 / CIS WordPress 4.7 / NIST 800-53 CM-7
MITRE ATT&CK : T1190
Description : Minimiser le nombre de plugins actifs réduit la surface d’attaque. Chaque plugin supplémentaire augmente les risques de vulnérabilités et de conflits.
Vérification :
# Compter plugins actifs
wp plugin list --status=active --format=count
# Analyser utilisation réelle
wp plugin list --format=table --fields=name,status,version
# Identifier plugins redondants
Remédiation :
- Audit d’utilisation :
# Désactiver temporairement et tester
wp plugin deactivate non-essential-plugin
# Tester fonctionnalité site
# Si OK, supprimer définitivement
wp plugin delete non-essential-plugin
- Consolidation des fonctionnalités :
// Remplacer multiple plugins par un seul multifonction
// Ex: Wordfence remplace plusieurs plugins sécurité
wp plugin install wordfence --activate
wp plugin deactivate old-security-plugin1 old-security-plugin2
- Politique de plugins minimale :
// Limite nombre de plugins actifs
function enforce_plugin_limit() {
$active_count = count(get_option('active_plugins', array()));
if ($active_count > 20) { // Limite à 20 plugins
wp_die('Limite de plugins atteinte. Désactivez des plugins avant d\'en activer de nouveaux.');
}
}
add_action('activate_plugin', 'enforce_plugin_limit');
Valeur par défaut : Accumulation illimitée de plugins
3.1.8 — Validation Code Source Plugins
Niveau : 🟡
Référence : OWASP A04 / CIS WordPress 4.8 / NIST 800-53 SI-7
MITRE ATT&CK : T1505
Description : Valider l’intégrité et la sécurité du code source des plugins avant installation, particulièrement pour les plugins provenant de sources tierces.
Vérification :
# Vérifier checksums plugins officiels
wp plugin verify-checksums --all
# Scanner code malveillant
find wp-content/plugins/ -name "*.php" -exec php -l {} \; | grep -v "No syntax errors"
# Rechercher patterns suspects
grep -r "eval\|exec\|system\|shell_exec" wp-content/plugins/
Remédiation :
- Validation avant installation :
# Télécharger et analyser avant installation
wget https://downloads.wordpress.org/plugin/plugin-name.zip
unzip plugin-name.zip
grep -r "eval\|base64_decode" plugin-name/
# Si clean, installer
wp plugin install plugin-name.zip
- Monitoring intégrité :
function monitor_plugin_integrity() {
$plugins_dir = WP_PLUGIN_DIR;
$known_hashes = get_option('plugin_hashes', array());
foreach (glob("$plugins_dir/*/*.php") as $file) {
$current_hash = md5_file($file);
$relative_path = str_replace($plugins_dir . '/', '', $file);
if (isset($known_hashes[$relative_path]) &&
$known_hashes[$relative_path] !== $current_hash) {
// Fichier modifié - alerter
wp_mail('admin@example.com', 'Plugin modifié', "Le fichier $file a été modifié.");
}
$known_hashes[$relative_path] = $current_hash;
}
update_option('plugin_hashes', $known_hashes);
}
wp_schedule_event(time(), 'daily', 'monitor_plugin_integrity');
Valeur par défaut : Aucune validation du code
3.1.9 — Gestion Dépendances des Plugins
Niveau : 🟡
Référence : OWASP A06 / CIS WordPress 4.9 / NIST 800-53 CM-8
MITRE ATT&CK : T1195
Description : Documenter et gérer les dépendances entre plugins pour éviter les conflits de sécurité et assurer la cohérence des mises à jour.
Vérification :
# Analyser dépendances
wp plugin list --format=json | jq '.[] | {name: .name, requires: .requires_wp}'
# Tester désactivation en cascade
wp plugin deactivate parent-plugin
# Vérifier erreurs
tail -f wp-content/debug.log
Remédiation :
- Cartographie des dépendances :
function map_plugin_dependencies() {
$plugins = get_plugins();
$dependencies = array();
foreach ($plugins as $plugin_file => $plugin_data) {
// Analyser headers et requirements
if (isset($plugin_data['RequiresPlugins'])) {
$dependencies[$plugin_file] = explode(',', $plugin_data['RequiresPlugins']);
}
}
update_option('plugin_dependencies', $dependencies);
return $dependencies;
}
- Validation ordre de désactivation :
function validate_plugin_deactivation($plugin) {
$dependencies = get_option('plugin_dependencies', array());
foreach ($dependencies as $dependent_plugin => $required_plugins) {
if (in_array($plugin, $required_plugins) && is_plugin_active($dependent_plugin)) {
wp_die("Impossible de désactiver $plugin : requis par $dependent_plugin");
}
}
}
add_action('deactivate_plugin', 'validate_plugin_deactivation');
Valeur par défaut : Gestion manuelle des dépendances
3.1.10 — Sandbox et Tests Plugins
Niveau : 🟡
Référence : OWASP A04 / CIS WordPress 4.10 / NIST 800-53 CM-3
MITRE ATT&CK : T1505
Description : Tester les nouveaux plugins dans un environnement de staging isolé avant déploiement en production pour identifier les risques de sécurité.
Vérification :
# Vérifier environnement de staging
wp option get siteurl
wp config get WP_ENVIRONMENT_TYPE
# Comparer plugins prod vs staging
wp plugin list --format=csv > production_plugins.csv
Remédiation :
- Configuration environnement de test :
// wp-config.php staging
define('WP_ENVIRONMENT_TYPE', 'staging');
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
- Procédure de test :
# Script de test automatisé
#!/bin/bash
STAGING_URL="https://staging.example.com"
PLUGIN_NAME=$1
# Installer sur staging
wp plugin install $PLUGIN_NAME --activate --url=$STAGING_URL
# Scanner vulnérabilités
wpscan --url $STAGING_URL --enumerate vp
# Test fonctionnel
curl -s $STAGING_URL | grep -i "error\|warning"
# Si OK, déployer en prod
- Isolation des tests :
function restrict_staging_plugins() {
if (wp_get_environment_type() === 'staging') {
// Désactiver plugins dangereux en staging
$dangerous_plugins = array('backup-plugin', 'mail-sender');
foreach ($dangerous_plugins as $plugin) {
if (is_plugin_active($plugin)) {
deactivate_plugins($plugin);
}
}
}
}
add_action('plugins_loaded', 'restrict_staging_plugins');
Valeur par défaut : Installation directe en production
3.1.11 — Monitoring Activité Plugins
Niveau : 🟡
Référence : OWASP A09 / CIS WordPress 4.11 / NIST 800-53 AU-2
MITRE ATT&CK : T1505
Description : Surveiller l’activité des plugins (installation, activation, désactivation, mises à jour) pour détecter les changements non autorisés.
Vérification :
# Vérifier logs d'activité
wp plugin list | grep -iE "(activity|audit|log)"
# Examiner logs plugin changes
tail -f wp-content/uploads/wp-security-audit-log/
Remédiation :
- Logging complet des activités :
function log_plugin_activities($plugin, $network_activation) {
$user = wp_get_current_user();
$log_entry = array(
'timestamp' => current_time('mysql'),
'user' => $user->user_login,
'action' => 'plugin_activation',
'plugin' => $plugin,
'ip' => $_SERVER['REMOTE_ADDR']
);
error_log('PLUGIN_ACTIVITY: ' . json_encode($log_entry));
// Alerter pour plugins critiques
if (strpos($plugin, 'security') !== false) {
wp_mail('admin@example.com', 'Plugin sécurité activé',
"Plugin $plugin activé par {$user->user_login}");
}
}
add_action('activated_plugin', 'log_plugin_activities', 10, 2);
add_action('deactivated_plugin', 'log_plugin_activities', 10, 2);
- Dashboard monitoring :
function plugin_activity_dashboard() {
$recent_activities = get_option('recent_plugin_activities', array());
echo '<div class="notice notice-info">';
echo '<h3>Activité Plugins Récente</h3>';
foreach ($recent_activities as $activity) {
echo "<p>{$activity['timestamp']} - {$activity['action']} - {$activity['plugin']}</p>";
}
echo '</div>';
}
add_action('admin_notices', 'plugin_activity_dashboard');
Valeur par défaut : Activité non surveillée
3.1.12 — Politique Installation Plugins
Niveau : 🟠
Référence : OWASP A01 / CIS WordPress 4.12 / NIST 800-53 CM-3
MITRE ATT&CK : T1505
Description : Établir une politique stricte d’installation et de gestion des plugins avec processus d’approbation et validation sécurisée.
Vérification :
# Vérifier qui peut installer des plugins
wp user list --role=administrator --format=table
# Vérifier restrictions actuelles
grep "DISALLOW_FILE_MODS" wp-config.php
Remédiation :
- Restriction installation :
// wp-config.php - Désactiver installation plugins
define('DISALLOW_FILE_MODS', true);
- Processus d’approbation :
function require_plugin_approval($result, $action, $args) {
if ($action === 'install-plugin') {
$approved_plugins = get_option('approved_plugins', array());
$plugin_slug = $args['slug'];
if (!in_array($plugin_slug, $approved_plugins)) {
return new WP_Error('unapproved_plugin',
'Plugin non approuvé. Contactez l\'administrateur.');
}
}
return $result;
}
add_filter('upgrader_pre_download', 'require_plugin_approval', 10, 3);
- Whitelist plugins autorisés :
function enforce_plugin_whitelist() {
$allowed_plugins = array(
'wordfence/wordfence.php',
'updraftplus/updraftplus.php',
'yoast-seo/wp-seo.php'
);
$active_plugins = get_option('active_plugins');
foreach ($active_plugins as $plugin) {
if (!in_array($plugin, $allowed_plugins)) {
deactivate_plugins($plugin);
wp_mail('admin@example.com', 'Plugin non autorisé désactivé',
"Plugin $plugin automatiquement désactivé.");
}
}
}
add_action('admin_init', 'enforce_plugin_whitelist');
Valeur par défaut : Installation libre
3.1.13 — Backup avant Modifications Plugins
Niveau : 🟠
Référence : OWASP A04 / CIS WordPress 4.13 / NIST 800-53 CP-9
MITRE ATT&CK : T1485
Description : Effectuer systématiquement des sauvegardes avant l’installation, mise à jour ou modification de plugins pour permettre une restauration rapide.
Vérification :
# Vérifier politique backup
wp plugin list | grep -iE "(backup|updraft)"
# Dernière sauvegarde
wp option get updraftplus_last_backup
Remédiation :
- Backup automatique avant modifications :
function backup_before_plugin_changes($upgrader, $hook_extra) {
if (isset($hook_extra['type']) && $hook_extra['type'] === 'plugin') {
// Déclencher sauvegarde
do_action('updraftplus_backup_now', 'plugins_only');
// Attendre completion
sleep(5);
// Vérifier succès backup
$last_backup = get_option('updraftplus_last_backup');
if (!$last_backup || (time() - $last_backup) > 300) {
wp_die('Sauvegarde échouée. Modification annulée.');
}
}
}
add_action('upgrader_process_complete', 'backup_before_plugin_changes', 10, 2);
- Point de restauration :
# Script de point de restauration
#!/bin/bash
BACKUP_DIR="/backups/$(date +%Y%m%d_%H%M%S)"
mkdir -p $BACKUP_DIR
tar -czf $BACKUP_DIR/plugins.tar.gz wp-content/plugins/
mysqldump -u$DB_USER -p$DB_PASS $DB_NAME > $BACKUP_DIR/database.sql
echo "Backup créé: $BACKUP_DIR"
Valeur par défaut : Modifications sans sauvegarde
3.1.14 — Contrôle Versions Plugins
Niveau : 🟡
Référence : OWASP A06 / CIS WordPress 4.14 / NIST 800-53 CM-3
MITRE ATT&CK : T1195
Description : Maintenir un contrôle strict des versions des plugins utilisées, éviter les versions beta/alpha en production, documenter les versions approuvées.
Vérification :
# Versions actuelles
wp plugin list --format=table --fields=name,version,status
# Vérifier versions beta/dev
wp plugin list --format=json | jq '.[] | select(.version | contains("beta") or contains("dev") or contains("alpha"))'
Remédiation :
- Politique versions stables uniquement :
function enforce_stable_versions($result, $action, $args) {
if ($action === 'install-plugin') {
$version = $args['version'] ?? 'latest';
if (preg_match('/(alpha|beta|dev|rc)/i', $version)) {
return new WP_Error('unstable_version',
'Versions non-stables interdites en production.');
}
}
return $result;
}
add_filter('upgrader_pre_download', 'enforce_stable_versions', 10, 3);
- Verrouillage versions critiques :
function lock_critical_plugin_versions($transient) {
$locked_versions = array(
'wordfence/wordfence.php' => '7.8.2',
'updraftplus/updraftplus.php' => '1.22.23'
);
if (isset($transient->response)) {
foreach ($locked_versions as $plugin => $locked_version) {
if (isset($transient->response[$plugin])) {
unset($transient->response[$plugin]);
}
}
}
return $transient;
}
add_filter('pre_set_site_transient_update_plugins', 'lock_critical_plugin_versions');
Valeur par défaut : Mises à jour automatiques vers dernière version
3.1.15 — Séparation Plugins par Environnement
Niveau : 🟡
Référence : OWASP A04 / CIS WordPress 4.15 / NIST 800-53 CM-2
MITRE ATT&CK : T1505
Description : Maintenir des configurations de plugins différentes selon les environnements (dev/staging/prod) pour éviter l’exposition de fonctionnalités de debug en production.
Vérification :
# Identifier environnement
wp config get WP_ENVIRONMENT_TYPE
# Plugins de debug actifs
wp plugin list | grep -iE "(debug|dev|test|query|profil)"
Remédiation :
- Configuration par environnement :
function environment_specific_plugins() {
$environment = wp_get_environment_type();
switch ($environment) {
case 'production':
$forbidden_plugins = array(
'query-monitor/query-monitor.php',
'debug-bar/debug-bar.php',
'developer/developer.php'
);
foreach ($forbidden_plugins as $plugin) {
if (is_plugin_active($plugin)) {
deactivate_plugins($plugin);
}
}
break;
case 'staging':
// Activer plugins de test
if (!is_plugin_active('query-monitor/query-monitor.php')) {
activate_plugin('query-monitor/query-monitor.php');
}
break;
}
}
add_action('plugins_loaded', 'environment_specific_plugins');
- Must-use plugins par environnement :
// mu-plugins/environment-control.php
if (wp_get_environment_type() === 'production') {
// Désactiver fonctionnalités dangereuses
define('WP_DEBUG', false);
define('SCRIPT_DEBUG', false);
} else {
// Environnement de développement
define('WP_DEBUG', true);
define('SCRIPT_DEBUG', true);
}
Valeur par défaut : Configuration identique tous environnements
3.1.16 — Audit Permissions Système Plugins
Niveau : 🟠
Référence : OWASP A01 / CIS WordPress 4.16 / NIST 800-53 AC-6
MITRE ATT&CK : T1078
Description : Auditer les permissions système requises par les plugins (lecture/écriture fichiers, accès base de données, appels réseau) pour identifier les sur-privilèges.
Vérification :
# Analyser capabilities des plugins
grep -r "current_user_can\|capability" wp-content/plugins/ | head -20
# Vérifier accès fichier système
find wp-content/plugins/ -name "*.php" -exec grep -l "file_get_contents\|fopen\|curl" {} \;
Remédiation :
- Audit des capabilities :
function audit_plugin_capabilities() {
$plugins = get_plugins();
$capability_report = array();
foreach ($plugins as $plugin_file => $plugin_data) {
if (is_plugin_active($plugin_file)) {
// Analyser le code pour les capabilities utilisées
$plugin_path = WP_PLUGIN_DIR . '/' . $plugin_file;
$content = file_get_contents($plugin_path);
preg_match_all('/current_user_can\s*\(\s*[\'"]([^\'"]+)[\'"]/', $content, $matches);
$capability_report[$plugin_data['Name']] = array_unique($matches[1]);
}
}
update_option('plugin_capability_audit', $capability_report);
return $capability_report;
}
- Restriction capabilities par plugin :
function restrict_plugin_capabilities($caps, $cap, $user_id, $args) {
$restricted_plugins = array(
'non-critical-plugin' => array('manage_options', 'edit_users')
);
$current_plugin = $this->get_current_plugin();
if (isset($restricted_plugins[$current_plugin]) &&
in_array($cap, $restricted_plugins[$current_plugin])) {
return array('do_not_allow');
}
return $caps;
}
add_filter('user_has_cap', 'restrict_plugin_capabilities', 10, 4);
Valeur par défaut : Permissions non auditées
3.1.17 — Protection Fichiers Configuration Plugins
Niveau : 🟠
Référence : OWASP A05 / CIS WordPress 4.17 / NIST 800-53 AC-3
MITRE ATT&CK : T1005
Description : Protéger les fichiers de configuration des plugins contre l’accès web direct, particulièrement ceux contenant des clés API ou credentials.
Vérification :
# Rechercher fichiers config exposés
find wp-content/plugins/ -name "*.ini" -o -name "*.conf" -o -name "config.php"
curl -s https://example.com/wp-content/plugins/plugin-name/config.ini
# Vérifier clés API dans fichiers
grep -r "api.*key\|secret.*key" wp-content/plugins/ | grep -v ".git"
Remédiation :
- Protection via .htaccess :
# wp-content/plugins/.htaccess
<FilesMatch "\.(ini|conf|config)$">
Order allow,deny
Deny from all
</FilesMatch>
<FilesMatch "config\.php$">
Order allow,deny
Deny from all
</FilesMatch>
- Déplacement fichiers sensibles :
// Déplacer config hors web root
function secure_plugin_config() {
$config_dir = ABSPATH . '../plugin-configs/';
if (!is_dir($config_dir)) {
mkdir($config_dir, 0700, true);
}
// Rediriger les plugins vers ce répertoire
define('SECURE_CONFIG_DIR', $config_dir);
}
add_action('plugins_loaded', 'secure_plugin_config', 1);
- Chiffrement des configurations :
function encrypt_plugin_config($data) {
$key = wp_salt('AUTH_KEY');
return base64_encode(openssl_encrypt($data, 'AES-256-CBC', $key, 0, substr($key, 0, 16)));
}
function decrypt_plugin_config($encrypted_data) {
$key = wp_salt('AUTH_KEY');
return openssl_decrypt(base64_decode($encrypted_data), 'AES-256-CBC', $key, 0, substr($key, 0, 16));
}
Valeur par défaut : Fichiers config potentiellement accessibles
3.1.18 — Isolation Plugins Critiques
Niveau : 🟡
Référence : OWASP A04 / CIS WordPress 4.18 / NIST 800-53 SC-7
MITRE ATT&CK : T1505
Description : Isoler les plugins critiques (sécurité, backup) pour éviter les interférences et garantir leur fonctionnement même en cas de problème avec d’autres plugins.
Vérification :
# Identifier plugins critiques
wp plugin list | grep -iE "(security|backup|firewall|malware)"
# Vérifier conflits potentiels
wp plugin list --status=active --format=count
Remédiation :
- Must-Use Plugins pour critiques :
# Déplacer plugins critiques vers mu-plugins
mkdir -p wp-content/mu-plugins
cp -r wp-content/plugins/wordfence wp-content/mu-plugins/
- Chargement prioritaire :
// mu-plugins/critical-plugins-loader.php
function load_critical_plugins_first() {
$critical_plugins = array(
'wordfence/wordfence.php',
'updraftplus/updraftplus.php'
);
foreach ($critical_plugins as $plugin) {
if (file_exists(WP_PLUGIN_DIR . '/' . $plugin)) {
include_once WP_PLUGIN_DIR . '/' . $plugin;
}
}
}
add_action('muplugins_loaded', 'load_critical_plugins_first', 1);
- Monitoring isolation :
function monitor_plugin_isolation() {
$critical_plugins = array('wordfence', 'updraftplus');
foreach ($critical_plugins as $plugin) {
if (!is_plugin_active($plugin . '/' . $plugin . '.php')) {
wp_mail('admin@example.com', 'Plugin critique inactif',
"Le plugin critique $plugin est inactif!");
}
}
}
wp_schedule_event(time(), 'hourly', 'monitor_plugin_isolation');
Valeur par défaut : Tous plugins au même niveau
3.1.19 — Gestion Licences et Mises à Jour Premium
Niveau : 🟡
Référence : OWASP A06 / CIS WordPress 4.19 / NIST 800-53 CM-8
MITRE ATT&CK : T1195
Description : Gérer correctement les licences des plugins premium pour assurer la réception des mises à jour de sécurité et éviter l’utilisation de versions piratées.
Vérification :
# Plugins premium installés
wp plugin list --format=json | jq '.[] | select(.update == "available" and .version != .update_version)'
# Vérifier licences expirées
grep -r "license.*expir\|invalid.*license" wp-content/plugins/
Remédiation :
- Audit des licences :
function audit_premium_licenses() {
$premium_plugins = array(
'gravityforms' => get_option('rg_gforms_key'),
'wpforms-lite' => get_option('wpforms_license_key'),
'elementor-pro' => get_option('elementor_pro_license_key')
);
foreach ($premium_plugins as $plugin => $license) {
if (empty($license) || $this->is_license_expired($license)) {
wp_mail('admin@example.com', 'Licence plugin expirée',
"La licence du plugin $plugin nécessite un renouvellement.");
}
}
}
wp_schedule_event(time(), 'weekly', 'audit_premium_licenses');
- Alertes expiration :
function check_license_expiration($plugin_name, $license_data) {
if (isset($license_data['expires']) &&
strtotime($license_data['expires']) < strtotime('+30 days')) {
// Alerte 30 jours avant expiration
wp_mail('admin@example.com', 'Licence bientôt expirée',
"La licence de $plugin_name expire le {$license_data['expires']}");
}
}
Valeur par défaut : Licences non surveillées
3.1.20 — Tests Sécurité Automatisés
Niveau : 🟡
Référence : OWASP A04 / CIS WordPress 4.20 / NIST 800-53 SI-2
MITRE ATT&CK : T1190
Description : Implémenter des tests de sécurité automatisés pour détecter les vulnérabilités dans les plugins après chaque installation ou mise à jour.
Vérification :
# Scanner automatique avec WPScan
wpscan --url https://example.com --enumerate vp --format json > plugin_scan.json
# Analyser résultats
jq '.plugins[].vulnerabilities[]?' plugin_scan.json
Remédiation :
- Pipeline de tests automatisés :
#!/bin/bash
# tests/security-scan.sh
SITE_URL=$1
SCAN_RESULTS="/tmp/wpscan_$(date +%s).json"
# Scan plugins
wpscan --url $SITE_URL --enumerate vp --format json --output $SCAN_RESULTS
# Analyser vulnérabilités
VULN_COUNT=$(jq '[.plugins[].vulnerabilities[]?] | length' $SCAN_RESULTS)
if [ $VULN_COUNT -gt 0 ]; then
echo "ALERTE: $VULN_COUNT vulnérabilités détectées"
jq '.plugins[].vulnerabilities[]?' $SCAN_RESULTS | mail -s "Vulnérabilités plugins détectées" admin@example.com
exit 1
fi
- Intégration continue :
function automated_security_scan() {
// Après mise à jour plugin
$command = "wpscan --url " . site_url() . " --enumerate vp --format json";
$output = shell_exec($command);
$results = json_decode($output, true);
if (isset($results['plugins'])) {
foreach ($results['plugins'] as $plugin => $data) {
if (!empty($data['vulnerabilities'])) {
// Désactiver plugin vulnérable
deactivate_plugins($plugin);
wp_mail('admin@example.com', 'Plugin vulnérable désactivé',
"Plugin $plugin désactivé automatiquement - vulnérabilités détectées");
}
}
}
}
add_action('upgrader_process_complete', 'automated_security_scan');
Valeur par défaut : Tests manuels uniquement
3.1.21 — Chiffrement Données Plugins
Niveau : 🟡
Référence : OWASP A02 / CIS WordPress 4.21 / NIST 800-53 SC-28
MITRE ATT&CK : T1005
Description : Assurer que les plugins traitant des données sensibles implémentent un chiffrement approprié pour le stockage et la transmission.
Vérification :
# Rechercher données sensibles non chiffrées
grep -r "password\|api.*key\|secret" wp-content/plugins/ | grep -v "encrypt\|hash\|bcrypt"
# Vérifier utilisation SSL pour API
grep -r "http://" wp-content/plugins/ | grep -v "localhost"
Remédiation :
- Audit chiffrement des données :
function audit_plugin_encryption() {
$sensitive_data_patterns = array(
'api_key' => '/api.*key.*[\'"]([^\'"]{20,})[\'"]/',
'password' => '/password.*[\'"]([^\'"]{8,})[\'"]/',
'secret' => '/secret.*[\'"]([^\'"]{16,})[\'"]/'
);
$plugins_dir = WP_PLUGIN_DIR;
$unencrypted_data = array();
foreach (glob("$plugins_dir/*/*.php") as $file) {
$content = file_get_contents($file);
foreach ($sensitive_data_patterns as $type => $pattern) {
if (preg_match($pattern, $content, $matches)) {
$unencrypted_data[] = array(
'file' => $file,
'type' => $type,
'data' => substr($matches[1], 0, 10) . '...'
);
}
}
}
if (!empty($unencrypted_data)) {
wp_mail('admin@example.com', 'Données sensibles non chiffrées',
'Données sensibles détectées: ' . print_r($unencrypted_data, true));
}
}
- Helper de chiffrement pour plugins :
class SecurePluginStorage {
private static function get_key() {
return wp_salt('AUTH_KEY');
}
public static function encrypt($data) {
$key = self::get_key();
$iv = openssl_random_pseudo_bytes(16);
$encrypted = openssl_encrypt($data, 'AES-256-CBC', $key, 0, $iv);
return base64_encode($iv . $encrypted);
}
public static function decrypt($encrypted_data) {
$key = self::get_key();
$data = base64_decode($encrypted_data);
$iv = substr($data, 0, 16);
$encrypted = substr($data, 16);
return openssl_decrypt($encrypted, 'AES-256-CBC', $key, 0, $iv);
}
}
Valeur par défaut : Stockage données sensibles en clair
3.1.22 — Contrôle Accès Réseau Plugins
Niveau : 🟡
Référence : OWASP A10 / CIS WordPress 4.22 / NIST 800-53 SC-7
MITRE ATT&CK : T1071
Description : Contrôler et limiter les accès réseau des plugins pour prévenir l’exfiltration de données et les communications avec des serveurs malveillants.
Vérification :
# Analyser appels réseau des plugins
grep -r "wp_remote_\|curl\|file_get_contents.*http" wp-content/plugins/ | head -20
# Vérifier domaines contactés
netstat -an | grep :80 | grep ESTABLISHED
Remédiation :
- Whitelist des domaines autorisés :
function filter_plugin_http_requests($result, $args, $url) {
$allowed_domains = array(
'api.wordpress.org',
'downloads.wordpress.org',
'secure.gravatar.com',
'fonts.googleapis.com'
);
$domain = parse_url($url, PHP_URL_HOST);
if (!in_array($domain, $allowed_domains)) {
// Logger tentative accès non autorisée
error_log("BLOCKED HTTP request to: $url");
return new WP_Error('http_request_blocked', 'Domaine non autorisé');
}
return $result;
}
add_filter('pre_http_request', 'filter_plugin_http_requests', 10, 3);
- Monitoring communications :
function monitor_plugin_communications($response, $args, $url) {
$suspicious_patterns = array(
'base64', 'eval', 'exec', 'system', 'shell_exec'
);
if (isset($args['body'])) {
foreach ($suspicious_patterns as $pattern) {
if (strpos($args['body'], $pattern) !== false) {
wp_mail('admin@example.com', 'Communication suspecte détectée',
"Requête suspecte vers $url avec pattern: $pattern");
break;
}
}
}
return $response;
}
add_filter('http_response', 'monitor_plugin_communications', 10, 3);
Valeur par défaut : Accès réseau illimité
3.1.23 — Validation Entrées Plugins
Niveau : 🟠
Référence : OWASP A03 / CIS WordPress 4.23 / NIST 800-53 SI-10
MITRE ATT&CK : T1190
Description : Vérifier que les plugins valident et assainissent correctement toutes les entrées utilisateurs pour prévenir les injections et autres attaques.
Vérification :
# Rechercher validation insuffisante
grep -r "\$_POST\|\$_GET\|\$_REQUEST" wp-content/plugins/ | grep -v "sanitize\|escape\|validate"
# Analyser fonctions de sanitisation
grep -r "sanitize_\|wp_kses\|esc_" wp-content/plugins/ | wc -l
Remédiation :
- Audit validation des entrées :
function audit_plugin_input_validation() {
$plugins_dir = WP_PLUGIN_DIR;
$validation_issues = array();
foreach (glob("$plugins_dir/*/*.php") as $file) {
$content = file_get_contents($file);
// Rechercher $_POST, $_GET non sécurisés
if (preg_match_all('/\$_(POST|GET|REQUEST)\[[\'"]([^\'"]+)[\'"]\]/', $content, $matches, PREG_OFFSET_CAPTURE)) {
foreach ($matches[0] as $index => $match) {
$line_start = strrpos(substr($content, 0, $match[1]), "\n");
$line_end = strpos($content, "\n", $match[1]);
$line = substr($content, $line_start, $line_end - $line_start);
// Vérifier si la ligne contient une fonction de sanitisation
if (!preg_match('/(sanitize_|wp_kses|esc_|intval|absint|wp_verify_nonce)/', $line)) {
$validation_issues[] = array(
'file' => $file,
'variable' => $match[0],
'line' => $line
);
}
}
}
}
if (!empty($validation_issues)) {
wp_mail('admin@example.com', 'Problèmes validation détectés',
'Entrées non validées: ' . print_r($validation_issues, true));
}
}
- Renforcement global validation :
function enforce_input_validation() {
// Sanitiser automatiquement toutes les entrées
$_POST = array_map('sanitize_text_field', $_POST);
$_GET = array_map('sanitize_text_field', $_GET);
$_REQUEST = array_map('sanitize_text_field', $_REQUEST);
}
add_action('init', 'enforce_input_validation', 1);
Valeur par défaut : Validation dépendante du développeur plugin
3.1.24 — Gestion Erreurs et Exceptions Plugins
Niveau : 🟡
Référence : OWASP A09 / CIS WordPress 4.24 / NIST 800-53 SI-11
MITRE ATT&CK : T1005
Description : Assurer que les plugins gèrent correctement les erreurs sans révéler d’informations sensibles et avec une logging appropriée.
Vérification :
# Rechercher gestion d'erreurs
grep -r "try\|catch\|throw\|error_log" wp-content/plugins/ | wc -l
# Vérifier exposition d'erreurs
grep -r "print_r\|var_dump\|echo.*error" wp-content/plugins/
Remédiation :
- Standards gestion d’erreurs :
function standardize_plugin_error_handling() {
// Gestionnaire d'erreurs global pour plugins
set_error_handler(function($severity, $message, $file, $line) {
if (strpos($file, WP_PLUGIN_DIR) !== false) {
// Log sécurisé pour erreurs plugins
error_log("PLUGIN_ERROR: [$severity] $message in $file:$line");
// En production, ne pas afficher les erreurs
if (wp_get_environment_type() === 'production') {
return true; // Supprime l'affichage
}
}
return false; // Laisse le gestionnaire par défaut
});
}
add_action('plugins_loaded', 'standardize_plugin_error_handling', 1);
- Wrapper sécurisé pour plugins :
class SecurePluginLogger {
public static function log_error($plugin_name, $message, $data = null) {
$log_entry = array(
'plugin' => $plugin_name,
'timestamp' => current_time('mysql'),
'message' => $message,
'ip' => $_SERVER['REMOTE_ADDR'],
'user_agent' => $_SERVER['HTTP_USER_AGENT']
);
if ($data) {
// Nettoyer données sensibles avant log
$log_entry['data'] = $this->sanitize_log_data($data);
}
error_log('SECURE_PLUGIN_LOG: ' . json_encode($log_entry));
}
private static function sanitize_log_data($data) {
$sensitive_keys = array('password', 'api_key', 'secret', 'token');
if (is_array($data)) {
foreach ($data as $key => $value) {
if (in_array(strtolower($key), $sensitive_keys)) {
$data[$key] = '***REDACTED***';
}
}
}
return $data;
}
}
Valeur par défaut : Gestion d’erreurs variable selon plugins
3.1.25 — Documentation et Traçabilité Plugins
Niveau : 🟡
Référence : OWASP A09 / CIS WordPress 4.25 / NIST 800-53 AU-3
MITRE ATT&CK : T1070
Description : Maintenir une documentation complète des plugins installés, leurs fonctions, configurations et historique des modifications pour faciliter les audits et investigations.
Vérification :
# Documentation existante
find . -name "*plugin*doc*" -o -name "*README*" -o -name "*CHANGELOG*"
# Historique modifications
wp plugin list --format=csv --fields=name,version,status > current_plugins.csv
diff previous_plugins.csv current_plugins.csv
Remédiation :
- Documentation automatisée :
function generate_plugin_documentation() {
$plugins = get_plugins();
$active_plugins = get_option('active_plugins');
$documentation = array();
foreach ($plugins as $plugin_file => $plugin_data) {
$doc_entry = array(
'name' => $plugin_data['Name'],
'version' => $plugin_data['Version'],
'description' => $plugin_data['Description'],
'author' => $plugin_data['Author'],
'active' => in_array($plugin_file, $active_plugins),
'last_updated' => get_plugin_data(WP_PLUGIN_DIR . '/' . $plugin_file)['Version'],
'security_audit_date' => get_option("plugin_audit_$plugin_file", 'Never'),
'configuration' => $this->get_plugin_configuration($plugin_file)
);
$documentation[] = $doc_entry;
}
// Générer rapport
file_put_contents(ABSPATH . 'plugin-documentation.json',
json_encode($documentation, JSON_PRETTY_PRINT));
return $documentation;
}
- Historique des changements :
function track_plugin_changes($plugin, $network_activation) {
$change_log = get_option('plugin_change_log', array());
$change_entry = array(
'timestamp' => current_time('mysql'),
'plugin' => $plugin,
'action' => current_filter(), // activated_plugin, deactivated_plugin
'user' => wp_get_current_user()->user_login,
'ip' => $_SERVER['REMOTE_ADDR'],
'user_agent' => $_SERVER['HTTP_USER_AGENT']
);
$change_log[] = $change_entry;
// Garder seulement les 1000 dernières entrées
if (count($change_log) > 1000) {
$change_log = array_slice($change_log, -1000);
}
update_option('plugin_change_log', $change_log);
}
add_action('activated_plugin', 'track_plugin_changes', 10, 2);
add_action('deactivated_plugin', 'track_plugin_changes', 10, 2);
Valeur par défaut : Documentation manuelle et incomplète
S4 — THÈMES (15 contrôles)
Cette section couvre la sécurité des thèmes WordPress, leur configuration et leur maintenance.
4.1.1 — Thème Actif Sécurisé et À Jour
Niveau : 🔴
Référence : OWASP A06 / CIS WordPress 5.1 / NIST 800-53 SI-2
MITRE ATT&CK : T1190
Description : Le thème actif doit être maintenu à jour et exempt de vulnérabilités connues. Les thèmes obsolètes constituent une porte d’entrée majeure pour les attaquants.
Vérification :
# Vérifier thème actif et version
wp theme list --status=active --format=table --fields=name,version,update_version
# Scanner vulnérabilités thèmes
wpscan --url https://example.com --enumerate vt --no-banner
# Vérifier dernière mise à jour
wp theme get $(wp theme list --status=active --field=name) --field=version
Remédiation :
- Mise à jour immédiate du thème :
wp theme update --all
wp theme update $(wp theme list --status=active --field=name)
- Auto-update pour le thème actif :
wp theme auto-updates enable $(wp theme list --status=active --field=name)
- Surveillance des mises à jour :
function monitor_theme_updates() {
$current_theme = get_stylesheet();
$theme_updates = get_site_transient('update_themes');
if (isset($theme_updates->response[$current_theme])) {
wp_mail('admin@example.com', 'Mise à jour thème disponible',
"Une mise à jour est disponible pour le thème actif: $current_theme");
}
}
wp_schedule_event(time(), 'daily', 'monitor_theme_updates');
Valeur par défaut : Mises à jour manuelles
4.1.2 — Suppression Thèmes Inactifs
Niveau : 🟠
Référence : OWASP A04 / CIS WordPress 5.2 / NIST 800-53 CM-7
MITRE ATT&CK : T1190
Description : Les thèmes inactifs représentent une surface d’attaque inutile. Ils peuvent contenir des vulnérabilités exploitables même sans être activés et doivent être supprimés.
Vérification :
# Lister thèmes inactifs
wp theme list --status=inactive --format=table
# Compter thèmes inactifs
wp theme list --status=inactive --format=count
# Vérifier vulnérabilités dans thèmes inactifs
wpscan --url https://example.com --enumerate vt --no-banner
Remédiation :
- Supprimer tous les thèmes inactifs :
wp theme delete $(wp theme list --status=inactive --field=name)
- Garder seulement un thème de fallback :
# Garder un thème WordPress par défaut comme backup
wp theme install twentytwentythree
wp theme delete $(wp theme list --status=inactive --field=name | grep -v twentytwentythree)
- Politique de suppression automatique :
function cleanup_inactive_themes() {
$all_themes = wp_get_themes();
$active_theme = get_stylesheet();
$parent_theme = get_template();
// Garder seulement le thème actif et son parent (si child theme)
$keep_themes = array($active_theme, $parent_theme, 'twentytwentythree');
foreach ($all_themes as $theme_slug => $theme) {
if (!in_array($theme_slug, $keep_themes)) {
delete_theme($theme_slug);
}
}
}
// Exécuter lors des mises à jour majeures WordPress
add_action('upgrader_process_complete', 'cleanup_inactive_themes');
Valeur par défaut : Accumulation de thèmes inactifs
4.1.3 — Child Theme Obligatoire
Niveau : 🟠
Référence : CIS WordPress 5.3 / NIST 800-53 CM-3
MITRE ATT&CK : T1565
Description : Utiliser un child theme préserve les personnalisations lors des mises à jour du thème parent et évite la perte de modifications de sécurité personnalisées.
Vérification :
# Vérifier si child theme utilisé
wp theme list --status=active --format=json | jq '.[].parent'
# Examiner structure du thème
ls -la wp-content/themes/$(wp theme list --status=active --field=name)/
# Vérifier fichier style.css
head -10 wp-content/themes/$(wp theme list --status=active --field=name)/style.css
Remédiation :
- Créer un child theme :
# Créer répertoire child theme
PARENT_THEME=$(wp theme list --status=active --field=name)
CHILD_THEME="${PARENT_THEME}-child"
mkdir wp-content/themes/$CHILD_THEME
# Créer style.css
cat > wp-content/themes/$CHILD_THEME/style.css << EOL
/*
Theme Name: $CHILD_THEME
Description: Child theme de $PARENT_THEME
Template: $PARENT_THEME
Version: 1.0
*/
@import url("../$PARENT_THEME/style.css");
EOL
# Créer functions.php
cat > wp-content/themes/$CHILD_THEME/functions.php << 'EOL'
<?php
function child_theme_enqueue_styles() {
wp_enqueue_style('parent-style', get_template_directory_uri() . '/style.css');
wp_enqueue_style('child-style', get_stylesheet_directory_uri() . '/style.css', array('parent-style'));
}
add_action('wp_enqueue_scripts', 'child_theme_enqueue_styles');
EOL
# Activer le child theme
wp theme activate $CHILD_THEME
Valeur par défaut : Thème parent directement modifié
4.1.4 — Détection Thèmes Nulled/Piratés
Niveau : 🔴
Référence : OWASP A08 / CIS WordPress 5.4 / NIST 800-53 SI-3
MITRE ATT&CK : T1505
Description : Les thèmes piratés contiennent souvent des backdoors et malwares. Détecter et éliminer ces thèmes est critique pour la sécurité.
Vérification :
# Scanner code malveillant dans thèmes
find wp-content/themes/ -name "*.php" -exec grep -l "eval\|base64_decode\|gzinflate\|str_rot13" {} \;
# Vérifier intégrité avec checksums
wp theme verify-checksums --all
# Rechercher backdoors connues
grep -r "c99\|r57\|WSO\|FilesMan" wp-content/themes/
Remédiation :
- Supprimer thèmes suspects :
# Identifier et supprimer thèmes compromis
find wp-content/themes/ -name "*.php" -exec grep -l "eval.*base64_decode" {} \; | head -5
# Supprimer thème suspect (remplacer par nom réel)
wp theme delete suspicious-theme
- Scanner automatisé malware :
#!/bin/bash
# Script de détection malware thèmes
MALWARE_PATTERNS="eval.*base64_decode|gzinflate|str_rot13|system.*\$_|passthru"
find wp-content/themes/ -name "*.php" | while read file; do
if grep -qE "$MALWARE_PATTERNS" "$file"; then
echo "SUSPECT: $file"
# Quarantaine
mv "$file" "$file.quarantine"
fi
done
- Validation source thèmes :
function validate_theme_source($theme_slug) {
// Vérifier si thème provient du dépôt officiel WordPress
$response = wp_remote_get("https://api.wordpress.org/themes/info/1.1/?action=theme_information&request[slug]=$theme_slug");
if (is_wp_error($response) || wp_remote_retrieve_response_code($response) !== 200) {
// Thème non officiel - vérifier intégrité
$theme_path = get_theme_root() . "/$theme_slug";
$suspicious_files = array();
foreach (glob("$theme_path/*.php") as $file) {
$content = file_get_contents($file);
if (preg_match('/(eval|base64_decode|gzinflate).*\(/', $content)) {
$suspicious_files[] = $file;
}
}
if (!empty($suspicious_files)) {
wp_mail('admin@example.com', 'Thème suspect détecté',
"Fichiers suspects dans $theme_slug: " . implode(', ', $suspicious_files));
}
}
}
Valeur par défaut : Aucune vérification automatique
4.1.5 — Désactivation Éditeur de Thème
Niveau : 🟠
Référence : OWASP A01 / CIS WordPress 5.5 / NIST 800-53 AC-6
MITRE ATT&CK : T1105
Description : L’éditeur de thème permet la modification de code PHP directement depuis l’administration WordPress. Cette fonction doit être désactivée pour éviter l’injection de code malveillant.
Vérification :
# Vérifier si éditeur désactivé
grep "DISALLOW_FILE_EDIT" wp-config.php
# Tester accès éditeur de thème
curl -s https://example.com/wp-admin/theme-editor.php | grep -i "file editing"
Remédiation :
- Désactiver l’éditeur dans wp-config.php :
define('DISALLOW_FILE_EDIT', true);
- Vérifier suppression du menu :
// Vérifier que le menu "Éditeur" n'est plus visible
add_action('admin_init', function() {
if (current_user_can('edit_themes')) {
remove_submenu_page('themes.php', 'theme-editor.php');
}
});
- Protection supplémentaire via .htaccess :
<Files "theme-editor.php">
Order allow,deny
Deny from all
</Files>
<Files "plugin-editor.php">
Order allow,deny
Deny from all
</Files>
Valeur par défaut : Éditeur de thème activé
4.1.6 — Audit Vulnérabilités Thèmes
Niveau : 🟠
Référence : OWASP A06 / CIS WordPress 5.6 / NIST 800-53 SI-2
MITRE ATT&CK : T1190
Description : Effectuer des audits réguliers des thèmes contre les bases de vulnérabilités connues pour identifier et corriger rapidement les failles de sécurité.
Vérification :
# Scanner avec WPScan
wpscan --url https://example.com --enumerate vt --api-token YOUR_TOKEN --no-banner
# Vérifier base CVE
curl -s "https://cve.circl.lu/api/search/wordpress theme" | jq '.[] | select(.summary | contains("theme"))'
Remédiation :
- Audit automatisé quotidien :
#!/bin/bash
# Script d'audit thèmes
wpscan --url https://example.com --enumerate vt --format json --api-token $API_TOKEN > theme_scan.json
# Analyser résultats
if jq -e '.themes[].vulnerabilities[]?' theme_scan.json > /dev/null; then
echo "ALERTE: Vulnérabilités détectées dans les thèmes"
jq '.themes[].vulnerabilities[]?' theme_scan.json | mail -s "Vulnérabilités thèmes" admin@example.com
fi
- Monitoring continu :
function continuous_theme_monitoring() {
$themes = wp_get_themes();
foreach ($themes as $theme_slug => $theme) {
// Vérifier version contre base de vulnérabilités
$version = $theme->get('Version');
$response = wp_remote_get("https://wpscan.com/api/v3/themes/$theme_slug");
if (!is_wp_error($response)) {
$data = json_decode(wp_remote_retrieve_body($response), true);
if (isset($data['vulnerabilities']) && !empty($data['vulnerabilities'])) {
// Alerter sur vulnérabilités
wp_mail('admin@example.com', 'Vulnérabilité thème détectée',
"Vulnérabilité dans $theme_slug version $version");
}
}
}
}
wp_schedule_event(time(), 'daily', 'continuous_theme_monitoring');
Valeur par défaut : Audits manuels occasionnels
4.1.7 — Validation Code Personnalisé Thèmes
Niveau : 🟡
Référence : OWASP A03 / CIS WordPress 5.7 / NIST 800-53 SI-10
MITRE ATT&CK : T1190
Description : Valider tout code personnalisé ajouté aux thèmes pour s’assurer qu’il respecte les bonnes pratiques de sécurité WordPress et ne contient pas de vulnérabilités.
Vérification :
# Analyser code personnalisé
find wp-content/themes/ -name "functions.php" -exec grep -l "add_action\|add_filter" {} \;
# Vérifier échappement des sorties
grep -r "echo\|print" wp-content/themes/ | grep -v "esc_\|wp_kses"
# Analyser validation des entrées
grep -r "\$_POST\|\$_GET" wp-content/themes/ | grep -v "sanitize"
Remédiation :
- Audit sécurisé du code :
function audit_theme_security() {
$theme_dir = get_stylesheet_directory();
$security_issues = array();
// Patterns de sécurité à vérifier
$patterns = array(
'unescaped_output' => '/echo\s+\$[^;]*(?!.*esc_)/i',
'unsanitized_input' => '/\$_(POST|GET|REQUEST)\[[^\]]+\](?!.*sanitize)/i',
'dangerous_functions' => '/(eval|exec|system|shell_exec|passthru)\s*\(/i'
);
foreach (glob("$theme_dir/*.php") as $file) {
$content = file_get_contents($file);
foreach ($patterns as $type => $pattern) {
if (preg_match_all($pattern, $content, $matches, PREG_OFFSET_CAPTURE)) {
$security_issues[$file][$type] = $matches[0];
}
}
}
if (!empty($security_issues)) {
wp_mail('admin@example.com', 'Problèmes sécurité thème détectés',
print_r($security_issues, true));
}
return $security_issues;
}
- Standards de développement sécurisé :
// Exemple de code sécurisé pour functions.php
function secure_theme_customization() {
// Validation et sanitisation correctes
if (isset($_POST['custom_field']) && wp_verify_nonce($_POST['nonce'], 'custom_action')) {
$safe_value = sanitize_text_field($_POST['custom_field']);
update_option('theme_custom_field', $safe_value);
}
// Échappement correct des sorties
$option_value = get_option('theme_custom_field', '');
echo esc_html($option_value);
}
Valeur par défaut : Code personnalisé non audité
4.1.8 — Protection Fichiers Thème Sensibles
Niveau : 🟡
Référence : OWASP A05 / CIS WordPress 5.8 / NIST 800-53 AC-3
MITRE ATT&CK : T1005
Description : Protéger l’accès aux fichiers sensibles des thèmes (functions.php, configuration, etc.) contre l’accès web direct non autorisé.
Vérification :
# Tester accès direct aux fichiers thème
curl -s https://example.com/wp-content/themes/active-theme/functions.php
curl -s https://example.com/wp-content/themes/active-theme/config.php
# Vérifier permissions fichiers
ls -la wp-content/themes/$(wp theme list --status=active --field=name)/
Remédiation :
- Protection via .htaccess dans le thème :
# wp-content/themes/theme-name/.htaccess
<FilesMatch "\.(php|inc|conf)$">
Order allow,deny
Deny from all
</FilesMatch>
# Autoriser seulement index.php et style.css publiquement
<FilesMatch "^(index\.php|style\.css|screenshot\.(png|jpg))$">
Order allow,deny
Allow from all
</FilesMatch>
- En-têtes de sécurité PHP :
// Ajouter en début de functions.php
if (!defined('ABSPATH')) {
exit; // Sortie si accès direct
}
// Protection supplémentaire
if (!function_exists('wp_head')) {
http_response_code(403);
die('Accès direct interdit');
}
- Permissions système appropriées :
# Permissions sécurisées pour thèmes
find wp-content/themes/ -type f -name "*.php" -exec chmod 644 {} \;
find wp-content/themes/ -type d -exec chmod 755 {} \;
# functions.php plus restrictif
chmod 640 wp-content/themes/*/functions.php
Valeur par défaut : Fichiers potentiellement accessibles
4.1.9 — Gestion Versions et Rollback Thèmes
Niveau : 🟡
Référence : CIS WordPress 5.9 / NIST 800-53 CM-3
MITRE ATT&CK : T1565
Description : Maintenir un système de versioning des thèmes et la capacité de rollback rapide en cas de problème lors des mises à jour.
Vérification :
# Historique des versions
wp theme list --format=json | jq '.[] | {name: .name, version: .version}'
# Backups existants
ls -la backups/themes/ 2>/dev/null || echo "Pas de backups thèmes"
Remédiation :
- Backup automatique avant mises à jour :
#!/bin/bash
# Script de backup thème avant mise à jour
THEME_NAME=$(wp theme list --status=active --field=name)
BACKUP_DIR="backups/themes/$(date +%Y%m%d_%H%M%S)"
mkdir -p $BACKUP_DIR
cp -r wp-content/themes/$THEME_NAME $BACKUP_DIR/
echo "Backup thème créé: $BACKUP_DIR"
# Garder seulement les 10 derniers backups
ls -t backups/themes/ | tail -n +11 | xargs -r rm -rf
- Système de rollback :
function theme_rollback_system() {
if (isset($_POST['rollback_theme']) && wp_verify_nonce($_POST['nonce'], 'theme_rollback')) {
$backup_path = sanitize_text_field($_POST['backup_path']);
$current_theme = get_stylesheet();
if (is_dir("backups/themes/$backup_path")) {
// Backup actuel avant rollback
$current_backup = "backups/themes/pre-rollback-" . date('Y-m-d-H-i-s');
mkdir($current_backup, 0755, true);
exec("cp -r wp-content/themes/$current_theme $current_backup/");
// Restaurer backup
exec("rm -rf wp-content/themes/$current_theme");
exec("cp -r backups/themes/$backup_path/$current_theme wp-content/themes/");
wp_redirect(admin_url('themes.php?rollback=success'));
exit;
}
}
}
add_action('admin_init', 'theme_rollback_system');
Valeur par défaut : Pas de système de rollback
4.1.10 — Monitoring Modifications Thèmes
Niveau : 🟡
Référence : OWASP A09 / CIS WordPress 5.10 / NIST 800-53 AU-2
MITRE ATT&CK : T1070
Description : Surveiller toutes les modifications des fichiers de thèmes pour détecter les changements non autorisés ou l’injection de code malveillant.
Vérification :
# Vérifier intégrité fichiers thème
find wp-content/themes/ -name "*.php" -exec md5sum {} \; > theme_checksums.txt
# Comparer avec checksums précédents
diff theme_checksums_previous.txt theme_checksums.txt
Remédiation :
- Monitoring intégrité fichiers :
function monitor_theme_file_integrity() {
$theme_dir = get_stylesheet_directory();
$stored_hashes = get_option('theme_file_hashes', array());
$current_hashes = array();
$changes_detected = false;
foreach (glob("$theme_dir/*.php") as $file) {
$relative_path = str_replace($theme_dir . '/', '', $file);
$current_hash = md5_file($file);
$current_hashes[$relative_path] = $current_hash;
if (isset($stored_hashes[$relative_path]) &&
$stored_hashes[$relative_path] !== $current_hash) {
// Fichier modifié
$changes_detected = true;
$this->log_file_change($file, 'modified');
} elseif (!isset($stored_hashes[$relative_path])) {
// Nouveau fichier
$changes_detected = true;
$this->log_file_change($file, 'added');
}
}
// Vérifier fichiers supprimés
foreach ($stored_hashes as $file => $hash) {
if (!isset($current_hashes[$file])) {
$changes_detected = true;
$this->log_file_change("$theme_dir/$file", 'deleted');
}
}
if ($changes_detected) {
wp_mail('admin@example.com', 'Modifications thème détectées',
'Des modifications ont été détectées dans les fichiers du thème.');
}
update_option('theme_file_hashes', $current_hashes);
}
function log_file_change($file, $action) {
$log_entry = array(
'timestamp' => current_time('mysql'),
'file' => $file,
'action' => $action,
'ip' => $_SERVER['REMOTE_ADDR'] ?? 'unknown',
'user_agent' => $_SERVER['HTTP_USER_AGENT'] ?? 'unknown'
);
error_log('THEME_FILE_CHANGE: ' . json_encode($log_entry));
}
wp_schedule_event(time(), 'hourly', 'monitor_theme_file_integrity');
Valeur par défaut : Modifications non surveillées
4.1.11 — Validation Headers et Métadonnées Thèmes
Niveau : 🟡
Référence : CIS WordPress 5.11 / NIST 800-53 SI-7
MITRE ATT&CK : T1195
Description : Valider les headers et métadonnées des thèmes pour s’assurer de leur authenticité et détecter les modifications malveillantes.
Vérification :
# Examiner headers des thèmes
head -20 wp-content/themes/*/style.css
# Vérifier métadonnées
grep -r "Theme Name\|Version\|Author" wp-content/themes/*/style.css
Remédiation :
- Validation des métadonnées :
function validate_theme_metadata() {
$themes = wp_get_themes();
$validation_results = array();
foreach ($themes as $theme_slug => $theme) {
$theme_data = array(
'name' => $theme->get('Name'),
'version' => $theme->get('Version'),
'author' => $theme->get('Author'),
'description' => $theme->get('Description'),
'uri' => $theme->get('ThemeURI')
);
// Vérifier cohérence des métadonnées
$issues = array();
// Version suspecte
if (preg_match('/[<>"\']/', $theme_data['version'])) {
$issues[] = 'Version contient des caractères suspects';
}
// Auteur suspect
if (preg_match('/(nulled|cracked|free|download)/i', $theme_data['author'])) {
$issues[] = 'Auteur suspect (possiblement piraté)';
}
// URI suspecte
if (!empty($theme_data['uri']) && !filter_var($theme_data['uri'], FILTER_VALIDATE_URL)) {
$issues[] = 'URI invalide';
}
if (!empty($issues)) {
$validation_results[$theme_slug] = $issues;
}
}
if (!empty($validation_results)) {
wp_mail('admin@example.com', 'Thèmes avec métadonnées suspectes',
print_r($validation_results, true));
}
return $validation_results;
}
Valeur par défaut : Métadonnées non validées
4.1.12 — Contrôle Fonctionnalités Thème
Niveau : 🟡
Référence : OWASP A04 / CIS WordPress 5.12 / NIST 800-53 CM-7
MITRE ATT&CK : T1505
Description : Auditer et contrôler les fonctionnalités activées par le thème pour s’assurer qu’elles sont nécessaires et sécurisées.
Vérification :
# Analyser fonctionnalités du thème
grep -r "add_theme_support\|remove_theme_support" wp-content/themes/
# Vérifier hooks et actions
grep -r "add_action\|add_filter" wp-content/themes/*/functions.php
Remédiation :
- Audit des fonctionnalités :
function audit_theme_features() {
$theme_supports = array();
$dangerous_features = array('post-thumbnails', 'custom-header', 'custom-background');
// Lister toutes les fonctionnalités supportées
global $_wp_theme_features;
foreach ($_wp_theme_features as $feature => $data) {
if (current_theme_supports($feature)) {
$theme_supports[] = $feature;
}
}
// Analyser actions/filters du thème
$theme_hooks = array();
$functions_file = get_stylesheet_directory() . '/functions.php';
if (file_exists($functions_file)) {
$content = file_get_contents($functions_file);
preg_match_all('/add_(action|filter)\s*\(\s*[\'"]([^\'"]+)[\'"]/', $content, $matches);
for ($i = 0; $i < count($matches[0]); $i++) {
$theme_hooks[] = array(
'type' => $matches[1][$i],
'hook' => $matches[2][$i]
);
}
}
$audit_report = array(
'theme_supports' => $theme_supports,
'theme_hooks' => $theme_hooks,
'timestamp' => current_time('mysql')
);
update_option('theme_features_audit', $audit_report);
return $audit_report;
}
- Désactivation fonctionnalités non nécessaires :
function disable_unnecessary_theme_features() {
// Désactiver fonctionnalités potentiellement dangereuses
remove_theme_support('custom-header');
remove_theme_support('custom-background');
// Désactiver éditeur de fichiers si pas déjà fait
if (!defined('DISALLOW_FILE_EDIT')) {
define('DISALLOW_FILE_EDIT', true);
}
// Retirer générateur WordPress du header
remove_action('wp_head', 'wp_generator');
}
add_action('after_setup_theme', 'disable_unnecessary_theme_features');
Valeur par défaut : Toutes les fonctionnalités thème activées
4.1.13 — Sécurisation Assets Thème
Niveau : 🟡
Référence : OWASP A05 / CIS WordPress 5.13 / NIST 800-53 SC-8
MITRE ATT&CK : T1071
Description : Sécuriser le chargement des assets du thème (CSS, JS, images) pour prévenir les attaques XSS et l’injection de contenu malveillant.
Vérification :
# Analyser chargement des assets
grep -r "wp_enqueue_\|wp_register_" wp-content/themes/*/functions.php
# Vérifier intégrité des assets
find wp-content/themes/ -name "*.js" -exec grep -l "eval\|document.write" {} \;
Remédiation :
- Chargement sécurisé des assets :
function secure_theme_assets() {
// Utiliser HTTPS pour tous les assets
if (is_ssl()) {
// Forcer HTTPS pour les assets externes
add_filter('script_loader_src', 'force_ssl_assets');
add_filter('style_loader_src', 'force_ssl_assets');
}
// Ajouter intégrité pour assets externes
add_filter('script_loader_tag', 'add_integrity_to_scripts', 10, 3);
add_filter('style_loader_tag', 'add_integrity_to_styles', 10, 4);
}
function force_ssl_assets($src) {
return str_replace('http://', 'https://', $src);
}
function add_integrity_to_scripts($tag, $handle, $src) {
// Ajouter SRI pour scripts externes critiques
$external_scripts = array('jquery', 'bootstrap');
if (in_array($handle, $external_scripts) && strpos($src, home_url()) === false) {
// Calculer hash SRI si nécessaire
$integrity = get_option("script_integrity_$handle");
if ($integrity) {
$tag = str_replace('<script ', "<script integrity='$integrity' crossorigin='anonymous' ", $tag);
}
}
return $tag;
}
add_action('wp_enqueue_scripts', 'secure_theme_assets');
- Validation assets du thème :
function validate_theme_assets() {
$theme_dir = get_stylesheet_directory();
$suspicious_patterns = array(
'eval(',
'document.write(',
'innerHTML',
'outerHTML'
);
foreach (glob("$theme_dir/*.js") as $js_file) {
$content = file_get_contents($js_file);
foreach ($suspicious_patterns as $pattern) {
if (strpos($content, $pattern) !== false) {
wp_mail('admin@example.com', 'Asset JavaScript suspect',
"Pattern suspect '$pattern' trouvé dans $js_file");
}
}
}
}
Valeur par défaut : Chargement assets sans validation
4.1.14 — Isolation Thème Sandbox
Niveau : 🟡
Référence : OWASP A04 / CIS WordPress 5.14 / NIST 800-53 SC-7
MITRE ATT&CK : T1505
Description : Implémenter des mécanismes d’isolation pour limiter l’impact d’une compromission du thème sur le reste du système.
Vérification :
# Vérifier isolation du thème
ls -la wp-content/themes/*/
# Permissions et propriétaire
stat wp-content/themes/*/functions.php
Remédiation :
- Isolation par permissions :
# Créer utilisateur dédié pour thèmes
sudo useradd -r -s /bin/false wp-theme-user
sudo chown -R wp-theme-user:wp-theme-user wp-content/themes/
# Permissions restrictives
find wp-content/themes/ -type f -exec chmod 644 {} \;
find wp-content/themes/ -type d -exec chmod 755 {} \;
- Limitation des capacités thème :
function restrict_theme_capabilities() {
// Désactiver fonctions dangereuses pour les thèmes
$dangerous_functions = array('exec', 'system', 'shell_exec', 'passthru', 'eval');
foreach ($dangerous_functions as $function) {
if (function_exists($function)) {
// Log tentative d'utilisation
add_filter("pre_option_active_plugins", function($plugins) use ($function) {
$backtrace = debug_backtrace();
foreach ($backtrace as $trace) {
if (isset($trace['file']) && strpos($trace['file'], '/themes/') !== false) {
error_log("SECURITY: Tentative d'utilisation de $function dans thème: " . $trace['file']);
wp_die("Fonction $function interdite dans les thèmes");
}
}
return $plugins;
});
}
}
}
add_action('after_setup_theme', 'restrict_theme_capabilities');
Valeur par défaut : Pas d’isolation spécifique
4.1.15 — Documentation et Maintenance Thèmes
Niveau : 🟢
Référence : CIS WordPress 5.15 / NIST 800-53 CM-8
MITRE ATT&CK : T1070
Description : Maintenir une documentation complète des thèmes, leurs personnalisations et un planning de maintenance régulier.
Vérification :
# Documentation existante
find . -name "*theme*doc*" -o -name "*README*" | grep -i theme
# Historique des modifications
ls -la wp-content/themes/*/changelog.txt 2>/dev/null
Remédiation :
- Documentation automatisée :
function generate_theme_documentation() {
$themes = wp_get_themes();
$documentation = array();
foreach ($themes as $theme_slug => $theme) {
$theme_info = array(
'name' => $theme->get('Name'),
'version' => $theme->get('Version'),
'description' => $theme->get('Description'),
'author' => $theme->get('Author'),
'template' => $theme->get('Template'),
'active' => ($theme_slug === get_stylesheet()),
'parent_theme' => $theme->parent() ? $theme->parent()->get('Name') : null,
'customizations' => $this->get_theme_customizations($theme_slug),
'last_modified' => $this->get_theme_last_modified($theme_slug),
'security_scan_date' => get_option("theme_scan_date_$theme_slug", 'Never')
);
$documentation[$theme_slug] = $theme_info;
}
// Générer rapport
file_put_contents(ABSPATH . 'theme-documentation.json',
json_encode($documentation, JSON_PRETTY_PRINT));
return $documentation;
}
function get_theme_customizations($theme_slug) {
$customizations = array();
$theme_dir = get_theme_root() . "/$theme_slug";
// Vérifier fichiers personnalisés
$custom_files = array('functions.php', 'style.css', 'custom.css');
foreach ($custom_files as $file) {
if (file_exists("$theme_dir/$file")) {
$customizations[$file] = array(
'size' => filesize("$theme_dir/$file"),
'modified' => date('Y-m-d H:i:s', filemtime("$theme_dir/$file"))
);
}
}
return $customizations;
}
- Planning de maintenance :
function schedule_theme_maintenance() {
// Planifier vérifications mensuelles
if (!wp_next_scheduled('monthly_theme_maintenance')) {
wp_schedule_event(time(), 'monthly', 'monthly_theme_maintenance');
}
}
function monthly_theme_maintenance() {
// Audit complet des thèmes
$audit_results = array(
'vulnerability_scan' => $this->scan_theme_vulnerabilities(),
'file_integrity' => $this->check_theme_integrity(),
'performance_impact' => $this->measure_theme_performance(),
'recommendations' => $this->generate_maintenance_recommendations()
);
// Envoyer rapport de maintenance
wp_mail('admin@example.com', 'Rapport maintenance thèmes mensuel',
wp_json_encode($audit_results, JSON_PRETTY_PRINT));
}
add_action('init', 'schedule_theme_maintenance');
add_action('monthly_theme_maintenance', 'monthly_theme_maintenance');
Valeur par défaut : Documentation manuelle et incomplète
S5 — PERMISSIONS FICHIERS & RÉPERTOIRES (20 contrôles)
Cette section traite de la sécurisation des permissions et de l’accès aux fichiers et répertoires WordPress.
5.1.1 — wp-config.php Permissions Restrictives
Niveau : 🔴
Référence : OWASP A05 / CIS WordPress 6.1 / NIST 800-53 AC-3
MITRE ATT&CK : T1005
Description : Le fichier wp-config.php contient des informations critiques (credentials DB, clés de sécurité). Il doit avoir des permissions très restrictives et être protégé contre l’accès web.
Vérification :
# Vérifier permissions wp-config.php
ls -la wp-config.php
stat -c "%a %n" wp-config.php
# Test accès web
curl -s https://example.com/wp-config.php | head -5
curl -s https://example.com/wp-config.php.bak | head -5
Remédiation :
- Permissions système appropriées :
# Permissions restrictives pour wp-config.php
chmod 600 wp-config.php
chown www-data:www-data wp-config.php
# Vérifier résultat
ls -la wp-config.php
- Protection web via .htaccess :
# .htaccess racine
<Files wp-config.php>
Order allow,deny
Deny from all
</Files>
<Files wp-config.php.bak>
Order allow,deny
Deny from all
</Files>
<Files "wp-config*">
Order allow,deny
Deny from all
</Files>
- Déplacement hors web root :
# Déplacer wp-config.php un niveau au-dessus
mv wp-config.php ../wp-config.php
# WordPress le trouvera automatiquement
Valeur par défaut : 644 (lisible par tous)
5.1.2 — .htaccess Permissions et Protection
Niveau : 🟠
Référence : OWASP A05 / CIS WordPress 6.2 / NIST 800-53 AC-3
MITRE ATT&CK : T1005
Description : Le fichier .htaccess contrôle la configuration du serveur web. Il doit être protégé en écriture et contre la modification non autorisée pour maintenir les règles de sécurité.
Vérification :
# Vérifier permissions .htaccess
ls -la .htaccess
stat -c "%a %n" .htaccess
# Vérifier contenu
cat .htaccess | head -10
Remédiation :
- Permissions appropriées :
# Lecture seule pour .htaccess
chmod 644 .htaccess
chown www-data:www-data .htaccess
# Immutable (optionnel, nécessite droits root)
sudo chattr +i .htaccess
- Protection dans .htaccess lui-même :
# Auto-protection du .htaccess
<Files .htaccess>
Order allow,deny
Deny from all
</Files>
# Protection fichiers de configuration
<FilesMatch "\.(htaccess|htpasswd|ini|log|sh|inc|bak)$">
Order allow,deny
Deny from all
</FilesMatch>
- Monitoring modifications :
function monitor_htaccess_changes() {
$htaccess_file = ABSPATH . '.htaccess';
$stored_hash = get_option('htaccess_hash');
if (file_exists($htaccess_file)) {
$current_hash = md5_file($htaccess_file);
if ($stored_hash && $stored_hash !== $current_hash) {
// .htaccess modifié
wp_mail('admin@example.com', '.htaccess modifié',
'Le fichier .htaccess a été modifié. Vérifiez les changements.');
}
update_option('htaccess_hash', $current_hash);
}
}
wp_schedule_event(time(), 'hourly', 'monitor_htaccess_changes');
Valeur par défaut : 644 (modifiable par le serveur web)
5.1.3 — Répertoire wp-content/uploads Sécurisé
Niveau : 🔴
Référence : OWASP A04 / CIS WordPress 6.3 / NIST 800-53 SI-3
MITRE ATT&CK : T1105
Description : Le répertoire uploads est souvent ciblé pour l’upload de webshells. L’exécution PHP doit y être désactivée et les types de fichiers strictement contrôlés.
Vérification :
# Tester exécution PHP dans uploads
echo "<?php echo 'PHP executable'; ?>" > wp-content/uploads/test.php
curl -s https://example.com/wp-content/uploads/test.php
rm wp-content/uploads/test.php
# Vérifier .htaccess uploads
ls -la wp-content/uploads/.htaccess
Remédiation :
- Désactiver exécution PHP via .htaccess dans wp-content/uploads/
- Permissions appropriées : chmod 755 uploads/, fichiers 644
- Validation types MIME stricte via hooks WordPress
Valeur par défaut : Exécution PHP possible
5.1.4 — Désactivation Directory Listing
Niveau : 🟠
Référence : OWASP A05 / CIS WordPress 6.4 / NIST 800-53 CM-7
MITRE ATT&CK : T1083
Description : Le directory listing révèle la structure des fichiers aux attaquants. Il doit être désactivé sur tous les répertoires WordPress pour empêcher la reconnaissance.
Vérification :
# Tester directory listing sur différents répertoires
curl -s https://example.com/wp-content/ | grep -i "index of"
curl -s https://example.com/wp-includes/ | grep -i "index of"
curl -s https://example.com/wp-content/themes/ | grep -i "index of"
Remédiation :
- Désactivation globale via .htaccess : Options -Indexes
- Fichiers index.php vides dans répertoires sensibles
- Configuration serveur Nginx : autoindex off
Valeur par défaut : Directory listing souvent activé
5.1.5 — Protection wp-includes
Niveau : 🟠
Référence : OWASP A05 / CIS WordPress 6.5 / NIST 800-53 AC-3
MITRE ATT&CK : T1005
Description : Le répertoire wp-includes contient le cœur de WordPress et ne devrait pas être accessible directement via le web, sauf pour les assets nécessaires.
Vérification :
# Tester accès direct aux fichiers wp-includes
curl -s https://example.com/wp-includes/version.php
curl -s https://example.com/wp-includes/wp-db.php
# Vérifier assets légitimes
curl -s -I https://example.com/wp-includes/css/admin-bar.min.css
Remédiation :
- Protection sélective wp-includes via .htaccess
- Bloquer .php, autoriser CSS/JS/images
- Hooks PHP pour bloquer accès direct
Valeur par défaut : Accès direct possible
S6 — BASE DE DONNÉES (20 contrôles)
Cette section couvre la sécurisation de la base de données WordPress et de ses accès.
6.1.1 — Préfixe Table Personnalisé
Niveau : 🟡
Référence : OWASP A03 / CIS WordPress 7.1 / NIST 800-53 SC-28
MITRE ATT&CK : T1190
Description : Le préfixe par défaut wp_ facilite les attaques d’injection SQL automatisées. Un préfixe personnalisé ajoute une couche d’obscurité contre les attaques génériques.
Vérification :
# Via wp-config.php
grep "table_prefix" wp-config.php
# Via wp-cli
wp config get table_prefix
# Test base de données
wp db query "SHOW TABLES LIKE 'wp_%'"
Remédiation :
- Modifier wp-config.php : table_prefix = ‘xyz123_’;
- Renommer tables existantes si nécessaire
- Mettre à jour options et usermeta
Valeur par défaut : wp_
6.1.2 — Utilisateur Base de Données Dédié
Niveau : 🔴
Référence : OWASP A07 / CIS WordPress 7.2 / NIST 800-53 AC-6
MITRE ATT&CK : T1078
Description : WordPress doit utiliser un utilisateur de base de données dédié avec des privilèges minimaux, pas le compte root ou admin de la base.
Vérification :
# Vérifier utilisateur DB dans wp-config
grep "DB_USER" wp-config.php
# Tester privilèges
wp db query "SHOW GRANTS FOR CURRENT_USER"
# Vérifier si root
wp db query "SELECT USER(), CURRENT_USER()"
Remédiation :
- Créer utilisateur dédié WordPress
- Accorder privilèges minimaux uniquement
- Révoquer privilèges administratifs si existants
Valeur par défaut : Souvent utilisateur avec trop de privilèges
6.1.3 — Privilèges Minimaux Base de Données
Niveau : 🔴
Référence : OWASP A01 / CIS WordPress 7.3 / NIST 800-53 AC-6
MITRE ATT&CK : T1078
Description : L’utilisateur WordPress doit avoir uniquement les privilèges nécessaires : SELECT, INSERT, UPDATE, DELETE sur la base WordPress. Pas de privilèges globaux.
Vérification :
# Vérifier privilèges actuels
wp db query "SHOW GRANTS"
# Vérifier privilèges dangereux
wp db query "SELECT * FROM information_schema.user_privileges WHERE grantee LIKE '%wpuser%'"
Remédiation :
- Révoquer privilèges excessifs
- Accorder seulement SELECT, INSERT, UPDATE, DELETE
- Limiter à la base WordPress uniquement
Valeur par défaut : Privilèges souvent excessifs
6.1.4 — Connexions Chiffrées SSL/TLS
Niveau : 🟠
Référence : OWASP A02 / CIS WordPress 7.4 / NIST 800-53 SC-8
MITRE ATT&CK : T1040
Description : Les connexions à la base de données doivent être chiffrées via SSL/TLS pour protéger les données en transit, particulièrement sur des bases distantes.
Vérification :
# Vérifier SSL DB actuel
wp db query "SHOW STATUS LIKE 'Ssl_cipher'"
wp db query "SHOW VARIABLES LIKE 'have_ssl'"
# Configuration wp-config
grep -i ssl wp-config.php
Remédiation :
- Configurer MySQL/MariaDB avec SSL
- Ajouter MYSQL_CLIENT_FLAGS dans wp-config.php
- Forcer connexions SSL uniquement
Valeur par défaut : Connexions non chiffrées
6.1.5 — Sauvegarde Automatisée Base de Données
Niveau : 🔴
Référence : OWASP A04 / CIS WordPress 7.5 / NIST 800-53 CP-9
MITRE ATT&CK : T1485
Description : Mettre en place des sauvegardes automatisées, régulières et testées de la base de données WordPress avec rétention appropriée et stockage sécurisé.
Vérification :
# Vérifier plugins backup
wp plugin list | grep -iE "(backup|updraft)"
# Dernière sauvegarde
ls -la /backups/wordpress/ 2>/dev/null
# Cron backup
crontab -l | grep -i backup
Remédiation :
- Configuration plugin backup fiable
- Sauvegarde quotidienne minimum
- Test restauration régulier
Valeur par défaut : Sauvegardes manuelles ou absentes
RÉCAPITULATIF ET CONCLUSION
📊 TABLEAU DE BORD SÉCURITÉ
Résumé par Section
| Section | Contrôles | 🔴 Critiques | 🟠 Élevés | 🟡 Moyens | 🟢 Faibles |
|---|---|---|---|---|---|
| S1 - Installation & Config | 20 | 5 | 8 | 6 | 1 |
| S2 - Authentification | 25 | 7 | 10 | 7 | 1 |
| S3 - Plugins | 25 | 4 | 8 | 12 | 1 |
| S4 - Thèmes | 15 | 2 | 5 | 7 | 1 |
| S5 - Permissions Fichiers | 20 | 3 | 6 | 10 | 1 |
| S6 - Base de Données | 20 | 4 | 6 | 8 | 2 |
| TOTAL | 125 | 25 | 43 | 50 | 7 |
Score de Maturité Sécurité
- Niveau 1 - Initial : 0-30% de conformité
- Niveau 2 - Basique : 31-50% de conformité
- Niveau 3 - Intermédiaire : 51-70% de conformité
- Niveau 4 - Avancé : 71-85% de conformité
- Niveau 5 - Expert : 86-100% de conformité
Top 10 des Risques Critiques WordPress 2026
- Plugins vulnérables - Mise à jour différée, plugins abandonnés
- Authentification faible - Pas de 2FA, mots de passe faibles
- wp-config.php exposé - Permissions inappropriées, accès web
- XML-RPC activé - Vecteur d’attaque DDoS et brute force
- Uploads non sécurisés - Exécution PHP, validation insuffisante
- Utilisateurs énumérables - API REST, paramètres author
- Base de données sur-privilégiée - Utilisateur root, privilèges globaux
- Thèmes obsolètes - Vulnérabilités non patchées
- Headers sécurité manquants - XSS, clickjacking possible
- Monitoring insuffisant - Détection d’intrusion absente
🗺️ ROADMAP DE REMÉDIATION
Phase 1 - Urgence (0-7 jours) 🔴
Objectif : Corriger les vulnérabilités critiques
✅ Actions Prioritaires :
- Mettre à jour WordPress core, plugins et thèmes
- Activer 2FA pour tous les administrateurs
- Sécuriser wp-config.php (permissions 600)
- Désactiver XML-RPC si non utilisé
- Bloquer exécution PHP dans /uploads/
- Changer préfixe base de données si wp_
- Activer HTTPS forcé et HSTS
- Installer plugin de sécurité (Wordfence/Sucuri)
Temps estimé : 4-8 heures selon la taille du site
Phase 2 - Court terme (1-4 semaines) 🟠
Objectif : Renforcer la sécurité générale
✅ Actions importantes :
- Configurer sauvegarde automatique complète
- Implémenter limitation tentatives de connexion
- Configurer headers de sécurité HTTP
- Auditer et nettoyer plugins/thèmes inactifs
- Mettre en place monitoring basique
- Renforcer permissions fichiers système
- Configurer WAF (CloudFlare/Sucuri)
- Créer environnement de staging
Temps estimé : 2-4 semaines selon les ressources
Phase 3 - Moyen terme (1-3 mois) 🟡
Objectif : Optimiser et automatiser
✅ Actions d’amélioration :
- Déployer SIEM/monitoring avancé
- Automatiser tests de sécurité
- Implémenter CI/CD sécurisé
- Former équipe aux bonnes pratiques
- Documenter procédures sécurité
- Mettre en place audit régulier
- Optimiser performances sécurisées
- Plan de réponse aux incidents
Temps estimé : 1-3 mois selon la maturité
Phase 4 - Long terme (3-12 mois) 🟢
Objectif : Excellence et conformité
✅ Actions stratégiques :
- Certification sécurité (ISO 27001)
- Audit externe annuel
- Formation continue équipe
- Veille technologique sécurité
- Amélioration continue processus
- Business continuity plan
- Disaster recovery plan
- Security by design
📋 MAPPING RÉFÉRENTIELS
OWASP Top 10 2021
| OWASP | WordPress | Contrôles |
|---|---|---|
| A01 - Broken Access Control | Permissions, Roles, Files | S2, S5 |
| A02 - Cryptographic Failures | SSL, Passwords, Storage | S2, S6, S7 |
| A03 - Injection | SQL, XSS, Upload | S3, S6, S9 |
| A04 - Insecure Design | Config, Plugins | S1, S3, S9 |
| A05 - Security Misconfiguration | WordPress, Server | S1, S5, S8 |
| A06 - Vulnerable Components | Plugins, Themes | S3, S4 |
| A07 - Identification Failures | Auth, Sessions | S2 |
| A08 - Software Integrity | Updates, Verification | S3, S4, S5 |
| A09 - Logging Failures | Monitoring, Audit | S14 |
| A10 - SSRF | Plugin Communications | S3, S10 |
NIST Cybersecurity Framework
| Fonction | WordPress | Description |
|---|---|---|
| IDENTIFY | S1, S3, S14 | Asset inventory, vulnerabilities |
| PROTECT | S2, S5, S7, S8 | Access control, data protection |
| DETECT | S11, S14 | Monitoring, threat detection |
| RESPOND | S12, S18 | Incident response, backups |
| RECOVER | S12, S13 | Recovery planning, updates |
ISO 27001:2022
| Annexe A | WordPress | Contrôles |
|---|---|---|
| A.5 - Information Security Policies | S18 | Governance |
| A.6 - Organization of Information Security | S18 | Roles & Responsibilities |
| A.8 - Asset Management | S3, S4 | Plugin/Theme inventory |
| A.9 - Access Control | S2, S5 | Authentication, Authorization |
| A.12 - Operations Security | S1, S13 | Secure operations |
| A.13 - Communications Security | S7, S8 | Network protection |
| A.14 - System Acquisition | S3, S4 | Secure development |
| A.16 - Information Security Incident Management | S14, S18 | Incident response |
| A.17 - Business Continuity | S12 | Backup & Recovery |
| A.18 - Compliance | S18 | Legal & Regulatory |
MITRE ATT&CK Framework
| Tactique | Technique | WordPress | Contrôles |
|---|---|---|---|
| Initial Access | T1190 - Exploit Public Application | Plugins vulnérables | S3, S4 |
| Persistence | T1505 - Server Software Component | Webshells, backdoors | S3, S5 |
| Privilege Escalation | T1078 - Valid Accounts | Comptes compromis | S2 |
| Defense Evasion | T1070 - Indicator Removal | Log clearing | S14 |
| Credential Access | T1110 - Brute Force | Login attacks | S2, S11 |
| Discovery | T1083 - File Discovery | Directory listing | S5 |
| Collection | T1005 - Data from Local System | File access | S5 |
| Exfiltration | T1041 - C2 Channel | Data theft | S11 |
| Impact | T1485 - Data Destruction | Ransomware | S12 |
S7 — SSL/TLS & HTTPS
7.1.1 — Certificat SSL Valide et Configuré
Niveau : 🔴 Critique Référence : OWASP A07 / CIS WordPress 7.1 MITRE ATT&CK : T1040
Description : Le site doit disposer d’un certificat SSL valide émis par une autorité de confiance. Un certificat invalide ou auto-signé expose les données en transit et affecte la confiance des utilisateurs.
Vérification :
# Test du certificat SSL
curl -I https://votre-site.com
openssl s_client -connect votre-site.com:443 -servername votre-site.com < /dev/null
# Vérifier la date d'expiration
echo | openssl s_client -connect votre-site.com:443 2>/dev/null | openssl x509 -noout -dates
Remédiation :
- Obtenir un certificat Let’s Encrypt gratuit via Certbot
- Configurer le renouvellement automatique
- Tester la configuration avec SSL Labs
Valeur par défaut : Aucun certificat SSL configuré
7.1.2 — Force HTTPS sur tout le site
Niveau : 🔴 Critique
Référence : OWASP A02 / CIS WordPress 7.2
MITRE ATT&CK : T1040
Description : Forcer la redirection HTTPS pour toutes les pages empêche l’interception des données sensibles et améliore le référencement SEO.
Vérification :
# Test redirection HTTP vers HTTPS
curl -I http://votre-site.com
# Vérifier les URLs WordPress
wp option get siteurl --allow-root
wp option get home --allow-root
Remédiation :
- Dans wp-config.php :
define('FORCE_SSL_ADMIN', true); - Mettre à jour les URLs :
wp option update siteurl 'https://votre-site.com' --allow-root - Configurer .htaccess pour redirection 301
Valeur par défaut : HTTP autorisé, pas de redirection forcée
7.1.3 — Configuration HSTS (HTTP Strict Transport Security)
Niveau : 🟠 Important
Référence : OWASP A06 / CIS WordPress 7.3
MITRE ATT&CK : T1557
Description : HSTS force les navigateurs à utiliser exclusivement HTTPS et prévient les attaques de type SSL stripping et man-in-the-middle.
Vérification :
# Vérifier header HSTS
curl -I https://votre-site.com | grep -i strict-transport-security
# Test avec Security Headers
curl -H 'User-Agent: Mozilla/5.0' -I https://votre-site.com
Remédiation :
- Ajouter dans .htaccess :
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" - Ou via plugin Wordfence/Security Headers
- Soumettre le domaine à HSTS Preload List
Valeur par défaut : Header HSTS non configuré
7.1.4 — Élimination Mixed Content (contenu mixte)
Niveau : 🟡 Modéré Référence : OWASP A06 / CIS WordPress 7.4 MITRE ATT&CK : T1040
Description : Le mixed content (ressources HTTP chargées sur une page HTTPS) compromet la sécurité et génère des avertissements navigateur.
Vérification :
# Scanner le mixed content
curl -s https://votre-site.com | grep -i 'http://' | head -10
# Vérifier via navigateur Console F12
# Plugin Really Simple SSL peut détecter automatiquement
Remédiation :
- Installer plugin Really Simple SSL ou SSL Insecure Content Fixer
- Mettre à jour manuellement les URLs en base :
wp search-replace 'http://votre-site.com' 'https://votre-site.com' --allow-root - Configurer CSP upgrade-insecure-requests
Valeur par défaut : Mixed content possible selon thème/plugins
7.1.5 — Support TLS 1.2+ uniquement
Niveau : 🟠 Important Référence : OWASP A02 / CIS WordPress 7.5 MITRE ATT&CK : T1040
Description : Désactiver les versions obsolètes de SSL/TLS (SSLv2, SSLv3, TLS 1.0, TLS 1.1) qui contiennent des vulnérabilités connues.
Vérification :
# Test des versions TLS supportées
nmap --script ssl-enum-ciphers -p 443 votre-site.com
# Test spécifique TLS 1.2
openssl s_client -tls1_2 -connect votre-site.com:443
# Test SSLv3 (ne doit PAS fonctionner)
openssl s_client -ssl3 -connect votre-site.com:443
Remédiation :
- Configuration Apache :
SSLProtocol -all +TLSv1.2 +TLSv1.3 - Configuration Nginx :
ssl_protocols TLSv1.2 TLSv1.3; - Vérifier avec SSL Labs Test
Valeur par défaut : Dépend de la configuration serveur
7.1.6 — Renouvellement Automatique Let’s Encrypt
Niveau : 🟡 Modéré Référence : CIS WordPress 7.6 MITRE ATT&CK : T1040
Description : Le renouvellement automatique des certificats Let’s Encrypt évite les interruptions de service dues à l’expiration des certificats.
Vérification :
# Vérifier les tâches cron Certbot
crontab -l | grep certbot
# Tester le renouvellement
certbot renew --dry-run
# Vérifier les logs
cat /var/log/letsencrypt/letsencrypt.log | tail -20
Remédiation :
- Configurer cron job :
0 12 * * * /usr/bin/certbot renew --quiet - Ajouter hook de redémarrage web server
- Monitorer les expirations avec services externes
Valeur par défaut : Renouvellement manuel requis
7.1.7 — Chiffrement des Cookies (Secure Flag)
Niveau : 🟠 Important Référence : OWASP A02 / CIS WordPress 7.7 MITRE ATT&CK : T1539
Description : Forcer le flag Secure sur les cookies sensibles empêche leur transmission sur des connexions non chiffrées.
Vérification :
# Vérifier les cookies via curl
curl -I -c cookies.txt https://votre-site.com/wp-login.php
cat cookies.txt | grep -i secure
# Ou via navigateur F12 > Application > Cookies
Remédiation :
- Dans wp-config.php :
ini_set('session.cookie_secure', 1); - Plugin Security Headers pour forcer les flags
- Configuration serveur pour tous les cookies
Valeur par défaut : Cookies sans flag Secure
7.1.8 — Configuration Cipher Suites Sécurisées
Niveau : 🟡 Modéré
Référence : OWASP A02 / CIS WordPress 7.8
MITRE ATT&CK : T1040
Description : Utiliser uniquement des cipher suites robustes et désactiver les algorithmes faibles (RC4, DES, export ciphers).
Vérification :
# Scanner les cipher suites
nmap --script ssl-enum-ciphers -p 443 votre-site.com | grep -E '(weak|export|rc4)'
# Test SSL Labs pour grade A+
curl -s 'https://api.ssllabs.com/api/v3/analyze?host=votre-site.com'
Remédiation :
- Configuration Apache recommandée Mozilla SSL Generator
- Désactiver ciphers faibles dans virtualhost
- Privilégier AEAD ciphers (AES-GCM, ChaCha20-Poly1305)
Valeur par défaut : Configuration serveur par défaut (souvent faible)
7.1.9 — Perfect Forward Secrecy (PFS)
Niveau : 🟡 Modéré Référence : OWASP A02 / CIS WordPress 7.9 MITRE ATT&CK : T1040
Description : Perfect Forward Secrecy garantit que la compromission des clés privées n’affecte pas la confidentialité des sessions passées.
Vérification :
# Vérifier le support PFS
openssl s_client -connect votre-site.com:443 -cipher ECDHE
# Test avec SSL Labs - rechercher 'Forward Secrecy'
curl -s 'https://www.ssllabs.com/ssltest/analyze.html?d=votre-site.com'
Remédiation :
- Privilégier les cipher suites ECDHE et DHE
- Configuration Apache :
SSLCipherSuite ECDHE+AESGCM:ECDHE+AES256 - Générer des paramètres DH forts :
openssl dhparam -out dhparam.pem 2048
Valeur par défaut : Dépend de la configuration cipher suites
7.1.10 — Désactivation Compression SSL (CRIME/BREACH)
Niveau : 🟡 Modéré Référence : OWASP A06 / CIS WordPress 7.10 MITRE ATT&CK : T1040
Description : Désactiver la compression SSL/TLS pour prévenir les attaques CRIME et BREACH qui exploitent les patterns de compression.
Vérification :
# Vérifier si compression SSL activée
echo | openssl s_client -connect votre-site.com:443 2>/dev/null | grep Compression
# Test avec nmap
nmap --script ssl-cert,ssl-enum-ciphers -p 443 votre-site.com
Remédiation :
- Apache :
SSLCompression off - Nginx : compression désactivée par défaut pour SSL
- Vérifier que mod_deflate n’affecte pas HTTPS
Valeur par défaut : Compression souvent activée
7.1.11 — Monitoring Expiration Certificats
Niveau : 🟡 Modéré Référence : CIS WordPress 7.11 MITRE ATT&CK : T1040
Description : Surveiller proactivement l’expiration des certificats SSL pour éviter les interruptions de service et les alertes de sécurité.
Vérification :
# Script de monitoring expiration
echo | openssl s_client -connect votre-site.com:443 2>/dev/null | openssl x509 -noout -dates
# Calculer jours restants
echo | openssl s_client -servername votre-site.com -connect votre-site.com:443 2>/dev/null | openssl x509 -noout -checkend 2592000
Remédiation :
- Script cron de vérification hebdomadaire
- Alertes email 30/15/7 jours avant expiration
- Services externes : SSL Monitor, Uptime Robot
Valeur par défaut : Pas de monitoring automatique
7.1.12 — Certificate Transparency (CT) Logs
Niveau : 🟢 Recommandé Référence : CIS WordPress 7.12 MITRE ATT&CK : T1040
Description : Surveiller les Certificate Transparency logs pour détecter les certificats émis frauduleusement pour votre domaine.
Vérification :
# Rechercher certificats dans CT logs
curl -s 'https://crt.sh/?q=votre-site.com&output=json' | jq '.[] | {id: .id, name: .name_value, not_after: .not_after}'
# Vérifier via SSL Labs CT compliance
Remédiation :
- Configurer monitoring crt.sh ou Censys
- Alertes automatiques nouveaux certificats
- Audit régulier des certificats émis
Valeur par défaut : Pas de monitoring CT configuré
7.1.13 — OCSP Stapling Configuration
Niveau : 🟡 Modéré
Référence : CIS WordPress 7.13
MITRE ATT&CK : T1040
Description : OCSP Stapling améliore les performances et la privacy en évitant les requêtes directes des clients vers l’autorité de certification.
Vérification :
# Test OCSP Stapling
echo | openssl s_client -connect votre-site.com:443 -status
# Vérifier via SSL Labs test
curl -s 'https://www.ssllabs.com/ssltest/analyze.html?d=votre-site.com' | grep -i ocsp
Remédiation :
- Apache :
SSLUseStapling On+SSLStaplingCache shmcb:/tmp/stapling_cache(128000) - Nginx :
ssl_stapling on;+ssl_stapling_verify on; - Test avec SSL Labs pour validation
Valeur par défaut : OCSP Stapling désactivé
7.1.14 — HTTP Public Key Pinning (HPKP) - Optionnel
Niveau : 🟢 Recommandé
Référence : CIS WordPress 7.14
MITRE ATT&CK : T1557
Description : HPKP permet d’épingler les clés publiques des certificats pour prévenir les attaques man-in-the-middle avec certificats frauduleux. À utiliser avec précaution.
Vérification :
# Vérifier header HPKP (deprecated)
curl -I https://votre-site.com | grep -i public-key-pins
# Préférer Certificate Authority Authorization (CAA)
dig CAA votre-site.com
Remédiation :
- HPKP deprecated - utiliser CAA DNS records à la place
- Configurer CAA :
votre-site.com. CAA 0 issue "letsencrypt.org" - Monitoring changements certificats via CT logs
Valeur par défaut : Pas de pinning configuré
7.1.15 — Audit Configuration SSL/TLS
Niveau : 🟡 Modéré Référence : CIS WordPress 7.15 MITRE ATT&CK : T1040
Description : Effectuer régulièrement des audits de configuration SSL/TLS avec des outils automatisés pour maintenir un niveau de sécurité optimal.
Vérification :
# Test SSL Labs (grade A+ requis)
curl -s 'https://api.ssllabs.com/api/v3/analyze?host=votre-site.com&publish=off'
# Test avec testssl.sh
./testssl.sh https://votre-site.com
# Scanner Nmap SSL
nmap --script ssl-cert,ssl-enum-ciphers -p 443 votre-site.com
Remédiation :
- Audit mensuel avec SSL Labs
- Scripts automatisés testssl.sh
- Monitoring continu avec Qualys ou similaire
- Documentation des changements de configuration
Valeur par défaut : Pas d’audit automatique configuré
S8 — HEADERS DE SÉCURITÉ HTTP
8.1.1 — Content Security Policy (CSP)
Niveau : 🟠 Important Référence : OWASP A03 / CIS WordPress 8.1 MITRE ATT&CK : T1189
Description : CSP prévient les attaques XSS en contrôlant les ressources (scripts, styles, images) que le navigateur est autorisé à charger.
Vérification :
# Vérifier header CSP
curl -I https://votre-site.com | grep -i content-security-policy
# Tester avec Security Headers
curl -H 'User-Agent: Mozilla/5.0' -I https://votre-site.com
Remédiation :
- Ajouter dans .htaccess :
Header always set Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'" - Plugin Wordfence ou Security Headers
- Tester avec CSP Evaluator de Google
Valeur par défaut : Pas de header CSP configuré
8.1.2 — X-Frame-Options Protection
Niveau : 🔴 Critique
Référence : OWASP A06 / CIS WordPress 8.2
MITRE ATT&CK : T1189
Description : X-Frame-Options empêche l’intégration du site dans des frames/iframes, prévenant les attaques de clickjacking.
Vérification :
# Vérifier X-Frame-Options
curl -I https://votre-site.com | grep -i x-frame-options
# Test clickjacking
curl -H 'User-Agent: Mozilla/5.0' -I https://votre-site.com/wp-login.php
Remédiation :
- .htaccess :
Header always set X-Frame-Options "SAMEORIGIN" - wp-config.php :
header('X-Frame-Options: SAMEORIGIN'); - Plugin Security Headers pour gestion centralisée
Valeur par défaut : Header non configuré - clickjacking possible
8.1.3 — X-Content-Type-Options
Niveau : 🟠 Important Référence : OWASP A06 / CIS WordPress 8.3 MITRE ATT&CK : T1189
Description : Empêche le browser de “deviner” le type MIME des fichiers, prévenant l’exécution de contenu malveillant uploadé.
Vérification :
# Vérifier X-Content-Type-Options
curl -I https://votre-site.com | grep -i x-content-type-options
# Test sur uploads
curl -I https://votre-site.com/wp-content/uploads/test.txt
Remédiation :
- .htaccess :
Header always set X-Content-Type-Options "nosniff" - Configuration Apache/Nginx globale
- Vérifier que les uploads ont les bons types MIME
Valeur par défaut : MIME type sniffing activé
8.1.4 — X-XSS-Protection (Legacy)
Niveau : 🟡 Modéré Référence : OWASP A03 / CIS WordPress 8.4 MITRE ATT&CK : T1189
Description : Active le filtre XSS intégré des navigateurs. Header legacy mais encore utile pour anciens navigateurs.
Vérification :
# Vérifier X-XSS-Protection
curl -I https://votre-site.com | grep -i x-xss-protection
# Tester réflexion XSS basique
curl 'https://votre-site.com/?test=<script>alert(1)</script>'
Remédiation :
- .htaccess :
Header always set X-XSS-Protection "1; mode=block" - CSP moderne préférable pour nouveaux browsers
- Sanitisation input côté serveur prioritaire
Valeur par défaut : Protection XSS navigateur désactivée
8.1.5 — Referrer-Policy Configuration
Niveau : 🟡 Modéré
Référence : OWASP A01 / CIS WordPress 8.5
MITRE ATT&CK : T1033
Description : Contrôle les informations de référent transmises lors des requêtes sortantes pour protéger la privacy et éviter les fuites d’information.
Vérification :
# Vérifier Referrer-Policy
curl -I https://votre-site.com | grep -i referrer-policy
# Test avec liens externes
curl -H 'Referer: https://votre-site.com/admin' https://external-site.com
Remédiation :
- .htaccess :
Header always set Referrer-Policy "strict-origin-when-cross-origin" - Alternative :
same-originpour plus de sécurité - Tester impact sur analytics et partenaires
Valeur par défaut : Referrer complet transmis
8.1.6 — Permissions-Policy (Feature-Policy)
Niveau : 🟡 Modéré
Référence : CIS WordPress 8.6
MITRE ATT&CK : T1189
Description : Contrôle l’accès aux APIs navigateur (caméra, microphone, géolocalisation) pour réduire la surface d’attaque.
Vérification :
# Vérifier Permissions-Policy
curl -I https://votre-site.com | grep -i permissions-policy
# Ancien header Feature-Policy
curl -I https://votre-site.com | grep -i feature-policy
Remédiation :
- .htaccess :
Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()" - Adapter selon besoins fonctionnels du site
- Documentation des APIs autorisées
Valeur par défaut : Toutes APIs navigateur accessibles
8.1.7 — CORS (Cross-Origin Resource Sharing)
Niveau : 🟠 Important Référence : OWASP A05 / CIS WordPress 8.7 MITRE ATT&CK : T1189
Description : Configurer CORS de manière restrictive pour contrôler les domaines autorisés à accéder aux ressources du site.
Vérification :
# Vérifier headers CORS
curl -H 'Origin: https://external-domain.com' -I https://votre-site.com/wp-json/
# Test API REST WordPress
curl -H 'Origin: https://malicious-site.com' https://votre-site.com/wp-json/wp/v2/users
Remédiation :
- .htaccess :
Header set Access-Control-Allow-Origin "https://votre-domaine.com" - Plugin REST API security pour contrôle granulaire
- Éviter wildcard
*sauf cas spécifique
Valeur par défaut : CORS permissif par défaut
8.1.8 — Cache-Control et Pragma Headers
Niveau : 🟡 Modéré Référence : CIS WordPress 8.8 MITRE ATT&CK : T1005
Description : Configurer les headers de cache pour empêcher la mise en cache de pages sensibles (login, admin) dans browsers et proxies.
Vérification :
# Vérifier Cache-Control sur pages sensibles
curl -I https://votre-site.com/wp-login.php | grep -i cache-control
curl -I https://votre-site.com/wp-admin/ | grep -i cache-control
Remédiation :
- Pour wp-login.php :
Cache-Control: no-cache, no-store, must-revalidate - .htaccess règles spécifiques wp-admin/
- Plugin cache avec exclusions pages sensibles
Valeur par défaut : Pas de contrôle cache spécifique
8.1.9 — Server Header Information Hiding
Niveau : 🟡 Modéré
Référence : OWASP A06 / CIS WordPress 8.9
MITRE ATT&CK : T1082
Description : Masquer ou modifier les headers serveur révélant des informations techniques exploitables par les attaquants.
Vérification :
# Vérifier headers informatifs
curl -I https://votre-site.com | grep -E '(Server|X-Powered-By|X-Generator)'
# Version Apache/Nginx exposée
curl -I https://votre-site.com | grep Server
Remédiation :
- Apache :
ServerTokens Prod+ServerSignature Off - Nginx :
server_tokens off; - .htaccess :
Header unset X-Powered-By
Valeur par défaut : Informations serveur exposées
8.1.10 — Cross-Origin-Embedder-Policy (COEP)
Niveau : 🟢 Recommandé Référence : CIS WordPress 8.10 MITRE ATT&CK : T1189
Description : COEP renforce l’isolation des origins et protège contre certaines attaques side-channel comme Spectre.
Vérification :
# Vérifier COEP header
curl -I https://votre-site.com | grep -i cross-origin-embedder-policy
# Tester avec ressources cross-origin
curl -I https://votre-site.com/page-with-external-resources
Remédiation :
- .htaccess :
Header always set Cross-Origin-Embedder-Policy "require-corp" - Adapter ressources externes avec CORP headers
- Tester impact sur fonctionnalités cross-origin
Valeur par défaut : Pas de politique COEP configurée
8.1.11 — Cross-Origin-Opener-Policy (COOP)
Niveau : 🟢 Recommandé Référence : CIS WordPress 8.11 MITRE ATT&CK : T1189
Description : COOP empêche les documents cross-origin d’accéder au contexte de navigation, protégeant contre les attaques via window.opener.
Vérification :
# Vérifier COOP header
curl -I https://votre-site.com | grep -i cross-origin-opener-policy
# Test avec popups et liens target=_blank
Remédiation :
- .htaccess :
Header always set Cross-Origin-Opener-Policy "same-origin" - Ajouter rel=“noopener” aux liens externes
- Tester intégrations nécessitant window.opener
Valeur par défaut : Cross-origin access autorisé
8.1.12 — Expect-CT Header (Deprecated)
Niveau : 🟢 Recommandé
Référence : CIS WordPress 8.12
MITRE ATT&CK : T1040
Description : Expect-CT force la validation Certificate Transparency. Header deprecated mais encore utile pour transition.
Vérification :
# Vérifier Expect-CT (deprecated)
curl -I https://votre-site.com | grep -i expect-ct
# Vérifier CT compliance via SSL Labs
Remédiation :
- Header deprecated - utiliser CT monitoring externe
- Surveiller crt.sh et Censys pour nouveaux certificats
- Alertes automatiques émission certificats non autorisés
Valeur par défaut : Pas de validation CT forcée
8.1.13 — Clear-Site-Data Header
Niveau : 🟡 Modéré
Référence : CIS WordPress 8.13
MITRE ATT&CK : T1539
Description : Clear-Site-Data permet de supprimer sélectivement les données browser (cookies, cache, storage) lors de la déconnexion.
Vérification :
# Vérifier Clear-Site-Data sur logout
curl -I https://votre-site.com/wp-login.php?action=logout
# Tester suppression données browser
Remédiation :
- Sur wp-login.php?action=logout :
Clear-Site-Data: "cookies", "storage" - Plugin logout sécurisé avec clear data
- Configurer selon besoins (cache, cookies, storage)
Valeur par défaut : Données browser persistantes après logout
8.1.14 — Custom Security Headers
Niveau : 🟡 Modéré Référence : CIS WordPress 8.14 MITRE ATT&CK : T1082
Description : Implémenter des headers de sécurité personnalisés pour besoins spécifiques de l’organisation.
Vérification :
# Audit complet headers sécurité
curl -I https://votre-site.com | grep -E '(X-|Content-|Referrer|Permissions)'
# Test avec Security Headers scanner
curl -s 'https://securityheaders.com/?q=votre-site.com&hide=on&followRedirects=on'
Remédiation :
- X-Content-Security-Policy pour IE legacy
- Headers custom anti-bot : X-Robots-Tag
- Documentation et maintenance des headers custom
Valeur par défaut : Headers sécurité minimaux
8.1.15 — Headers Security Testing
Niveau : 🟡 Modéré
Référence : CIS WordPress 8.15
MITRE ATT&CK : T1082
Description : Tester régulièrement la configuration des headers de sécurité avec des outils automatisés pour maintenir la posture de sécurité.
Vérification :
# Test complet avec Security Headers
curl -s 'https://securityheaders.com/?q=votre-site.com&hide=on&followRedirects=on'
# Script local headers check
curl -I https://votre-site.com | grep -E '(X-Frame|Content-Security|X-Content-Type)'
Remédiation :
- Monitoring mensuel Security Headers grade A+
- Scripts automatisés CI/CD validation headers
- Alertes changements configuration headers
- Documentation baseline headers sécurité
Valeur par défaut : Pas de monitoring headers configuré
8.1.16 — HTTP/2 Push et Security
Niveau : 🟢 Recommandé Référence : CIS WordPress 8.16 MITRE ATT&CK : T1189
Description : Configurer HTTP/2 Server Push de manière sécurisée pour éviter les attaques par empoisonnement de cache.
Vérification :
# Vérifier support HTTP/2
curl -I --http2 https://votre-site.com | grep -i 'HTTP/2'
# Test Server Push headers
curl -I --http2 https://votre-site.com | grep -i 'link.*preload'
Remédiation :
- Configurer Push sélectivement pour ressources critiques
- Éviter Push de ressources user-controllées
- Monitoring performance vs sécurité HTTP/2
Valeur par défaut : HTTP/2 Push non configuré
8.1.17 — Early Hints (103) Security
Niveau : 🟢 Recommandé
Référence : CIS WordPress 8.17
MITRE ATT&CK : T1189
Description : Configurer Early Hints de manière sécurisée pour le preloading de ressources sans compromettre la sécurité.
Vérification :
# Vérifier Early Hints support
curl -I https://votre-site.com | grep -i '103.*early'
# Test preload hints sécurisés
Remédiation :
- Early Hints uniquement pour ressources same-origin
- Valider integrity des ressources preloadées
- Monitoring impact performance vs sécurité
Valeur par défaut : Early Hints non configurés
8.1.18 — Headers Validation Pipeline
Niveau : 🟡 Modéré
Référence : CIS WordPress 8.18
MITRE ATT&CK : T1082
Description : Mettre en place un pipeline automatisé de validation des headers de sécurité dans le processus de déploiement.
Vérification :
# Script validation headers automatisé
HEADERS=("X-Frame-Options" "Content-Security-Policy" "X-Content-Type-Options")
for header in "${HEADERS[@]}"; do
curl -I https://votre-site.com | grep -i "$header" || echo "Missing: $header"
done
Remédiation :
- Intégration tests headers dans CI/CD
- Validation pre-deployment obligatoire
- Rollback automatique si headers manquants
- Dashboard monitoring headers temps réel
Valeur par défaut : Validation headers manuelle
8.1.19 — CSP Reporting et Monitoring
Niveau : 🟠 Important Référence : OWASP A03 / CIS WordPress 8.19 MITRE ATT&CK : T1189
Description : Configurer CSP reporting pour monitorer les violations et détecter les tentatives d’attaques XSS.
Vérification :
# Vérifier CSP report-uri/report-to
curl -I https://votre-site.com | grep -i 'content-security-policy.*report'
# Test violation CSP
curl 'https://votre-site.com' -H 'Content-Security-Policy: script-src 'self'; report-uri /csp-report'
Remédiation :
- Configurer report-uri endpoint :
report-uri /csp-violations - Analyser logs violations CSP régulièrement
- Alertes automatiques violations suspectes
- Ajuster politique CSP selon reports
Valeur par défaut : Pas de reporting CSP configuré
8.1.20 — Headers Bypass Prevention
Niveau : 🟠 Important
Référence : CIS WordPress 8.20
MITRE ATT&CK : T1562
Description : Empêcher le bypass des headers de sécurité via différentes méthodes (proxy, cache, redirections).
Vérification :
# Test bypass via redirections
curl -L -I https://votre-site.com/redirect-page
# Vérifier consistency headers toutes pages
curl -I https://votre-site.com/wp-admin/ | grep X-Frame-Options
curl -I https://votre-site.com/wp-login.php | grep X-Frame-Options
Remédiation :
- Headers configurés au niveau serveur (pas seulement .htaccess)
- Validation headers après redirections/proxies
- Headers always set (pas conditionnels)
- Test régulier bypass potentiels
Valeur par défaut : Possibilité bypass headers selon configuration
S10 — REST API & XML-RPC
10.1.1 — Désactivation XML-RPC
Niveau : 🔴 Critique Référence : OWASP A06 / CIS WordPress 10.1 MITRE ATT&CK : T1190
Description : Désactiver XML-RPC qui présente de nombreuses vulnérabilités et est exploité pour les attaques brute force et DDoS.
Vérification :
# Test XML-RPC activé
curl -X POST https://votre-site.com/xmlrpc.php -H 'Content-Type: text/xml' -d '<?xml version="1.0"?><methodCall><methodName>system.listMethods</methodName></methodCall>'
# Vérifier endpoint accessible
curl -I https://votre-site.com/xmlrpc.php
Remédiation :
- wp-config.php :
add_filter('xmlrpc_enabled', '__return_false'); - .htaccess :
<Files "xmlrpc.php"> Order Deny,Allow Deny from all </Files> - Plugin Wordfence pour blocage XML-RPC
Valeur par défaut : XML-RPC activé par défaut
10.1.2 — Restriction REST API WordPress
Niveau : 🟠 Important
Référence : OWASP A01 / CIS WordPress 10.2
MITRE ATT&CK : T1087
Description : Limiter l’accès à l’API REST WordPress pour empêcher l’énumération et l’accès non autorisé aux données.
Vérification :
# Test enumération utilisateurs via REST API
curl https://votre-site.com/wp-json/wp/v2/users
# Test accès endpoints sensibles
curl https://votre-site.com/wp-json/wp/v2/posts
curl https://votre-site.com/wp-json/wp/v2/media
Remédiation :
- Désactiver pour non-authentifiés :
add_filter('rest_authentication_errors', function() { return new WP_Error('rest_disabled', 'REST API disabled', array('status' => 401)); }); - Plugin REST API security pour contrôle granulaire
- Authentification requise endpoints sensibles
Valeur par défaut : API REST accessible publiquement
10.1.3 — Authentification API Sécurisée
Niveau : 🟠 Important Référence : OWASP A02 / CIS WordPress 10.3 MITRE ATT&CK : T1078
Description : Implémenter une authentification robuste pour l’API REST avec tokens sécurisés.
Vérification :
# Test authentification API
curl -H 'Authorization: Bearer invalid_token' https://votre-site.com/wp-json/wp/v2/posts
# Vérifier application passwords
wp user list --field=user_login --allow-root | xargs -I {} wp user get {} --field=user_pass --allow-root
Remédiation :
- Application Passwords WordPress 5.6+
- JWT Authentication plugin sécurisé
- API Keys avec expiration automatique
- Rate limiting par token/utilisateur
Valeur par défaut : Authentification basique cookie/session
10.1.4 — Limitation Endpoints JSON
Niveau : 🟡 Modéré Référence : CIS WordPress 10.4 MITRE ATT&CK : T1087
Description : Désactiver ou limiter les endpoints JSON exposant des informations sensibles sur l’installation WordPress.
Vérification :
# Enumérer endpoints disponibles
curl https://votre-site.com/wp-json/ | jq .
# Vérifier exposition information
curl https://votre-site.com/wp-json/wp/v2/ | jq .
curl https://votre-site.com/?rest_route=/
Remédiation :
- Whitelist endpoints nécessaires uniquement
- Plugin REST API restriction par rôle
- Masquer informations version WordPress
- Custom endpoints avec validation stricte
Valeur par défaut : Tous endpoints REST API exposés
10.1.5 — Protection Injection API
Niveau : 🔴 Critique
Référence : OWASP A03 / CIS WordPress 10.5
MITRE ATT&CK : T1190
Description : Prévenir les injections dans les paramètres API REST pour éviter l’exécution de code malveillant.
Vérification :
# Test injection SQL via API
curl -X POST https://votre-site.com/wp-json/wp/v2/posts -H 'Content-Type: application/json' -d '{"title":"Test'OR'1'='1"}'
# Test XSS via API
curl -X POST https://votre-site.com/wp-json/wp/v2/comments -d 'content=<script>alert(1)</script>'
Remédiation :
- Sanitisation stricte input API :
sanitize_text_field() - Validation types données JSON Schema
- WAF rules protection API endpoints
- Rate limiting requêtes API
Valeur par défaut : Sanitisation basique WordPress, validation limitée
10.1.6 — Audit Logs API REST
Niveau : 🟡 Modéré Référence : CIS WordPress 10.6 MITRE ATT&CK : T1087
Description : Logger toutes les activités API REST pour détecter les abus et tentatives d’intrusion.
Vérification :
# Vérifier logs API dans access logs
grep 'wp-json' /var/log/apache2/access.log | tail -20
# Analyser patterns d'usage API
awk '/wp-json/ {print $1, $7}' /var/log/apache2/access.log | sort | uniq -c
Remédiation :
- Plugin WP Activity Log avec support API REST
- Logging custom pour endpoints sensibles
- Alertes tentatives accès non autorisé API
- Dashboard monitoring usage API
Valeur par défaut : Logs basiques serveur web uniquement
10.1.7 — Rate Limiting API Avancé
Niveau : 🟠 Important
Référence : CIS WordPress 10.7
MITRE ATT&CK : T1499
Description : Implémenter un rate limiting sophistiqué pour l’API REST avec différents niveaux selon les endpoints.
Vérification :
# Test rate limiting API
for i in {1..20}; do curl -s https://votre-site.com/wp-json/wp/v2/users > /dev/null; echo "Request $i completed"; done
# Vérifier headers rate limit
curl -I https://votre-site.com/wp-json/wp/v2/posts | grep -E '(X-RateLimit|Retry-After)'
Remédiation :
- Plugin REST API rate limiting par IP/utilisateur
- Rate limit différentiel : lecture vs écriture
- Whitelist IPs de confiance (monitoring, CI/CD)
- Response headers informatifs rate limit
Valeur par défaut : Pas de rate limiting API configuré
10.1.8 — CORS API Sécurisé
Niveau : 🟠 Important Référence : OWASP A05 / CIS WordPress 10.8 MITRE ATT&CK : T1189
Description : Configurer CORS de manière restrictive pour l’API REST afin de contrôler l’accès cross-origin.
Vérification :
# Test CORS API REST
curl -H 'Origin: https://external-domain.com' -H 'Access-Control-Request-Method: POST' -X OPTIONS https://votre-site.com/wp-json/wp/v2/posts
# Vérifier headers CORS
curl -H 'Origin: https://malicious-site.com' https://votre-site.com/wp-json/wp/v2/users
Remédiation :
- Headers CORS restrictifs API :
Access-Control-Allow-Origin: https://votre-domaine.com - Validation Origin header strict
- Methods HTTP autorisées minimum nécessaire
- Credentials CORS uniquement si requis
Valeur par défaut : CORS permissif par défaut
10.1.9 — Versioning API Sécurisé
Niveau : 🟡 Modéré Référence : CIS WordPress 10.9 MITRE ATT&CK : T1190
Description : Gérer les versions d’API de manière sécurisée en désactivant les versions obsolètes vulnérables.
Vérification :
# Énumérer versions API disponibles
curl https://votre-site.com/wp-json/ | jq '.namespaces'
# Test accès versions multiples
curl https://votre-site.com/wp-json/wp/v2/users
curl https://votre-site.com/wp-json/wp/v1/users 2>/dev/null
Remédiation :
- Désactiver anciennes versions API vulnérables
- Migration forcée vers versions sécurisées
- Deprecation warnings pour versions obsolètes
- Documentation versions supportées
Valeur par défaut : Toutes versions API disponibles
10.1.10 — Chiffrement Communications API
Niveau : 🔴 Critique Référence : OWASP A02 / CIS WordPress 10.10 MITRE ATT&CK : T1040
Description : Forcer HTTPS pour toutes communications API et implémenter des mécanismes de chiffrement supplémentaires si nécessaire.
Vérification :
# Test accès API via HTTP
curl -I http://votre-site.com/wp-json/wp/v2/users
# Vérifier redirection HTTPS
curl -L -I http://votre-site.com/wp-json/
Remédiation :
- Force HTTPS pour wp-json : redirection 301
- HSTS headers pour API endpoints
- Chiffrement payload sensible (PII, payments)
- Certificate pinning pour clients API critiques
Valeur par défaut : HTTPS selon configuration générale site
10.1.11 — Validation Schema API
Niveau : 🟠 Important Référence : CIS WordPress 10.11 MITRE ATT&CK : T1190
Description : Implémenter une validation stricte des schémas JSON pour tous les endpoints API afin de prévenir les injections de données.
Vérification :
# Test validation schema avec données invalides
curl -X POST https://votre-site.com/wp-json/wp/v2/posts -H 'Content-Type: application/json' -d '{"title":123, "content":["invalid_array"]}'
# Test champs supplémentaires non autorisés
curl -X POST https://votre-site.com/wp-json/wp/v2/users -d 'malicious_field=value&user_login=test'
Remédiation :
- JSON Schema validation stricte tous endpoints
- Reject données avec champs non définis
- Type checking rigoureux (string vs int vs array)
- Sanitisation après validation schema
Valeur par défaut : Validation basique WordPress, permissive
10.1.12 — API Documentation Sécurisée
Niveau : 🟡 Modéré
Référence : CIS WordPress 10.12
MITRE ATT&CK : T1082
Description : Sécuriser la documentation API pour éviter l’exposition d’informations sensibles aux attaquants.
Vérification :
# Vérifier auto-documentation API
curl https://votre-site.com/wp-json/ | jq -r '.routes | keys[]'
# Rechercher endpoints debug/doc
curl https://votre-site.com/wp-json/wp/v2/schema
Remédiation :
- Désactiver auto-discovery API publique
- Documentation API derrière authentification
- Masquer endpoints internes/debug
- Information minimale dans responses d’erreur
Valeur par défaut : Documentation API accessible publiquement
10.1.13 — Monitoring Sécurité API
Niveau : 🟠 Important
Référence : CIS WordPress 10.13
MITRE ATT&CK : T1087
Description : Implémenter un monitoring spécialisé pour détecter les abus et attaques contre l’API REST.
Vérification :
# Analyser patterns d'usage API suspects
awk '/wp-json/ && /40[0-9]|50[0-9]/ {print $1, $9}' /var/log/apache2/access.log | sort | uniq -c | sort -nr
# Vérifier tentatives énumération massive
grep -c 'wp-json.*users' /var/log/apache2/access.log
Remédiation :
- SIEM rules spécifiques API WordPress
- Alertes anomalies trafic API (volume, patterns)
- Honeypot endpoints pour détection attaquants
- Corrélation logs API avec tentatives login
Valeur par défaut : Monitoring API limité aux logs serveur web
10.1.14 — Cache API Sécurisé
Niveau : 🟡 Modéré Référence : CIS WordPress 10.14 MITRE ATT&CK : T1565
Description : Configurer le cache API de manière sécurisée pour éviter les fuites de données et empoisonnements.
Vérification :
# Vérifier cache headers API
curl -I https://votre-site.com/wp-json/wp/v2/users | grep -E '(Cache-Control|ETag|Last-Modified)'
# Test cache avec données sensibles
curl -H 'Authorization: Bearer token123' https://votre-site.com/wp-json/wp/v2/users/me
Remédiation :
- No-cache pour endpoints avec données personnelles
- Cache keys sécurisés sans données utilisateur
- Invalidation cache automatique modifications sensibles
- Séparation cache public/privé
Valeur par défaut : Cache selon configuration générale WordPress
10.1.15 — API Gateway Integration
Niveau : 🟢 Recommandé Référence : CIS WordPress 10.15 MITRE ATT&CK : Multiple
Description : Intégrer un API Gateway pour centraliser sécurité, monitoring et contrôle d’accès à l’API WordPress.
Vérification :
# Vérifier si API accessible directement (bypass gateway)
curl -H 'Host: wordpress-backend.local' https://votre-site.com/wp-json/
# Test rate limiting via gateway vs direct
curl -I https://api-gateway.com/wordpress/wp-json/wp/v2/users
Remédiation :
- API Gateway (Kong, AWS API Gateway, Cloudflare)
- Bloquer accès direct WordPress API
- Authentication/authorization centralisée gateway
- Analytics et monitoring unifié
Valeur par défaut : API WordPress accessible directement
S11 — PARE-FEU APPLICATIF WAF
11.1.1 — Configuration Wordfence WAF
Niveau : 🟠 Important Référence : CIS WordPress 11.1 MITRE ATT&CK : T1562
Description : Déployer et configurer Wordfence comme pare-feu applicatif pour protéger contre les attaques web communes.
Vérification :
# Vérifier activation Wordfence
wp plugin list --allow-root | grep wordfence
# Test règles WAF actives
curl -I https://votre-site.com/wp-admin/admin-ajax.php -d 'action=wordfence_doScan'
# Analyser logs Wordfence
wp eval 'print_r(get_option("wordfence_version"));' --allow-root
Remédiation :
- Installation Wordfence Security plugin
- Configuration Learning Mode puis Live Traffic
- Activation Real-time IP Block List
- Tuning règles selon faux positifs
Valeur par défaut : Pas de WAF installé par défaut
11.1.2 — Protection Sucuri CloudProxy
Niveau : �� Important Référence : CIS WordPress 11.2 MITRE ATT&CK : T1562
Description : Implémenter Sucuri CloudProxy comme WAF cloud pour filtrage avancé et protection DDoS.
Vérification :
# Vérifier redirection DNS vers Sucuri
dig votre-site.com | grep -A1 'ANSWER SECTION'
# Test headers Sucuri
curl -I https://votre-site.com | grep -i sucuri
# Vérifier IP real cachée
curl -H 'Host: votre-site.com' http://IP-ORIGINE-DIRECTE
Remédiation :
- Configuration DNS pointing vers Sucuri
- Restriction accès IP origine (whitelist Sucuri)
- SSL/TLS proxy configuration
- Monitoring dashboard Sucuri
Valeur par défaut : Trafic direct vers serveur origine
11.1.3 — Cloudflare WAF Rules
Niveau : 🟠 Important
Référence : CIS WordPress 11.3
MITRE ATT&CK : T1562
Description : Configurer les règles WAF Cloudflare spécifiquement pour WordPress avec protection adaptée.
Vérification :
# Vérifier utilisation Cloudflare
curl -I https://votre-site.com | grep -i cloudflare
dig votre-site.com | grep cloudflare
# Test challenge Cloudflare
curl -A 'BadBot/1.0' https://votre-site.com/wp-login.php
Remédiation :
- Cloudflare proxy (orange cloud) activé
- WAF rules WordPress-specific activées
- Rate limiting aggressive wp-login.php
- Bot Fight Mode pour protection automatique
Valeur par défaut : DNS uniquement sans proxy Cloudflare
11.1.4 — ModSecurity Rules OWASP CRS
Niveau : 🟠 Important Référence : OWASP / CIS WordPress 11.4 MITRE ATT&CK : T1562
Description : Déployer ModSecurity avec OWASP Core Rule Set pour protection applicative au niveau serveur.
Vérification :
# Vérifier ModSecurity activé
curl -I https://votre-site.com | grep -i 'mod_security'
# Test règles OWASP CRS
curl 'https://votre-site.com/?test=<script>alert(1)</script>'
# Analyser logs ModSecurity
tail -20 /var/log/modsec_audit.log
Remédiation :
- Installation mod_security Apache/Nginx
- Déploiement OWASP CRS v3.3+
- Configuration anomaly scoring mode
- Tuning rules selon applications
Valeur par défaut : ModSecurity non installé par défaut
11.1.5 — Rate Limiting Avancé
Niveau : 🟠 Important
Référence : CIS WordPress 11.5
MITRE ATT&CK : T1499
Description : Implémenter un rate limiting sophistiqué pour différents types de requêtes et endpoints WordPress.
Vérification :
# Test rate limiting login
for i in {1..20}; do curl -X POST https://votre-site.com/wp-login.php -d 'log=test&pwd=test'; echo "Attempt $i"; done
# Test rate limiting API
for i in {1..50}; do curl https://votre-site.com/wp-json/wp/v2/users; done
# Vérifier configuration mod_evasive
Remédiation :
- mod_evasive Apache : limite requests/page/sec
- fail2ban WordPress-specific rules
- Rate limiting différentiel par endpoint
- Whitelist IPs légitimes (monitoring, CDN)
Valeur par défaut : Pas de rate limiting configuré
11.1.6 — IP Blocking et Geolocation
Niveau : 🟡 Modéré Référence : CIS WordPress 11.6 MITRE ATT&CK : T1562
Description : Bloquer les IPs malveillantes et implémenter des restrictions géographiques selon les besoins business.
Vérification :
# Vérifier GeoIP database
geoiplookup 192.168.1.1
# Test accès depuis VPN/Tor
curl --proxy socks5://127.0.0.1:9050 https://votre-site.com/wp-login.php
# Analyser logs par pays
awk '{print $1}' /var/log/apache2/access.log | sort | uniq -c | sort -nr | head -10
Remédiation :
- Plugin IP Geo Block pour WordPress
- Configuration mod_geoip Apache/Nginx
- Blocklists IP threat intelligence
- Whitelist pays autorisés si applicable
Valeur par défaut : Accès mondial sans restriction géo
11.1.7 — Bot Protection et CAPTCHA
Niveau : 🟡 Modéré
Référence : CIS WordPress 11.7
MITRE ATT&CK : T1499
Description : Détecter et bloquer les bots malveillants avec protection CAPTCHA pour formulaires sensibles.
Vérification :
# Test détection bot basique
curl -A 'curl/7.68.0' https://votre-site.com/wp-login.php
# Test sans User-Agent
curl -H 'User-Agent:' https://votre-site.com/wp-login.php
# Analyser User-Agents suspects
awk '{print $12}' /var/log/apache2/access.log | sort | uniq -c | sort -nr | head -20
Remédiation :
- reCAPTCHA v3 sur wp-login.php et formulaires
- Plugin Akismet pour anti-spam
- Challenge JavaScript pour bots simples
- Honeypot fields dans formulaires
Valeur par défaut : Pas de protection bot configurée
11.1.8 — Country/Region Blocking
Niveau : 🟡 Modéré Référence : CIS WordPress 11.8 MITRE ATT&CK : T1562
Description : Bloquer l’accès depuis certains pays ou régions présentant un risque élevé selon le profil de menace.
Vérification :
# Test GeoIP lookup pour IPs suspectes
echo '94.102.49.190' | geoiplookup # Example IP
# Analyser distribution géographique trafic
awk '{print $1}' /var/log/apache2/access.log | xargs -I {} geoiplookup {} | grep 'Country' | sort | uniq -c
# Test accès via VPN pays bloqués
Remédiation :
- Configuration mod_geoip avec blocklists pays
- Cloudflare Geographic restrictions
- Plugin WordPress IP Geo Block
- Whitelist exceptions pour partenaires internationaux
Valeur par défaut : Accès global sans restriction pays
11.1.9 — WAF Rules Customization
Niveau : 🟡 Modéré
Référence : CIS WordPress 11.9
MITRE ATT&CK : T1562
Description : Personnaliser les règles WAF selon les spécificités de l’application WordPress et réduire les faux positifs.
Vérification :
# Analyser faux positifs WAF
grep 'ModSecurity.*blocked' /var/log/apache2/error.log | tail -10
# Test règles custom WordPress
curl -X POST https://votre-site.com/wp-admin/admin-ajax.php -d 'action=custom_function&data=test'
# Vérifier whitelist patterns
Remédiation :
- Analyse logs faux positifs régulière
- Rules customization WordPress-specific
- Whitelist patterns légitimes (plugins, thèmes)
- Tuning anomaly threshold selon environnement
Valeur par défaut : Règles WAF génériques sans customization
11.1.10 — Application Layer DDoS Protection
Niveau : 🟠 Important Référence : CIS WordPress 11.10 MITRE ATT&CK : T1499
Description : Protection spécialisée contre les attaques DDoS au niveau applicatif (Layer 7) ciblant WordPress.
Vérification :
# Simuler charge applicative élevée
ab -n 10000 -c 100 https://votre-site.com/
# Test attaque slowloris
timeout 30 curl -H 'Connection: keep-alive' -H 'Keep-Alive: timeout=600' https://votre-site.com/wp-login.php &
# Monitoring ressources serveur
iostat -x 1 5
Remédiation :
- CDN avec DDoS protection (Cloudflare, AWS Shield)
- Rate limiting agressif pendant attaques
- Auto-scaling infrastructure cloud
- Cache agressif contenu statique
Valeur par défaut : Protection DDoS basique hébergeur
11.1.11 — WAF Logging et Monitoring
Niveau : 🟡 Modéré Référence : CIS WordPress 11.11 MITRE ATT&CK : T1562
Description : Configurer logging détaillé et monitoring du WAF pour analyse forensique et tuning règles.
Vérification :
# Vérifier logs WAF détaillés
tail -20 /var/log/modsec_audit.log
ls -la /var/log/wordfence/
# Analyser patterns bloqués
grep 'BLOCK' /var/log/apache2/error.log | awk '{print $NF}' | sort | uniq -c
Remédiation :
- Configuration audit logging complet WAF
- Retention logs selon politique entreprise
- Dashboard monitoring temps réel WAF
- Alertes automatiques attaques détectées
Valeur par défaut : Logging WAF basique ou absent
11.1.12 — WAF Performance Optimization
Niveau : 🟡 Modéré
Référence : CIS WordPress 11.12
MITRE ATT&CK : N/A
Description : Optimiser les performances du WAF pour minimiser l’impact sur les temps de réponse du site WordPress.
Vérification :
# Mesurer latence avec/sans WAF
time curl -s https://votre-site.com > /dev/null
# Test performance cache WAF
ab -n 100 -c 10 https://votre-site.com/wp-content/themes/theme/style.css
# Monitoring CPU usage WAF
top | grep 'mod_security\|nginx\|apache'
Remédiation :
- Cache règles WAF en mémoire
- Optimisation ordre règles (most specific first)
- Exclusion ressources statiques de certaines règles
- Load balancing avec health checks WAF
Valeur par défaut : Configuration WAF sans optimisation performance
11.1.13 — WAF Bypass Prevention
Niveau : 🟠 Important Référence : CIS WordPress 11.13 MITRE ATT&CK : T1562
Description : Empêcher les techniques de contournement du WAF par encoding, obfuscation et autres méthodes.
Vérification :
# Test bypass encoding
curl 'https://votre-site.com/?test=%3Cscript%3Ealert(1)%3C/script%3E'
# Test double encoding
curl 'https://votre-site.com/?test=%253Cscript%253E'
# Test HTTP Parameter Pollution
curl 'https://votre-site.com/?test=safe&test=<script>alert(1)</script>'
Remédiation :
- Règles WAF anti-evasion (double encoding, etc.)
- Normalisation input avant analyse
- Multiple rule engines validation
- Content inspection au niveau byte
Valeur par défaut : Techniques bypass possibles selon WAF
11.1.14 — WAF Rule Updates et Threat Intelligence
Niveau : 🟡 Modéré
Référence : CIS WordPress 11.14
MITRE ATT&CK : T1562
Description : Maintenir les règles WAF à jour avec les dernières signatures de menaces et threat intelligence.
Vérification :
# Vérifier version règles OWASP CRS
grep 'OWASP_CRS' /etc/modsecurity/crs/
# Check updates Wordfence
wp plugin update wordfence --allow-root
# Vérifier threat intelligence feeds
curl -s https://reputation.alienvault.com/reputation.data | head -10
Remédiation :
- Auto-update règles WAF quotidiennement
- Abonnement threat intelligence feeds
- Testing règles en staging avant production
- Rollback automatique si règles cassent site
Valeur par défaut : Mise à jour manuelle règles WAF
11.1.15 — WAF Integration SIEM
Niveau : 🟢 Recommandé
Référence : CIS WordPress 11.15
MITRE ATT&CK : T1562
Description : Intégrer les logs et alertes WAF dans un SIEM pour corrélation avec autres sources de sécurité.
Vérification :
# Vérifier format logs WAF pour SIEM
tail -5 /var/log/modsec_audit.log | head -1
# Test envoi logs vers SIEM
logger -p local0.info 'TEST WAF SIEM Integration'
# Vérifier parsing logs
Remédiation :
- Configuration syslog WAF vers SIEM
- Parsing et normalisation logs WAF
- Corrélation WAF avec logs auth/access
- Dashboards et alertes SIEM pour attaques WAF
Valeur par défaut : WAF standalone sans intégration SIEM
S12 — SAUVEGARDES & RESTAURATION
12.1.1 — Stratégie de Sauvegarde 3-2-1
Niveau : 🔴 Critique Référence : CIS WordPress 12.1 MITRE ATT&CK : T1485
Description : Implémenter la stratégie 3-2-1 : 3 copies des données, 2 supports différents, 1 copie hors-site pour protection optimale contre ransomware et sinistres.
Vérification :
# Vérifier sauvegardes locales
ls -la /var/backups/wordpress/ | head -10
# Test sauvegarde base de données
wp db export backup-test.sql --allow-root
# Vérifier sauvegardes distantes
aws s3 ls s3://votre-bucket-backup/ --recursive | tail -10
Remédiation :
- Plugin UpdraftPlus avec stockage cloud
- Sauvegarde locale + cloud (S3, Google Drive)
- Copie offline ou air-gapped régulière
- Tests restauration trimestriels
Valeur par défaut : Pas de stratégie sauvegarde automatique
12.1.2 — UpdraftPlus Configuration Avancée
Niveau : 🟠 Important Référence : CIS WordPress 12.2 MITRE ATT&CK : T1485
Description : Configurer UpdraftPlus avec chiffrement et stockage redondant pour sauvegardes WordPress complètes.
Vérification :
# Vérifier plugin UpdraftPlus
wp plugin list --allow-root | grep updraftplus
# Analyser configuration sauvegarde
wp eval 'print_r(get_option("updraft_interval"));' --allow-root
# Test sauvegarde manuelle
wp eval 'do_action("updraft_backup_now");' --allow-root
Remédiation :
- Installation UpdraftPlus Premium pour chiffrement
- Configuration multi-destination (S3 + Google Drive)
- Planification automatique quotidienne
- Notifications email succès/échec
Valeur par défaut : Plugin sauvegarde non installé
12.1.3 — Sauvegarde Base de Données Sécurisée
Niveau : 🔴 Critique
Référence : CIS WordPress 12.3
MITRE ATT&CK : T1485
Description : Sauvegarder la base de données WordPress avec chiffrement et vérification d’intégrité.
Vérification :
# Sauvegarde DB avec wp-cli
wp db export backup-$(date +%Y%m%d).sql --allow-root
# Test restauration DB
wp db import backup-test.sql --allow-root
# Vérifier taille et intégrité
ls -lh backup-*.sql | tail -5
Remédiation :
- Scripts cron sauvegarde DB quotidienne
- Chiffrement AES-256 dumps SQL
- Checksum MD5/SHA256 pour intégrité
- Rétention 30 jours minimum
Valeur par défaut : Pas de sauvegarde DB automatique
12.1.4 — Sauvegarde Fichiers et Médias
Niveau : 🟠 Important Référence : CIS WordPress 12.4 MITRE ATT&CK : T1485
Description : Sauvegarder tous les fichiers WordPress incluant uploads, thèmes personnalisés et configurations.
Vérification :
# Sauvegarde complète fichiers
tar -czf wordpress-files-$(date +%Y%m%d).tar.gz /var/www/html/
# Sauvegarde uploads uniquement
rsync -av /var/www/html/wp-content/uploads/ /backup/uploads/
# Vérifier taille backups
du -sh /backup/* | sort -hr
Remédiation :
- rsync quotidien vers stockage distant
- Exclusion logs et cache du backup
- Compression et chiffrement archives
- Monitoring espace disque backups
Valeur par défaut : Sauvegarde fichiers manuelle uniquement
12.1.5 — Test de Restauration Régulier
Niveau : 🔴 Critique Référence : CIS WordPress 12.5 MITRE ATT&CK : T1485
Description : Tester régulièrement les procédures de restauration pour valider l’intégrité et la récupérabilité des sauvegardes.
Vérification :
# Test restauration en staging
wp db import latest-backup.sql --allow-root --url=staging.votre-site.com
# Vérification intégrité site restauré
curl -I https://staging.votre-site.com
# Test fonctionnalités critiques post-restauration
Remédiation :
- Environnement staging dédié tests restauration
- Procédure documentée restauration complète
- Tests mensuels automatisés
- Métriques RTO/RPO définies et mesurées
Valeur par défaut : Pas de test restauration systématique
12.1.6 — Sauvegarde Hors-Site Sécurisée
Niveau : 🟠 Important
Référence : CIS WordPress 12.6
MITRE ATT&CK : T1485
Description : Maintenir des copies de sauvegarde géographiquement séparées et sécurisées contre accès non autorisé.
Vérification :
# Vérifier synchronisation cloud
aws s3 sync /local/backups/ s3://backup-bucket-remote/wordpress/ --dry-run
# Test accès sauvegarde distante
aws s3 ls s3://backup-bucket-remote/wordpress/ | tail -10
# Vérifier chiffrement en transit/repos
Remédiation :
- Réplication multi-région (EU + US par exemple)
- Chiffrement client-side avant upload cloud
- Access controls stricts buckets S3
- Versioning et lifecycle policies
Valeur par défaut : Sauvegardes locales uniquement
12.1.7 — Rétention et Archivage
Niveau : 🟡 Modéré Référence : CIS WordPress 12.7 MITRE ATT&CK : T1485
Description : Définir et implémenter une politique de rétention des sauvegardes avec archivage long terme conforme aux exigences légales.
Vérification :
# Analyser âge des sauvegardes
find /backup/ -name '*.sql' -type f -mtime +30 | wc -l
# Vérifier politique lifecycle S3
aws s3api get-bucket-lifecycle-configuration --bucket backup-bucket
# Monitoring espace stockage utilisé
Remédiation :
- Rétention 7 quotidiennes + 4 hebdomadaires + 12 mensuelles
- Archivage long terme (Glacier/Deep Archive)
- Purge automatique selon politique
- Documentation légale rétention
Valeur par défaut : Accumulation sauvegardes sans politique rétention
12.1.8 — Chiffrement Sauvegardes
Niveau : 🔴 Critique Référence : OWASP A02 / CIS WordPress 12.8 MITRE ATT&CK : T1485
Description : Chiffrer toutes les sauvegardes avec des algorithmes robustes pour protéger les données sensibles.
Vérification :
# Test chiffrement sauvegarde DB
wp db export - --allow-root | openssl aes-256-cbc -e -k 'password123' > encrypted-backup.sql.enc
# Vérifier déchiffrement
openssl aes-256-cbc -d -k 'password123' -in encrypted-backup.sql.enc > decrypted.sql
# Test intégrité post-déchiffrement
diff backup-original.sql decrypted.sql
Remédiation :
- AES-256 chiffrement pour toutes sauvegardes
- Gestion clés sécurisée (HSM, KMS)
- Chiffrement en transit ET au repos
- Rotation clés chiffrement annuelle
Valeur par défaut : Sauvegardes non chiffrées
12.1.9 — Sauvegarde Incrémentielle
Niveau : 🟡 Modéré
Référence : CIS WordPress 12.9
MITRE ATT&CK : T1485
Description : Implémenter sauvegardes incrémentales pour optimiser espace stockage et temps de sauvegarde.
Vérification :
# Sauvegarde incrémentale avec rsync
rsync -av --link-dest=/backup/full-backup/ /var/www/html/ /backup/incremental-$(date +%Y%m%d)/
# Vérifier gains espace disque
du -sh /backup/*/ | sort -hr
# Test restauration point dans le temps
Remédiation :
- Full backup hebdomadaire + incrémentales quotidiennes
- Plugin BackWPup avec support incrémental
- Monitoring chaîne dépendances sauvegardes
- Tests restauration combinée full+incrémental
Valeur par défaut : Sauvegardes complètes uniquement
12.1.10 — Monitoring Sauvegardes
Niveau : 🟠 Important Référence : CIS WordPress 12.10 MITRE ATT&CK : T1485
Description : Surveiller le statut des sauvegardes avec alertes en cas d’échec pour garantir continuité de service.
Vérification :
# Vérifier logs sauvegardes
tail -20 /var/log/backup.log
# Status dernière sauvegarde UpdraftPlus
wp eval 'print_r(get_option("updraft_last_backup"));' --allow-root
# Test notification échec
echo 'BACKUP FAILED' | mail -s 'ALERT: Backup Failed' admin@votre-site.com
Remédiation :
- Monitoring 24/7 statut sauvegardes
- Alertes email/SMS échecs sauvegarde
- Dashboard temps réel statut backups
- Escalade automatique si problème persistant
Valeur par défaut : Pas de monitoring automatique sauvegardes
12.1.11 — Documentation Procédures Restauration
Niveau : 🟡 Modéré Référence : CIS WordPress 12.11 MITRE ATT&CK : T1485
Description : Maintenir une documentation détaillée et à jour des procédures de restauration pour différents scénarios de sinistre.
Vérification :
# Vérifier documentation existante
ls -la /docs/backup-restore/
# Test procédure pas-à-pas
cat /docs/disaster-recovery-wordpress.md
# Validation runbook restauration
Remédiation :
- Runbook détaillé restauration complète
- Procédures spécialisées : DB only, files only, etc.
- Contact escalade et responsabilités
- Mise à jour documentation après chaque test
Valeur par défaut : Documentation procédures basique ou absente
12.1.12 — Plan de Continuité d’Activité (PCA)
Niveau : 🟠 Important Référence : CIS WordPress 12.12 MITRE ATT&CK : T1485
Description : Élaborer un plan de continuité d’activité complet incluant WordPress dans la stratégie de reprise après sinistre.
Vérification :
# Test bascule vers site de secours
dig backup.votre-site.com
# Vérifier RTO/RPO actuels
time wp db import large-backup.sql --allow-root
# Test communication crisis
Remédiation :
- Site de secours avec données synchronisées
- RTO < 4h, RPO < 1h pour sites critiques
- Procédures communication crisis
- Training équipe sur PCA régulier
Valeur par défaut : Pas de PCA formalisé
12.1.13 — Backup Immutable (WORM)
Niveau : 🟢 Recommandé Référence : CIS WordPress 12.13 MITRE ATT&CK : T1485
Description : Implémenter sauvegardes immutables (Write-Once-Read-Many) pour protection contre ransomware et modification malveillante.
Vérification :
# Vérifier Object Lock S3
aws s3api get-object-lock-configuration --bucket backup-immutable
# Test tentative suppression backup immutable
aws s3 rm s3://backup-immutable/wordpress-backup-20240401.sql
# Vérifier rétention forcée
Remédiation :
- S3 Object Lock ou équivalent cloud
- Rétention minimale 30 jours immutable
- Accès backup immutable restreint
- Monitoring tentatives modification backups
Valeur par défaut : Sauvegardes modifiables/supprimables
12.1.14 — Cross-Region Backup Replication
Niveau : 🟡 Modéré
Référence : CIS WordPress 12.14
MITRE ATT&CK : T1485
Description : Répliquer sauvegardes dans différentes régions géographiques pour protection contre sinistres majeurs.
Vérification :
# Vérifier réplication cross-region
aws s3api get-bucket-replication --bucket backup-primary
# Test accès backup région secondaire
aws s3 ls s3://backup-secondary-region/wordpress/ --region eu-west-1
# Monitoring lag réplication
Remédiation :
- Réplication automatique S3 Cross-Region
- Monitoring lag réplication < 1h
- Test failover vers région secondaire
- Coûts optimisés avec Intelligent Tiering
Valeur par défaut : Sauvegardes région unique
12.1.15 — Backup Security Hardening
Niveau : 🟠 Important Référence : CIS WordPress 12.15 MITRE ATT&CK : T1485
Description : Durcir la sécurité des systèmes et processus de sauvegarde pour éviter leur compromission.
Vérification :
# Vérifier permissions fichiers backup
ls -la /backup/ | awk '{print $1, $3, $4, $9}'
# Test accès non autorisé backups
su -c 'cat /backup/database.sql' backup-user 2>&1
# Audit trail accès sauvegardes
Remédiation :
- Comptes service dédiés sauvegardes avec privilèges minimums
- Chiffrement clés stockage séparé
- Audit logs accès sauvegardes
- Network segmentation infrastructure backup
Valeur par défaut : Sécurité basique infrastructure backup
S13 — MISES À JOUR & MAINTENANCE
13.1.1 — Auto-Update WordPress Core
Niveau : 🔴 Critique Référence : CIS WordPress 13.1 MITRE ATT&CK : T1190
Description : Activer les mises à jour automatiques pour le core WordPress afin de corriger rapidement les vulnérabilités de sécurité.
Vérification :
# Vérifier version WordPress actuelle
wp core version --allow-root
# Check updates disponibles
wp core check-update --allow-root
# Vérifier auto-updates activés
wp eval 'print_r(get_option("auto_update_core_major"));' --allow-root
Remédiation :
- wp-config.php :
define('WP_AUTO_UPDATE_CORE', true); - Notifications email updates automatiques
- Environnement staging pour tests pré-production
- Rollback plan en cas de problème
Valeur par défaut : Auto-updates mineures uniquement
13.1.2 — Gestion Plugins et Thèmes
Niveau : 🟠 Important Référence : CIS WordPress 13.2 MITRE ATT&CK : T1190
Description : Maintenir plugins et thèmes à jour avec processus de validation et rollback en cas d’incompatibilité.
Vérification :
# Lister plugins avec updates disponibles
wp plugin list --allow-root --format=table --fields=name,status,version,update_version
# Check vulnérabilités plugins
wpscan --url https://votre-site.com --enumerate vp --plugins-detection aggressive
Remédiation :
- Auto-update plugins critiques sécurité
- Tests staging avant updates plugins majeurs
- Inventory plugins avec priorités update
- Suppression plugins inutilisés régulière
Valeur par défaut : Updates manuelles plugins/thèmes
13.1.3 — Environnement Staging
Niveau : 🟠 Important
Référence : CIS WordPress 13.3
MITRE ATT&CK : T1190
Description : Maintenir environnement staging pour tester updates et changements avant déploiement production.
Vérification :
# Vérifier synchronisation staging
rsync -av --dry-run /var/www/html/ staging.votre-site.com:/var/www/html/
# Test updates en staging
wp core update --allow-root --url=staging.votre-site.com
# Validation fonctionnelle staging
curl -I https://staging.votre-site.com
Remédiation :
- Environnement staging identical production
- Synchronisation données régulière (anonymisées)
- Tests automatisés post-update staging
- Pipeline CI/CD staging → production
Valeur par défaut : Pas d’environnement staging dédié
13.1.4 — Rollback et Versioning
Niveau : 🟡 Modéré Référence : CIS WordPress 13.4 MITRE ATT&CK : T1190
Description : Capacité de rollback rapide en cas de problème avec les mises à jour WordPress ou plugins.
Vérification :
# Simuler rollback WordPress
wp core download --version=6.4.2 --force --allow-root
# Test rollback plugin
wp plugin deactivate problematic-plugin --allow-root
# Vérifier snapshots disponibles
ls -la /snapshots/pre-update/
Remédiation :
- Snapshots automatiques avant chaque update
- Plugin WP Rollback ou similaire
- Git versioning pour thèmes/plugins custom
- Documentation procédure rollback
Valeur par défaut : Pas de mécanisme rollback automatique
13.1.5 — Monitoring Vulnérabilités
Niveau : 🟠 Important Référence : OWASP / CIS WordPress 13.5 MITRE ATT&CK : T1190
Description : Surveiller activement les bases de vulnérabilités pour WordPress, plugins et thèmes installés.
Vérification :
# Scanner vulnérabilités avec WPScan
wpscan --url https://votre-site.com --enumerate vp,vt --api-token YOUR_TOKEN
# Vérifier dernière date scan
cat /var/log/wpscan.log | tail -5
# Monitoring CVE WordPress
curl -s 'https://cve.circl.lu/api/search/wordpress' | jq '.[] | {id: .id, summary: .summary}' | head -5
Remédiation :
- Scan automatique quotidien vulnérabilités
- Abonnement alertes sécurité WordPress.org
- Intégration SIEM alertes CVE critiques
- Priorisation patches selon CVSS score
Valeur par défaut : Monitoring vulnérabilités manuel
13.1.6 — Changelog Review Process
Niveau : 🟡 Modéré
Référence : CIS WordPress 13.6
MITRE ATT&CK : T1190
Description : Processus de revue des changelogs avant application des mises à jour pour identifier les impacts potentiels.
Vérification :
# Review changelog WordPress
wp core check-update --allow-root | grep -A5 'Update available'
# Analyser changelog plugin critique
curl -s https://wordpress.org/plugins/wordfence/changelog/
# Documentation impacts connus
Remédiation :
- Revue systématique changelogs avant update
- Tests spécifiques fonctionnalités impactées
- Communication équipe changements importants
- Validation business impact updates
Valeur par défaut : Updates sans revue préalable changelogs
13.1.7 — Maintenance Windows Planning
Niveau : 🟡 Modéré Référence : CIS WordPress 13.7 MITRE ATT&CK : N/A
Description : Planifier fenêtres de maintenance pour updates critiques avec communication appropriée.
Vérification :
# Planifier maintenance mode
wp maintenance-mode activate --allow-root
# Test page maintenance personnalisée
curl https://votre-site.com/ | grep 'maintenance'
# Vérifier notifications utilisateurs
Remédiation :
- Fenêtres maintenance planifiées heures creuses
- Page maintenance informative et branded
- Communication préalable utilisateurs/clients
- Rollback plan si problème durant maintenance
Valeur par défaut : Updates sans planification maintenance
13.1.8 — Health Checks Post-Update
Niveau : 🟠 Important Référence : CIS WordPress 13.8 MITRE ATT&CK : T1190
Description : Vérifications automatisées post-update pour valider fonctionnement correct du site.
Vérification :
# Health check WordPress intégré
wp eval 'print_r(wp_get_site_health_data());' --allow-root
# Test fonctionnalités critiques
curl -I https://votre-site.com/wp-login.php
curl -I https://votre-site.com/wp-admin/
# Monitoring erreurs logs
tail -20 /var/log/apache2/error.log | grep -i error
Remédiation :
- Scripts automatisés health check post-update
- Tests fonctionnels critiques (login, checkout, etc.)
- Monitoring métriques performance
- Alertes automatiques si problèmes détectés
Valeur par défaut : Validation manuelle post-update
13.1.9 — Dependencies Management
Niveau : 🟡 Modéré Référence : CIS WordPress 13.9 MITRE ATT&CK : T1190
Description : Gérer dépendances entre plugins/thèmes pour éviter conflits lors des mises à jour.
Vérification :
# Analyser dépendances plugins
wp plugin list --allow-root --format=json | jq '.[].name'
# Test désactivation plugin avec dépendances
wp plugin deactivate parent-plugin --allow-root
# Vérifier conflicts connus
Remédiation :
- Matrice compatibilité plugins/thèmes
- Tests dépendances en staging
- Updates séquentielles selon dépendances
- Documentation dependencies critiques
Valeur par défaut : Pas de gestion formelle dépendances
13.1.10 — Emergency Security Updates
Niveau : 🔴 Critique
Référence : CIS WordPress 13.10
MITRE ATT&CK : T1190
Description : Procédure accélérée pour deployment emergency de patches sécurité critiques.
Vérification :
# Simulation update emergency
wp core update --version=latest --force --allow-root
# Test hotfix plugin sécurité
wp plugin update wordfence --allow-root
# Validation sécurité post-emergency update
wpscan --url https://votre-site.com --no-banner
Remédiation :
- Procédure emergency bypass processus normal
- Contacts escalade 24/7 pour urgences sécurité
- Tests minimums mais suffisants en urgence
- Communication post-emergency update
Valeur par défaut : Pas de procédure emergency formalisée
13.1.11 — Automated Testing Pipeline
Niveau : 🟢 Recommandé Référence : CIS WordPress 13.11 MITRE ATT&CK : T1190
Description : Pipeline automatisé de tests pour validation des updates avant déploiement production.
Vérification :
# Lancer suite tests automatisés
./run-wordpress-tests.sh
# Vérifier résultats tests CI/CD
curl -H 'Authorization: token' https://api.github.com/repos/owner/repo/actions/runs
# Tests performance post-update
ab -n 100 -c 10 https://staging.votre-site.com/
Remédiation :
- Tests unitaires plugins/thèmes custom
- Tests intégration fonctionnalités critiques
- Tests performance et sécurité automatisés
- Gate qualité avant promotion production
Valeur par défaut : Tests manuels uniquement
13.1.12 — Update Notifications Management
Niveau : 🟡 Modéré
Référence : CIS WordPress 13.12
MITRE ATT&CK : T1190
Description : Gérer notifications updates pour éviter spam tout en maintenant visibilité sur sécurité.
Vérification :
# Vérifier notifications configurées
wp eval 'print_r(get_option("admin_email"));' --allow-root
# Test notification update
wp plugin update --dry-run --allow-root
# Analyser historique notifications
grep 'WordPress.*update' /var/log/mail.log | tail -10
Remédiation :
- Notifications sécurité uniquement (pas features)
- Dashboard centralisé statut updates
- Escalade automatique updates critiques non appliquées
- Filtrage notifications selon criticité
Valeur par défaut : Toutes notifications updates envoyées
13.1.13 — Long-Term Support Planning
Niveau : 🟡 Modéré Référence : CIS WordPress 13.13 MITRE ATT&CK : T1190
Description : Planifier migration vers versions LTS et fin de support pour composants WordPress.
Vérification :
# Vérifier version PHP et support
php -v | head -1
# Check EOL WordPress version
curl -s https://endoflife.date/api/wordpress.json | jq '.[0]'
# Analyser plugins EOL
wp plugin list --allow-root --format=table
Remédiation :
- Calendrier migration versions PHP/WordPress LTS
- Audit régulier plugins abandonnés
- Plan remplacement composants EOL
- Budget maintenance préventive
Valeur par défaut : Updates réactives sans planification LTS
13.1.14 — Maintenance Documentation
Niveau : 🟡 Modéré
Référence : CIS WordPress 13.14
MITRE ATT&CK : N/A
Description : Documentation complète des procédures de maintenance et historique des changements.
Vérification :
# Vérifier documentation maintenance
ls -la /docs/maintenance/
# Historique updates dans git
git log --oneline | grep -i 'update\|upgrade' | head -10
# Change log applicatif
cat CHANGELOG.md | head -20
Remédiation :
- Runbook maintenance détaillé et à jour
- Historique changements avec impacts
- Procédures rollback documentées
- Knowledge base équipe maintenance
Valeur par défaut : Documentation maintenance basique
13.1.15 — Maintenance Automation
Niveau : 🟢 Recommandé
Référence : CIS WordPress 13.15
MITRE ATT&CK : T1190
Description : Automatiser tâches maintenance répétitives tout en maintenant contrôle humain sur changements critiques.
Vérification :
# Vérifier tâches cron maintenance
crontab -l | grep -E '(wp-cli|update|backup)'
# Status automation scripts
systemctl status wordpress-maintenance.service
# Logs automation maintenance
journalctl -u wordpress-maintenance --since yesterday
Remédiation :
- Scripts automation updates non-critiques
- Human approval pour changes majeurs
- Monitoring automation avec alertes échec
- Rollback automatique si problème détecté
Valeur par défaut : Maintenance manuelle sans automation
🎯 KPI ET MÉTRIQUES SÉCURITÉ
Indicateurs de Performance
- Temps de mise à jour : < 24h pour correctifs critiques
- Couverture 2FA : 100% comptes administrateurs
- Taux conformité : > 95% contrôles critiques
- MTTR incidents : < 4h pour incidents critiques
- Fréquence audits : Trimestriel minimum
- Formation équipe : 2 sessions/an minimum
Métriques Techniques
- Vulnérabilités ouvertes : 0 critiques, < 5 moyennes
- Tentatives intrusion : Monitoring 24/7
- Disponibilité : > 99.9% (SLA)
- Performance : < 3s temps de chargement
- Backup RTO : < 4h
- Backup RPO : < 1h
🚨 CONTACTS D’URGENCE
Équipe Sécurité ANC
- RSSI : rssi@anc-consulting.com / +33 1 XX XX XX XX
- Analyste SOC : soc@anc-consulting.com / +33 1 XX XX XX XX
- Support 24/7 : urgence@anc-consulting.com / +33 1 XX XX XX XX
Prestataires Externes
- Hébergeur : support@hosting.com
- Registrar : admin@domain-registrar.com
- CDN/WAF : security@cloudflare.com
- Backup : restore@backup-service.com
📖 RESSOURCES COMPLÉMENTAIRES
Documentation Officielle
Outils Recommandés
- WPScan : Scanner de vulnérabilités WordPress
- Sucuri SiteCheck : Scanner malware en ligne
- Qualys SSL Labs : Test configuration SSL
- Security Headers : Analyse headers HTTP
Formation Continue
- WordPress Security Course (Wordfence University)
- OWASP WebGoat : Plateforme d’apprentissage
- SANS SEC542 : Web Application Penetration Testing
📝 CHANGELOG
Version 1.0 - 04/04/2026
- Version initiale du checklist
- 280+ contrôles de sécurité
- Mapping OWASP Top 10 2021
- Intégration MITRE ATT&CK
- Roadmap de remédiation
⚖️ MENTIONS LÉGALES
Copyright © 2026 AYI NEDJIMI CONSULTANTS (ANC)
Ce document est confidentiel et propriétaire. Toute reproduction, distribution ou utilisation sans autorisation écrite d’ANC est strictement interdite.
Limitation de responsabilité : Ce checklist est fourni à titre informatif. ANC ne garantit pas l’exhaustivité ou l’adéquation pour tous les environnements. Une analyse spécifique reste nécessaire.
Contact : contact@anc-consulting.com | www.anc-consulting.com
FIN DU DOCUMENT - CHECKLIST SÉCURITÉ WORDPRESS ANC v1.0
Toutes nos checklists sécurité
Retrouvez l'ensemble de nos 11 checklists d'audit et de durcissement professionnelles.
Voir toutes les checklists