Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Submit
ToolsExploitsBlog
Submit

Hacking, PenTest, and Cybersecurity Tools for Your Security Arsenal!

Kitploit is a directory of hacking, cybersecurity, and pentesting tools. Discover the latest project updates to find vulnerabilities, analyze systems, automate testing, and strengthen your security.

FeedsContactPrivacy© 2026 Kitploit

Tool Directory

Categories

View all categories
Loading categories
CVE-2026-90907 — Python CLI that detects and exploits CVE-2026-90907, a Joomla! com_users authorization bypass enabling unauthenticated account creation; non-destructive check mode plus PoC. | Kitploit
Tools/GitHubGitHub/aorozco-sys/cve-2026-90907
Authentication & AuthorizationVulnerability ScannersVulnerability AnalysisExploitationWeb Application ExploitationWeb SecurityPenetration Testing
GitHubaorozco-sys/cve-2026-90907

CVE-2026-90907

Python CLI that detects and exploits CVE-2026-90907, a Joomla! com_users authorization bypass enabling unauthenticated account creation; non-destructive check mode plus PoC.

View Repository
111 month agoNot yet reviewed

Most Popular

View all →

Discover the most used tools by our community.

Explore all tools

Browse our collection of tools

View all tools →
Share

CVE-2026-90907 — Joomla! CMS Unauthorized User Account Creation

Python Severity Fixed

FOR AUTHORIZED SECURITY TESTING ONLY. Running the exploit mode against systems you do not own or do not have explicit written permission to test is illegal. The default mode (CHECK) is non-destructive and creates nothing.

CLI tool that detects and (optionally, with -U) exploits CVE-2026-90907, a medium-severity authorization bypass (CVSS 6.9) in the Joomla! CMS core that allows an unauthenticated remote attacker to trigger unauthorized user account creation through the com_users → profile.save controller — even when public registration is disabled in Global Configuration.

Vulnerability Summary

FieldValue
CVE IDCVE-2026-90907
SeverityMedium — CVSS 6.9
TypeAuthorization bypass / improper access control (CWE-862)
Componentcom_users component, profile.save task
Attack vectorRemote, unauthenticated, same-session two-step POST
Fixed inJoomla! 5.4.9 and 6.1.4 (security release, 2026-09-29)

Affected versions

Per the Joomla! security bulletin (2026-09-29) and public advisory sources:

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

Joomla! 3.x is also affected but End-of-Life: it will not receive an official patch — plan a migration. The tool's version banner check is informational; the verdict is behavioral (see below).

Impact

The attacker-controlled account is a low-privileged front-end account with no administrative or backend access. Nevertheless this allows an attacker to:

  • Create accounts even when registration is explicitly disabled
  • Reserve usernames / email addresses
  • Trigger registration-hook plugins unexpectedly
  • Probe internal application logic as an authenticated session

Root cause

ProfileModel::save() only unset()s $data['username'] when the username is considered compliant. isUsernameCompliant is derived from the user state com_users.edit.profile.data, which the controller populates with the full request when form validation fails. The controller also fails to verify the login state of the incoming request. Therefore, within one guest session:

  1. W1 (seed) — POST with a non-compliant username and without privacyconsent → validation fails → the dirty username is persisted in session user state (nothing is created yet).
  2. W2 (exploit) — same session, re-submit with a clean username plus jform[privacyconsent][privacy]=1 → the unset() guard is skipped → INSERT INTO #__users → 303 redirect with user_id > 0.
  3. Differential login verification — POST user.login (field name is password, not passwd) with the correct vs. an incorrect password and read the flash message: correct → "you cannot access the private section" (auth OK, ACL blocks) / incorrect → "do not match". The differential is the evidence.

Installation

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

Usage

# 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

Flags

FlagDescription
TARGETBase URL (normalized; no trailing slash)
-U/--usernameEnables EXPLOIT mode. Without -U → non-destructive CHECK
-P/--passwordDefault: generated with secrets, 16 chars alnum+symbols, always printed
-E/--emailDefault: <username>@example.invalid
-N/--nameDefault: CVE Audit
-o/--outputEvidence directory (default evidence_cve90907_<ts> under cwd)
--proxy URLProxy for requests (Burp: http://127.0.0.1:8080)
--timeoutDefault 20 s
--uaUser-Agent (default cve-2026-90907-audit/1.0)
--no-verify-loginSkips the login differential (exploit mode)
--verify-sslVerify TLS (default: do not verify)
--no-colorNo ANSI colors
-v/--verboseFull req/resp log on stderr

Exit codes (CI-friendly)

CodeMeaning
0Ok / not vulnerable / unknown
1Vulnerable (LIKELY in check, CONFIRMED in exploit)
2Operational error (network, dependency, etc.)

Verdicts

  • VULNERABLE (LIKELY) — check: token OK + W1 processed anonymously (303 with profile in Location, no redirect to login) + validation-error flash (e.g. privacy-policy required message). Definitive confirmation = exploit mode.
  • NOT VULNERABLE (behavioral) — W1 redirects to login or answers 401/403/404: anonymous processing blocked.
  • UNKNOWN — missing signals (no token, unreadable version, etc.). Gaps are listed on the console and in summary.json.
  • VULNERABLE (CONFIRMED) — exploit: Location with user_id > 0 after W2.

Evidence artifacts

Each run writes a timestamped -o directory containing 00_token.txt, 01_version.txt, 02_w1_seed.txt, 03_w2_exploit.txt, 04_login_correct.txt, 05_login_wrong.txt and summary.json. Every file records the full REQUEST (method/URL/key headers/body), RESPONSE (status, Location, Server, extracted flash, first 500 bytes of body) and ISO timestamps — ready to attach to a pentest report.

Operational safety

  • CHECK mode never sends privacyconsent and uses a non-compliant username (probe()): the save fails on form rules and nothing is persisted.
  • Abort guard: if W1 ever returned user_id > 0 (it should not), exploit mode aborts before W2.
  • After a successful exploit the tool prints a cleanup warning: delete the created account via Joomla Admin → Users (this also removes the user_usergroup_map row).

Remediation

  • Upgrade production instances to Joomla! 5.4.9 or 6.1.4 immediately.
  • On sites where registration was disabled, sort backend Users by registration date and audit the default group for unrecognized accounts created before patching.

References

  • CVE-2026-90907 — NVD
  • CVE-2026-90907 — CVE.org record
  • Joomla! Security Bulletin / coordinated security release 2026-09-29 (16 fixes, incl. this one — fixed in 5.4.9 and 6.1.4)

License

MIT — see LICENSE.

Download Tool