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 行 ``` 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