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-90907 — CLI Python qui détecte et exploite CVE-2026-90907, un contournement d'autorisation dans Joomla! com_users permettant la création de comptes non authentifiés ; mode vérification non destructif plus PoC. | Kitploit
Outils/GitHubGitHub/aorozco-sys/cve-2026-90907
Authentification et AutorisationScanners de VulnérabilitésAnalyse des VulnérabilitésExploitationExploitation d'Applications WebSécurité WebTests d'Intrusion
GitHubaorozco-sys/cve-2026-90907

CVE-2026-90907

CLI Python qui détecte et exploite CVE-2026-90907, un contournement d'autorisation dans Joomla! com_users permettant la création de comptes non authentifiés ; mode vérification non destructif plus PoC.

Voir le dépôt
11il y a 1 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-90907 — Création de compte utilisateur non autorisée dans Joomla! CMS

Python Severity Fixed

POUR DES TESTS DE SÉCURITÉ AUTORISÉS UNIQUEMENT. Exécuter le mode exploit contre des systèmes que vous ne possédez pas ou pour lesquels vous ne disposez pas d'une autorisation écrite explicite de test est illégal. Le mode par défaut (CHECK) est non destructif et ne crée rien.

Outil en ligne de commande qui détecte et (facultativement, avec -U) exploite CVE-2026-90907, un contournement d'autorisation de sévérité moyenne (CVSS 6.9) dans le cœur de Joomla! CMS qui permet à un attaquant distant non authentifié de déclencher la création non autorisée de comptes utilisateur via le contrôleur com_users → profile.save — même lorsque l'inscription publique est désactivée dans la Configuration globale.

Résumé de la vulnérabilité

ChampValeur
ID CVECVE-2026-90907
SévéritéMoyenne — CVSS 6.9
TypeContournement d'autorisation / contrôle d'accès inapproprié (CWE-862)
ComposantComposant com_users, tâche profile.save
Vecteur d'attaqueDistant, non authentifié, POST en deux étapes dans la même session
Corrigé dansJoomla! 5.4.9 et 6.1.4 (version de sécurité, 2026-09-29)

Versions affectées

Selon le bulletin de sécurité Joomla! (2026-09-29) et les sources d'avis publics :

  • Joomla! 1.5.0 – 5.4.8
  • Joomla! 6.0.0 – 6.1.3

Joomla! 3.x est également affecté mais en fin de vie : il ne recevra pas de correctif officiel — prévoyez une migration. La vérification de la bannière de version de l'outil est informative ; le verdict est comportemental (voir ci-dessous).

Impact

Le compte contrôlé par l'attaquant est un compte front-end à faibles privilèges sans accès administratif ni back-end. Néanmoins, cela permet à un attaquant de :

  • Créer des comptes même lorsque l'inscription est explicitement désactivée
  • Réserver des noms d'utilisateur / adresses e-mail
  • Déclencher de manière inattendue des plugins de hook d'inscription
  • Sonder la logique interne de l'application en tant que session authentifiée

Cause racine

ProfileModel::save() ne fait unset() de $data['username'] que lorsque le nom d'utilisateur est considéré comme conforme. isUsernameCompliant est dérivé de l'état utilisateur com_users.edit.profile.data, que le contrôleur remplit avec la requête complète lorsque la validation du formulaire échoue. Le contrôleur ne parvient pas non plus à vérifier l'état de connexion de la requête entrante. Par conséquent, au sein d'une même session invité :

  1. W1 (amorçage) — POST avec un nom d'utilisateur non conforme et sans privacyconsent → la validation échoue → le nom d'utilisateur non nettoyé est conservé dans l'état utilisateur de la session (rien n'est encore créé).
  2. W2 (exploit) — même session, re-soumission avec un nom d'utilisateur propre plus jform[privacyconsent][privacy]=1 → la garde unset() est contournée → INSERT INTO #__users → redirection 303 avec user_id > 0.
  3. Vérification différentielle de connexion — POST user.login (le nom du champ est password, pas passwd) avec le mot de passe correct vs. un mot de passe incorrect et lecture du message flash : correct → « you cannot access the private section » (auth OK, ACL bloque) / incorrect → « do not match ». Le différentiel constitue la preuve.

Installation

