Kimdir01/ubilling-multi-vuln-cve

GitHub: Kimdir01/ubilling-multi-vuln-cve

针对 Ubilling ISP 计费系统的多漏洞安全审计报告,披露 160 多个严重漏洞并提供相应 PoC。

Stars: 0 | Forks: 0

# GitHub 安全公告:Ubilling — 多个严重漏洞(RCE、SSRF、XXE、路径穿越,160+ 问题) ## 公告信息 | 字段 | 值 | |-------|-------| | **严重程度** | 严重 | | **CWE** | CWE-94 (代码注入) / CWE-918 (SSRF) / CWE-611 (XXE) / CWE-22 (路径穿越) | | **CVSS v3.1** | 9.6 (幽灵模式会话劫持) / 9.5 (供应链 eval RCE) / 9.1 (路径穿越任意写入) / 9.0 (未授权文件上传 RCE) | | **CVSS Vector** | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H | ## 摘要 Ubilling(包含 1,722 个 PHP 文件,ISP 计费/CMS 系统)包含 **160 多个独立漏洞** —— 这是审计过的最严重的代码库。发现的问题包括:(1) 通过从 ubilling.net.ua 获取内容的供应链 `eval()` 后门实现的远程代码执行,(2) 通过 TraffStats 图像代理实现的未经身份验证的 SSRF,(3) 通过模板编辑器实现的导致任意文件写入/删除的路径穿越,(4) 通过消息队列实现的未经身份验证的文件上传 RCE,(5) 全部 1,722 个文件完全缺失 CSRF 保护,(6) 50 多个 XSS 攻击向量,(7) 3 个不安全的反序列化接收点,(8) 5 个 XXE 攻击向量,(9) 12 个身份验证绕过/访问控制问题。 ## 漏洞详情 ### 受影响的包/代码库 - **代码库:** Ubilling (ISP Billing CMS) - **受影响版本:** 当前版本 - **修复版本:** 无 (0-day) **提交哈希(已审计):** `82cc673b2cad5dbb1f714f59b8145083e346a8a3` ## CVE-REQUEST-001:通过更新服务器 eval() 后门实现的供应链 RCE (CVSS 9.5) **文件:** `api/libs/api.workaround.php`,第 3560 行 ``` eval(curl_exec($curlStats)); // Fetches executable PHP from ubilling.net.ua! ``` 自动更新机制从远程服务器获取 PHP 代码并将其直接传递给 `eval()`。这是一个内置后门 —— 如果更新服务器被攻破(或连接遭到 MITM 攻击),所有 Ubilling 实例都将被攻破。 ## CVE-REQUEST-002:通过 TraffStats 图像代理实现的未经身份验证的 SSRF (CVSS 9.1) **文件:** `api/libs/api.traffstats.php`,第 927-935 行 ``` $remoteImg = new OmaeUrl(base64_decode(ubRouting::get('...'))); // cURL to ANY URL — no authentication, no URL validation, follows redirects ``` 无需身份验证。无 URL 验证。无 SSL 验证。跟随重定向。 **PoC:** ``` GET /?module=traffstats&action=imgproxy&url=BASE64(http://169.254.169.254/latest/meta-data/) ``` ## CVE-REQUEST-003:路径穿越 — 任意文件写入/删除 (CVSS 9.1) **文件:** `api/libs/api.templatize.php`,第 496-497 行,433-434 行 ``` // WRITE: function zb_DocsTemplateEdit($template, $title, $body) { $edittemplateid = $template; // FROM $_GET['edittemplate'] — ZERO SANITIZATION file_put_contents($headerspath . $edittemplateid, $title); file_put_contents($templatespath . $edittemplateid, $body); } // DELETE: function zb_DocsDeleteTemplate($template) { rcms_delete_files($headerspath . $_GET['deletetemplate']); // UNSANITIZED } ``` **PoC:** ``` # 编写 PHP webshell curl "http://target/?module=pl_documents&edittemplate=../../../../var/www/html/shell.php" \ -d "edittemplatetitle=" \ -d "edittemplatebody=" ``` ## CVE-REQUEST-004:未经身份验证的文件上传 RCE (CVSS 9.0) **文件:** `api/libs/api.messagesqueue.php`,第 715-717 行 ``` move_uploaded_file($_FILES['newmailattach']['tmp_name'], $uploaddir . vf($_FILES['newmailattach']['name'])); ``` 无扩展名验证。`vf()` 阻止了用于路径穿越的 `/`,但允许任何文件扩展名。直接上传 `.php` webshell。 ## CVE-REQUEST-005:通过 GET 请求实现的幽灵模式会话劫持 (CVSS 9.6) **文件:** `modules/general/permissions/index.php`,第 553 行 ``` setcookie('ubilling_user', $adminLogin . ':' . $userData['password']); ``` 基于 GET 的操作且完全没有 CSRF 保护。攻击者可以通过单个 `` 标签劫持任何管理员会话: ``` ``` ## CVE-REQUEST-006:无 CSRF 保护 — 整个代码库 (CVSS 9.6) **文件:** `api/libs/api.astral.php`,第 34-62 行 — `wf_Form()` 函数 ``` function wf_Form($action, $method, $inputs, ...) { return '
' . $inputs . '
'; // NO CSRF TOKEN } ``` 全部 1,722 个 PHP 文件中都没有 CSRF token。每个更改状态的操作都存在跨域可利用性。 ## CVE-REQUEST-007:不安全的反序列化(3 个已确认的接收点)(CVSS 9.0) **接收点 1** — `modules/general/userreg/index.php:55`: ``` $newUserData = unserialize(base64_decode(ubRouting::post('repostdata'))); ``` **接收点 2** — `api/libs/api.universalqinq.php:545`: ``` $decode = unserialize(base64_decode($encode)); // POST input ``` **接收点 3** — `api/libs/api.deploy.php:168`: ``` @$key = unserialize($key); // XOR-obfuscated with site serial (visible on config page) ``` ## CVE-REQUEST-008:50+ 个 XSS 攻击向量(反射型 + 存储型 + DOM)(CVSS 8.7) **根本原因:** 该框架没有集中式的输出转义。`ubRouting::get()`/`post()` 默认为 `raw` 模式。`__()` 翻译函数不进行转义。所有的 `wf_*()` 表单/UI 辅助函数(70+ 个函数)在输出原始 HTML 时均未进行转义。 **严重 XSS:** - 40+ 个反射型 XSS,直接 `echo` 输出 `$_GET`/`$_POST`/`$_SERVER` 的值 - 25+ 个存储型 XSS 字段(个人资料名称、白板、工单、笔记、公告) - 10+ 个基于 DOM 的 XSS,通过 `innerHTML` 接收点和未转义的 JS 上下文(重定向、警报) ## 其他关键发现(总计 160+ 项): | 类别 | 数量 | 最高严重程度 | 关键示例 | |----------|-------|-------------|-------------| | RCE / 命令注入 | 14 | 9.5 | 通过自动更新执行 eval、群发器 shell_exec、PHP 控制台 eval | | 文件上传 / 路径穿越 | 11 | 9.1 | 模板路径穿越、未经身份验证的上传、vols 模块 | | 身份验证绕过 / 访问控制 | 12 | 9.6 | 幽灵模式、支付网关绕过、MD5 密码 | | XSS (反射型 + 存储型 + DOM) | 50+ | 8.7 | 无转义框架,70+ 个 wf_ 辅助函数存在漏洞 | | CSRF | 1,722 个文件 | 9.6 | 到处都没有 token | | 反序列化 | 3 | 9.0 | userreg、universalqinq、deploy | | XXE | 5 | 7.5 | XLSX/ODS 读取器、KML 解析器 | | SSRF | 5+ | 9.1 | TraffStats、watchdog、SMS 网关 | | IDOR | 25+ | 9.6 | 用户毁灭、幽灵模式、缺少单条记录检查 | | 信息泄露 | 7 | 7.5 | phpinfo、debug、.git、E_ALL | | 弱加密 | 4 | 7.5 | 无盐 MD5、弱 SHA1、松散比较 | ## 影响 - 通过更新服务器 eval() 后门引发**供应链入侵** - 通过 14 个 RCE 向量实现**完全接管服务器** - 通过 5 个 SSRF 向量进行**内部网络访问** - 通过 5 个 XXE 向量实现**文件泄露** - 在 3 个 POP 链接收点中**通过反序列化实现 RCE** - 通过 CSRF + 幽灵模式实现**管理员会话劫持** - 通过 50+ 个 XSS 向量实现**数据窃取** - 通过路径穿越和文件上传实现**任意文件写入** ## 补丁 / 修复 1. **紧急:** 从自动更新中移除 `eval(curl_exec(...))` —— 使用签名的 JSON 2. 为 TraffStats 图像代理添加身份验证 + URL 验证 + 阻断私有 IP 3. 在模板编辑器中使用 `basename()` 对 `$_GET['edittemplate']` 进行过滤净化 4. 为所有文件上传处理程序添加扩展名白名单 5. 为所有表单添加 CSRF token 生成/验证机制 6. 将 `unserialize()` 替换为 `json_decode()` 或添加 `allowed_classes => false` 7. 在所有 XML 解析之前添加 `libxml_disable_entity_loader(true)` 8. 实施集中式输出转义(在 wf_* 函数中自动转义) 9. 将 `ubRouting::get()/post()` 的默认值从 `raw` 更改为带有 `htmlspecialchars` 的 `callback` 10. 将 MD5/SHA1 替换为 `password_hash()` + bcrypt ## 披露时间表 - **2026-06-28:** 由 Fatullayev Asadbek (Kimdir01) 发现了全部 160 多个漏洞 - **待定:** 报告给 Ubilling 维护者 - **待定:** 请求 CVE (MITRE / TuranSec CNE) - **待定:** 发布公告 ## 致谢 - 发现者:Fatullayev Asadbek | GitHub:Kimdir01 - 独立安全研究员 ## 参考 - CWE-94:代码注入 - CWE-918:服务器端请求伪造 - CWE-22:路径穿越 - CWE-434:无限制文件上传 - CWE-502:不可信数据反序列化 - CWE-611:XML 外部实体(XXE) - CWE-352:跨站请求伪造
标签:CISA项目, ISP计费系统, PoC, Web安全, 暴力破解, 漏洞披露, 蓝队分析