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 ''; // 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安全, 暴力破解, 漏洞披露, 蓝队分析