git clone https://github.com/aorozco-sys/CVE-2026-90907.git
cd CVE-2026-90907
pip install -r requirements.txt   # only dependency: requests

Utilisation

# CHECK mode (default) — non-destructive: never sends consent, never creates an account
python3 joomla_cve_2026_90907.py https://ejemplo.com

# Verbose CHECK (full request/response log on stderr)
python3 joomla_cve_2026_90907.py https://ejemplo.com --no-color -v

# EXPLOIT mode (-U) — creates a real account in #__users (authorized targets only!)
python3 joomla_cve_2026_90907.py https://ejemplo.com \
    -U audit.user -E [email protected] -N "CVE Audit"

# Through a proxy (e.g. Burp Suite) with a custom timeout
python3 joomla_cve_2026_90907.py https://ejemplo.com -U audit.user \
    --proxy http://127.0.0.1:8080 --timeout 30

# Exploit without the differential login verification
python3 joomla_cve_2026_90907.py https://ejemplo.com -U audit.user \
    --no-verify-login

Options

OptionDescription
TARGETURL de base (normalisée ; sans barre oblique finale)
-U/--usernameActive le mode EXPLOIT. Sans -U → CHECK non destructif
-P/--passwordPar défaut : généré avec secrets, 16 caractères alphanumériques + symboles, toujours affiché
-E/--emailPar défaut : <username>@example.invalid
-N/--namePar défaut : CVE Audit
-o/--outputRépertoire de preuves (par défaut evidence_cve90907_<ts> sous le cwd)
--proxy URLProxy pour les requêtes (Burp : http://127.0.0.1:8080)
--timeoutPar défaut 20 s
--uaUser-Agent (par défaut cve-2026-90907-audit/1.0)
--no-verify-loginIgnore le différentiel de connexion (mode exploit)
--verify-sslVérifier TLS (par défaut : ne pas vérifier)
--no-colorPas de couleurs ANSI
-v/--verboseJournal complet req/resp sur stderr

Codes de sortie (compatibles CI)

CodeSignification
0Ok / non vulnérable / inconnu
1Vulnérable (LIKELY en check, CONFIRMED en exploit)
2Erreur opérationnelle (réseau, dépendance, etc.)

Verdicts

  • VULNERABLE (LIKELY) — check : token OK + W1 traité anonymement (303 avec profile dans Location, pas de redirection vers la connexion) + flash d'erreur de validation (par ex. message de politique de confidentialité requise). Confirmation définitive = mode exploit.
  • NOT VULNERABLE (behavioral) — W1 redirige vers la connexion ou répond 401/403/404 : traitement anonyme bloqué.
  • UNKNOWN — signaux manquants (pas de token, version illisible, etc.). Les lacunes sont listées sur la console et dans summary.json.
  • VULNERABLE (CONFIRMED) — exploit : Location avec user_id > 0 après W2.

Artefacts de preuve

Chaque exécution écrit un répertoire -o horodaté contenant 00_token.txt, 01_version.txt, 02_w1_seed.txt, 03_w2_exploit.txt, 04_login_correct.txt, 05_login_wrong.txt et summary.json. Chaque fichier enregistre la REQUEST complète (méthode/URL/en-têtes clés/corps), la RESPONSE (statut, Location, Server, flash extrait, 500 premiers octets du corps) et les horodatages ISO — prêt à être joint à un rapport de pentest.

Sécurité opérationnelle

  • Le mode CHECK n'envoie jamais privacyconsent et utilise un nom d'utilisateur non conforme (probe()) : l'enregistrement échoue sur les règles du formulaire et rien n'est persisté.
  • Garde-fou d'abandon : si W1 a un jour renvoyé user_id > 0 (ce qui ne devrait pas arriver), le mode exploit s'abandonne avant W2.
  • Après un exploit réussi, l'outil affiche un avertissement de nettoyage : supprimez le compte créé via Joomla Admin → Users (cela supprime également la ligne user_usergroup_map).

Remédiation

  • Mettez immédiatement à niveau les instances de production vers Joomla! 5.4.9 ou 6.1.4.
  • Sur les sites où l'inscription était désactivée, triez les utilisateurs du backend par date d'inscription et auditez le groupe par défaut pour les comptes non reconnus créés avant le correctif.

Références

Télécharger l’outil