← Tous les articles

WordPress & WooCommerce · 8 Oct 2026

Ninja Forms et WPC Product Bundles : une campagne XSS installe un administrateur invisible

Ninja Forms et WPC Product Bundles : une campagne XSS installe un administrateur invisible

Patchstack a documenté début octobre une campagne qui exploite deux failles XSS stockées : l’une dans Ninja Forms, l’autre dans WPC Product Bundles for WooCommerce. Le script injecté s’exécute dans le navigateur d’un administrateur et laisse derrière lui quatre accès indépendants, dont un compte administrateur invisible dans l’écran Utilisateurs. Supprimer l’extension vulnérable ne suffit pas.

Les deux portes d’entrée

  • WPC Product Bundles for WooCommerce jusqu’à 8.6.6 (CVE-2026-93836) : une quantité commençant par un chiffre passait la validation en gardant du code HTML, stocké dans les métadonnées de commande WooCommerce puis affiché sans échappement. Corrigé en 8.6.7 ; le changelog mentionne un autre correctif de sécurité en 8.7.3 sur l’assainissement des ID de lots.
  • Ninja Forms jusqu’à 3.15.3 (CVE-2026-94504) : les zones de texte non enrichies s’affichaient sans échappement dans l’ancien éditeur de soumissions. Corrigé en 3.15.4, qui renforce l’échappement de cet écran ; la 3.15.5 a encore durci les champs texte enrichi.

Le scénario est simple : l’attaquant passe une commande ou envoie un formulaire, puis attend qu’un administrateur consulte la commande ou la soumission. Le script, chargé depuis imgcdn1.com/fz/x.js, ne vole pas les cookies : il utilise la session de l’administrateur, récupère les nonces dans les pages d’admin et les rejoue. Les cookies HttpOnly ne protègent donc de rien ici.

Quatre accès qui survivent au nettoyage

  • un administrateur visible, créé par l’écran normal d’ajout d’utilisateur ;
  • un administrateur caché, créé par emer-run.php et masqué par une extension must-use ;
  • une URL de connexion magique avec un jeton _wplogin, liée au plus ancien administrateur du site, pas au compte caché ;
  • un gestionnaire de fichiers sans authentification, dans une fausse extension wp-smart-thumbnails, capable de déposer un second shell.

Le compte caché repose sur un fichier wp-content/mu-plugins/class-wp-query-<8 caractères hex>.php qui se branche sur pre_user_query, users_list_table_query_args et views_users : il retire l’utilisateur des requêtes et corrige même les compteurs de rôles. Un second fichier, class-wp-token-validate.php, gère la connexion magique. Les deux sont obfusqués avec une clé propre à chaque site et antidatés à la date du plus vieux fichier de la racine : chercher les fichiers récemment modifiés ne donnera rien.

Détecter une compromission

Comme le filtre agit sur WP_User_Query, ne faites pas confiance à l’écran Utilisateurs pour lister les administrateurs. Interrogez directement la base, en adaptant le préfixe de tables :

wp db query "SELECT u.ID, u.user_login, u.user_email, u.user_registered
FROM wp_users u JOIN wp_usermeta um ON um.user_id = u.ID
WHERE um.meta_key LIKE '%capabilities' AND um.meta_value LIKE '%administrator%';"

Comparez avec ce qu’affiche l’interface. Méfiez-vous des identifiants à consonance technique (support, updater, maintenance, backup) avec une adresse en @wordpress.org. Ensuite :

wp option list --search="fz_emer*"
ls -la wp-content/mu-plugins/
ls -d wp-content/plugins/wp-smart-thumbnails 2>/dev/null
grep -E "_wplogin|wp-smart-thumbnails|imgcdn1.com" /var/log/nginx/access.log*

Une option fz_emer_login_tokens signifie qu’un jeton de connexion est peut-être encore valide. Dans mu-plugins, examinez le contenu des fichiers, pas leur date. Croisez enfin les dates de création de comptes avec les moments où un administrateur a consulté des commandes ou des soumissions de formulaire.

Nettoyer pour de bon

Patchstack est clair : si le script injecté s’est exécuté dans le navigateur d’un administrateur, le site est compromis. L’ordre des opérations compte :

  • mettre à jour WPC Product Bundles et Ninja Forms vers leurs dernières versions ;
  • supprimer les comptes administrateurs non reconnus, le dossier wp-smart-thumbnails et les deux fichiers MU ;
  • supprimer les options fz_emer_done_v1 et fz_emer_login_tokens (en même temps que les fichiers MU, sinon un nouveau jeton peut être émis) ;
  • changer les mots de passe des comptes à privilèges, en particulier celui du plus ancien administrateur, et régénérer les clés de sécurité ;
  • auditer le reste des fichiers et de la base à la recherche d’un autre shell.
wp plugin update ninja-forms woo-product-bundle
wp option delete fz_emer_done_v1 fz_emer_login_tokens
wp config shuffle-salts

La régénération des clés déconnecte tout le monde, y compris l’attaquant qui aurait une session ouverte. Prévenez le client avant.

Ce qu’il faut retenir

  • Une même campagne exploite des XSS dans WPC Product Bundles (≤ 8.6.6) et Ninja Forms (≤ 3.15.3).
  • Elle laisse quatre accès, dont un administrateur caché par une extension MU : vérifiez les administrateurs en SQL, pas dans l’interface.
  • Les fichiers malveillants sont antidatés : inspectez mu-plugins par le contenu.
  • Mettre à jour l’extension ne suffit pas : supprimez les accès, changez les mots de passe et régénérez les clés.

Photo d’illustration : Carl Lender from Sunrise, USA, Wikimedia Commons, CC BY 2.0.

nettoyageNinja FormssécuritéwoocommerceXSS
Article publié sur videopardrone.fr · mis à jour le 11 Oct 2026 Lire sur videopardrone.fr ↗