| Nom du plugin | Constructeur de pages WPBakery |
|---|---|
| Type de vulnérabilité | XSS stocké |
| Numéro CVE | CVE-2025-11160 |
| Urgence | Faible |
| Date de publication CVE | 2025-10-15 |
| URL source | CVE-2025-11160 |
Constructeur de pages WPBakery <= 8.6.1 — XSS stocké dans le module JS personnalisé (CVE-2025-11160)
Résumé : Un problème de XSS stocké affecte les versions de WPBakery Page Builder jusqu'à et y compris 8.6.1. Le vecteur est le module JS personnalisé du plugin et la faille peut être exploitée par un utilisateur authentifié avec des privilèges de niveau contributeur. Le fournisseur a publié un correctif dans la version 8.7. Cet article — rédigé avec l'accent sur la clarté et la praticité d'un professionnel de la sécurité de Hong Kong — explique comment le problème fonctionne, qui est à risque, comment détecter et supprimer les charges utiles, et quelles mesures immédiates appliquer.
- Vulnérabilité : XSS stocké dans le module JS personnalisé de WPBakery
- Versions affectées : WPBakery <= 8.6.1
- Corrigé dans : WPBakery 8.7
- CVE : CVE-2025-11160
- Privilège requis : Contributeur (authentifié)
- CVSS signalé : 6.5 (dépendant du contexte)
- Impact principal : Exécution persistante de JavaScript dans les navigateurs des visiteurs et potentiellement des administrateurs (vol de cookies, redirections, défiguration persistante, pivotement)
Qu'est-ce que le XSS stocké et pourquoi cela compte pour WordPress
Le XSS stocké se produit lorsqu'un attaquant stocke du JavaScript malveillant sur le site (dans des publications, postmeta, widgets ou champs gérés par le plugin) et que le site sert ensuite ce contenu sans un encodage de sortie approprié. La charge utile s'exécute chaque fois que quelqu'un (y compris les administrateurs) consulte la page affectée.
Pourquoi les sites WordPress sont des cibles de grande valeur :
- Les pages et aperçus destinés aux administrateurs peuvent exécuter la charge utile, permettant le vol d'identifiants ou la capture de session.
- Les scripts persistants peuvent ajouter des portes dérobées, injecter du spam SEO ou effectuer des redirections et manipulations de contenu.
- Les sites avec enregistrement d'utilisateur ou flux de contributeurs sont particulièrement vulnérables car un compte à faible privilège suffit pour stocker des charges utiles.
Dans ce cas, le plugin expose un module JS personnalisé destiné à des scripts front-end légitimes ; des contraintes d'entrée et une désinfection inadéquates permettent à un contributeur de persister un script malveillant qui sera exécuté dans les navigateurs des visiteurs.
Vue d'ensemble technique : comment cette vulnérabilité WPBakery fonctionne
- Le module JS personnalisé stocke le contenu dans la base de données (shortcode, postmeta ou stockage spécifique au plugin).
- Les entrées des utilisateurs de niveau contributeur ne sont pas correctement contraintes ou désinfectées avant d'être enregistrées et ensuite rendues.
- Un contributeur malveillant peut injecter du JavaScript qui est stocké et ensuite retourné à tout visiteur qui consulte la page.
Scénarios d'attaque probables :
- Voler les cookies d'administration ou les jetons de session lorsqu'un administrateur prévisualise ou visite une page infectée, puis les exfiltrer vers un serveur externe.
- Effectuer des redirections persistantes vers des domaines d'attaquants, charger des logiciels malveillants externes ou insérer des liens de spam.
- Utiliser la manipulation du DOM pour capturer les soumissions de formulaires ou escalader vers des actions supplémentaires via l'API REST ou des appels AJAX.
Remarque : L'exploitation nécessite au moins un compte de contributeur. De nombreux sites permettent les inscriptions ou ont une vérification faible — c'est le chemin habituel pour les attaquants.
Qui est à risque ?
- Sites utilisant WPBakery Page Builder ≤ 8.6.1.
- Sites permettant l'inscription des utilisateurs ou acceptant du contenu de contributeurs non fiables.
- Blogs multi-auteurs et sites communautaires ou d'adhésion qui permettent des rôles de contributeur.
- Tout site où les administrateurs prévisualisent des pages tout en étant connectés (une pratique courante).
Même avec un CVSS modéré, un seul site exposé avec un contributeur activé peut entraîner une compromission sérieuse si un administrateur est ciblé.
Actions immédiates (premières 1 à 2 heures)
-
Confirmer la version du plugin
Tableau de bord : Plugins > Plugins installés et vérifier la version de WPBakery.
WP-CLI :
wp plugin list --format=csv | grep js_composer || wp plugin get js_composer --field=version -
Mettez à jour vers 8.7+ si vous le pouvez
Si votre licence et votre matrice de compatibilité le permettent, mettez à jour via le tableau de bord ou WP-CLI :
wp plugin update js_composer --clear-plugins-cacheSi vous ne pouvez pas mettre à jour immédiatement, appliquez un patch virtuel (voir les conseils WAF ci-dessous) pendant que vous planifiez la mise à jour.
-
Limitez temporairement l'accès des contributeurs
Supprimez ou restreignez le rôle de contributeur jusqu'à ce que vous puissiez mettre à jour et scanner. Supprimez la capacité d'ajouter des modules JS personnalisés pour les rôles à faible privilège.
- Scanner pour injecté
- Gestionnaires d'événements en ligne :
onerror=,onclick=,onload= - APIs et fonctions utilisées dans le vol/exfiltration :
document.cookie,XMLHttpRequest,fetch,new Image() - Obfuscation :
base64,eval(atob(...)), longues chaînes encodées - Changer les identifiantsPour le stockage géré par les plugins (postmeta), mettez à jour.
- Forcer les réinitialisations de mot de passevers un contenu sûr ou supprimez les lignes méta malveillantes.
- Exemple d'approche WP-CLI (à utiliser avec précaution et à vérifier avant d'exécuter) :Exemple # — adaptez à votre environnement. Cela remplace un motif malveillant spécifique.
- wp post update 123 --post_content="$(wp post get 123 --field=post_content | sed 's///g')":
- Désactivez l'inscription ouverte si elle n'est pas requise.
- : Réinitialisez les mots de passe pour tous les comptes qui ont pu être utilisés pour injecter du contenu.
- Utilisez des flux de travail basés sur l'approbation pour le contenu généré par les utilisateurs.
- Examiner les journaux du serveur: Recherchez les requêtes POST vers admin-ajax.php, les points de terminaison de l'API REST ou d'autres points de terminaison de contenu près du moment où le contenu malveillant est apparu.
- Restaurez si nécessaire: Si l'étendue de l'infection est incertaine, restaurez à partir d'une sauvegarde connue propre, mettez à jour vers la version corrigée du plugin et réintroduisez le contenu après avoir scanné.
Exemples de recherche dans la base de données (échapper soigneusement les caractères spéciaux) :
SELECT ID, post_title'
Atténuation à court terme avec un WAF géré (patching virtuel)
Si une mise à jour immédiate n'est pas possible, le patching virtuel via un pare-feu d'application Web (WAF) peut réduire l'exposition. L'objectif est de bloquer les tentatives d'exploitation et les modèles de charge utile connus jusqu'à ce que vous puissiez mettre à jour et nettoyer le site.
Exemples de règles WAF conceptuelles (implémentez via votre WAF ou passerelle) :