Kimdir01/uploady-multi-vuln-cve
GitHub: Kimdir01/uploady-multi-vuln-cve
Uploady 文件管理器的多漏洞 PoC 披露报告,涵盖路径遍历任意文件写入、存储型 XSS、CSRF 及未授权文件删除等严重安全问题。
Stars: 0 | Forks: 0
# GitHub 安全公告:Uploady — 路径遍历任意文件写入、存储型 XSS、CSRF
## 公告信息
| 字段 | 值 |
|-------|-------|
| **严重程度** | 严重 / 高 |
| **CWE** | CWE-22 (路径遍历) / CWE-79 (存储型 XSS) / CWE-352 (CSRF) |
| **CVSS v3.1** | 9.0 (路径遍历文件写入) / 8.0 (存储型 XSS) / 7.5 (未授权文件删除) |
| **CVSS Vector** | AV:N/AC:H/PR:L/UI:N/S:C/C:H/I:H/A:H |
## 概述
Uploady(108 个星标,PHP 文件上传管理器)包含多个严重漏洞:(1) 图像编辑器中的路径遍历允许通过 `$_FILES['file']['name']` 进行任意文件写入;(2) 通过带有弱所有权检查的 AJAX endpoint 进行未授权文件删除;((3) 通过页面内容/翻译进行存储型 XSS,且无输出转义;(4) Admin 自定义 CSS/JS 文件写入存在 CSRF;(5) 硬编码的 MySQL root 凭据。
## 漏洞详情
### 受影响的包/仓库
- **仓库:** Uploady
- **受影响版本:** 当前版本
- **修复版本:** 无(0-day)
**Commit Hash(已审计):** `e4b4dbec0b45304b5ab01e36a1003d0c7cc613d5`
## CVE-REQUEST-001:图像编辑器中的路径遍历 / 任意文件写入 (CVSS 9.0)
**文件:** `uploady/actions/update_file.php`,第 36-95 行(操作 `edit_image`)
```
$targetFilename = $_FILES['file']['name']; // UNSANITIZED
$targetPath = $userUploadDir . '/' . $targetFilename;
if (move_uploaded_file($_FILES['file']['tmp_name'], $targetPath)) {
```
对文件名没有进行路径遍历清理。攻击者可以使用 `../../evil.jpg` 将文件写入预期上传目录之外的位置。
**PoC:**
```
curl -X POST http://target/actions/update_file.php?action=edit_image \
-b "session=VALID" \
-F "file=@polyglot.jpg;filename=../../webroot/evil.jpg"
```
唯一的保护措施是扩展名白名单(jpg,png,gif,bmp,webp,tiff,tif)和 MIME 检查。多语言文件(有效图像 + PHP payload)可以绕过这两项保护。
## CVE-REQUEST-002:未授权文件删除 + IDOR (CVSS 7.5)
**文件:** `uploady/actions/delete_file.php`,第 9-17 行
```
$fileID = $utils->sanitize($_POST['file_id']);
$userID = $utils->sanitize($_POST['user_id']);
if ($handler->fileExist($fileID) && $handler->userExist($userID)) {
// userExist() only checks if ANY file exists with that user_id
// NOT if the specific file belongs to that user!
if ($handler->deleteFile($fileID, $userID)) {
unlink(realpath("../" . UPLOAD_FOLDER . "/{$userID}/{$file->filename}"));
```
无身份验证、无 CSRF token、弱所有权检查。`userExist()` 仅检查是否存在属于该 user_id 的任何文件,而不检查特定文件是否属于该用户。
**PoC:**
```
curl -X POST http://target/actions/delete_file.php \
-d "file_id=KNOWN_FILE_ID" \
-d "user_id=ANY_EXISTING_USER_ID" # Not necessarily the owner
```
## CVE-REQUEST-003:通过页面内容引发的存储型 XSS (CVSS 8.0)
**文件:** `uploady/page.php`,第 28 行
```
= $page_content->content; ?>
```
**文件:** `uploady/src/Uploady/PageTranslation.php`,第 43-53 行
```
$this->db->bind(":title", $data['title']); // Stored raw from POST
$this->db->bind(":content", $data['content']); // Stored raw from POST
```
直接存储来自 POST 的页面标题和内容,未进行清理。输出原始数据且未使用 `htmlspecialchars()`。如果 Admin 创建了一个内容包含 `` 的页面,将会对所有访问者触发 XSS。
## CVE-REQUEST-004:Admin 自定义 CSS/JS 中的 CSRF + 任意文件写入 (CVSS 6.5)
**文件:** `uploady/admin/custom/actions/save.php`,第 6-10 行
```
if ($_POST['button'] == "css") {
file_put_contents(APP_PATH . "/assets/css/custom.css", $_POST['editor']);
}
if ($_POST['button'] == "js") {
file_put_contents(APP_PATH . "/assets/js/custom.js", $_POST['editor']);
}
```
无 CSRF token,无 admin 角色检查(仅通过 `session.php` 确认已登录,而非确认是否为 admin)。任意内容被写入到全应用范围服务的 CSS/JS 文件中。
## 其他发现(共 16 项):
| # | 漏洞 | CVSS | 类型 |
|---|--------------|------|------|
| 5 | CSRF 批量文件删除 | 7.1 | CSRF |
| 6 | CSRF 通过 GET 请求修改语言状态 | 6.1 | CSRF |
| 7 | CSRF Admin 设置(logo/favicon 上传) | 5.4 | CSRF |
| 8 | 文件下载无需认证(信息泄露) | 5.3 | 信息泄露 |
| 9 | 硬编码 MySQL root/空密码 | 5.0 | 硬编码凭据 |
| 10 | 弱 CSRF token 生成(uniqid) | 4.8 | 弱随机性 |
| 11 | API endpoint 无速率限制 | 5.0 | 缺失速率限制 |
| 13 | 通过导航栏中的网站名称引发的存储型 XSS | 3.5 | XSS |
| 16 | 不受限制地访问已上传的文件(无 .htaccess) | 3.5 | 信息泄露 |
## 影响
- 通过图像编辑器中的路径遍历进行**任意文件写入**
- 在无身份验证或所有权验证的情况下进行**文件删除**
- 通过存储的页面内容引发**影响所有用户的 XSS**
- 通过保存自定义 JS 的 CSRF 进行**全应用范围的 JS 注入**
- 在无身份验证的情况下进行**文件枚举和下载**
## 补丁 / 修复
1. 使用 `basename()` 清理 `$_FILES['file']['name']` 并拒绝 `..`
2. 在文件删除时要求身份验证 + CSRF token + 正确的所有权检查
3. 在 `page.php` 和视图中的所有输出添加 `htmlspecialchars()`
4. 为所有 Admin 操作 endpoint 添加 CSRF token
5. 添加 admin 角色验证(不仅仅是登录检查)
6. 将 CSRF token 中的 `uniqid()` 替换为 `random_bytes()`
7. 修改默认的数据库凭据
8. 为动态创建的上传目录添加 `.htaccess` 保护
9. 为 API endpoint 添加速率限制
## 披露时间线
- **2026-06-28:** 所有漏洞由 Fatullayev Asadbek (Kimdir01) 发现
- **TBD:** 报告给维护者
- **TBD:** 通过 GitHub 申请 CVE
- **TBD:** 发布公告
## 致谢
- 发现者:Fatullayev Asadbek | GitHub:Kimdir01
- 独立安全研究员
## 参考
- CWE-22:路径遍历
- CWE-79:跨站脚本攻击
- CWE-352:跨站请求伪造
- CWE-306:关键功能缺失身份验证
标签:CISA项目, OpenVAS, PHP, SQL查询, Web 安全, 漏洞 PoC