
Python CLI जो CVE-2026-90907 का पता लगाता और शोषण करता है, जो Joomla! com_users में एक authorization bypass है जिससे बिना प्रमाणीकरण के खाता निर्माण संभव होता है; गैर-विनाशकारी check मोड के साथ-साथ PoC भी।
केवल अधिकृत सुरक्षा परीक्षण के लिए। उन सिस्टमों के विरुद्ध exploit मोड चलाना जिनका आप स्वामी नहीं हैं या जिनके परीक्षण के लिए आपके पास स्पष्ट लिखित अनुमति नहीं है, अवैध है। डिफ़ॉल्ट मोड (
CHECK) गैर-विनाशकारी है और कुछ भी नहीं बनाता।
CLI टूल जो CVE-2026-90907 का पता लगाता है और (वैकल्पिक रूप से, -U के साथ) exploit करता है, जो Joomla! CMS कोर में एक मध्यम-गंभीरता प्राधिकरण बायपास (CVSS 6.9) है जो एक अप्रमाणित रिमोट हमलावर को com_users → profile.save कंट्रोलर के माध्यम से अनधिकृत उपयोगकर्ता खाता निर्माण को ट्रिगर करने की अनुमति देता है — तब भी जब Global Configuration में सार्वजनिक पंजीकरण अक्षम हो।
| फ़ील्ड | मान |
|---|---|
| CVE ID | CVE-2026-90907 |
| गंभीरता | मध्यम — CVSS 6.9 |
| प्रकार | प्राधिकरण बायपास / अनुचित पहुँच नियंत्रण (CWE-862) |
| घटक | com_users घटक, profile.save कार्य |
| हमला वेक्टर | रिमोट, अप्रमाणित, समान-सत्र दो-चरणीय POST |
| इसमें ठीक किया गया | Joomla! 5.4.9 और 6.1.4 (सुरक्षा रिलीज़, 2026-09-29) |
Joomla! सुरक्षा बुलेटिन (2026-09-29) और सार्वजनिक सलाहकार स्रोतों के अनुसार:
Joomla! 3.x भी प्रभावित है लेकिन End-of-Life है: इसे आधिकारिक पैच नहीं मिलेगा — माइग्रेशन की योजना बनाएँ। टूल का संस्करण बैनर जाँच सूचनात्मक है; निर्णय व्यवहार-आधारित है (नीचे देखें)।
हमलावर-नियंत्रित खाता एक निम्न-विशेषाधिकार वाला फ्रंट-एंड खाता है जिसके पास कोई प्रशासनिक या बैकएंड पहुँच नहीं है। फिर भी यह हमलावर को निम्नलिखित करने की अनुमति देता है:
ProfileModel::save() केवल तब $data['username'] को unset() करता है जब उपयोगकर्ता नाम अनुरूप माना जाता है। isUsernameCompliant उपयोगकर्ता स्थिति com_users.edit.profile.data से प्राप्त होता है, जिसे कंट्रोलर पूर्ण अनुरोध से भरता है जब फ़ॉर्म सत्यापन विफल होता है। कंट्रोलर आने वाले अनुरोध की लॉगिन स्थिति को सत्यापित करने में भी विफल रहता है। इसलिए, एक अतिथि सत्र के भीतर:
privacyconsent के बिना POST → सत्यापन विफल → गंदा उपयोगकर्ता नाम सत्र उपयोगकर्ता स्थिति में बना रहता है (अभी तक कुछ भी नहीं बनाया गया)।jform[privacyconsent][privacy]=1 के साथ पुनः सबमिट करें → unset() गार्ड छोड़ दिया जाता है → INSERT INTO #__users → user_id > 0 के साथ 303 रीडायरेक्ट।user.login POST करें (फ़ील्ड नाम password है, passwd नहीं) और फ़्लैश संदेश पढ़ें: सही → "you cannot access the private section" (प्रमाणीकरण ठीक, ACL अवरुद्ध) / गलत → "do not match"। विभेद ही साक्ष्य है।git clone https://github.com/aorozco-sys/CVE-2026-90907.git
cd CVE-2026-90907
pip install -r requirements.txt # only dependency: requests
# 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
| फ़्लैग | विवरण |
|---|---|
TARGET | बेस URL (सामान्यीकृत; कोई ट्रेलिंग स्लैश नहीं) |
-U/--username | EXPLOIT मोड सक्षम करता है। -U के बिना → गैर-विनाशकारी CHECK |
-P/--password | डिफ़ॉल्ट: secrets से उत्पन्न, 16 अक्षर अल्फ़ान्यूमेरिक+प्रतीक, हमेशा प्रिंट होता है |
-E/--email | डिफ़ॉल्ट: <username>@example.invalid |
-N/--name | डिफ़ॉल्ट: CVE Audit |
-o/--output | साक्ष्य निर्देशिका (डिफ़ॉल्ट cwd के अंतर्गत evidence_cve90907_<ts>) |
--proxy URL | अनुरोधों के लिए प्रॉक्सी (Burp: http://127.0.0.1:8080) |
--timeout | डिफ़ॉल्ट 20 s |
--ua | User-Agent (डिफ़ॉल्ट cve-2026-90907-audit/1.0) |
--no-verify-login | लॉगिन डिफ़रेंशियल छोड़ता है (exploit मोड) |
--verify-ssl | TLS सत्यापित करें (डिफ़ॉल्ट: सत्यापित न करें) |
--no-color | कोई ANSI रंग नहीं |
-v/--verbose | stderr पर पूर्ण req/resp लॉग |
| कोड | अर्थ |
|---|---|
0 | ठीक / भेद्य नहीं / अज्ञात |
1 | भेद्य (check में LIKELY, exploit में CONFIRMED) |
2 | परिचालन त्रुटि (नेटवर्क, निर्भरता, आदि) |
Location में profile के साथ 303, लॉगिन पर रीडायरेक्ट नहीं) + सत्यापन-त्रुटि
फ़्लैश (जैसे गोपनीयता-नीति आवश्यक संदेश)। निश्चित पुष्टि =
exploit मोड।summary.json में सूचीबद्ध होती हैं।user_id > 0 के साथ Location।प्रत्येक रन एक टाइमस्टैम्प वाली -o निर्देशिका लिखता है जिसमें 00_token.txt,
01_version.txt, 02_w1_seed.txt, 03_w2_exploit.txt,
04_login_correct.txt, 05_login_wrong.txt और summary.json होते हैं। प्रत्येक फ़ाइल
पूर्ण REQUEST (method/URL/key headers/body), RESPONSE (status,
Location, Server, निकाला गया फ़्लैश, body के पहले 500 बाइट्स) और ISO
टाइमस्टैम्प रिकॉर्ड करती है — पेंटेस्ट रिपोर्ट से संलग्न करने के लिए तैयार।
privacyconsent नहीं भेजता और एक गैर-अनुरूप
उपयोगकर्ता नाम (probe()) का उपयोग करता है: सहेजना फ़ॉर्म नियमों पर विफल होता है और कुछ भी स्थायी नहीं होता।user_id > 0 लौटाया (ऐसा नहीं होना चाहिए), तो exploit
मोड W2 से पहले निरस्त हो जाता है।user_usergroup_map पंक्ति को भी हटा देता है)।MIT — देखें LICENSE।