Kimdir01/notrinos-erp-multi-vuln-cve
GitHub: Kimdir01/notrinos-erp-multi-vuln-cve
针对 NotrinosERP v1.0.0 的安全审计报告,披露了包含身份验证绕过、远程代码执行、存储型 XSS 和财务逻辑缺陷在内的 76 个漏洞及相应 PoC。
Stars: 0 | Forks: 0
# GitHub 安全公告:NotrinosERP v1.0.0 — 多个严重漏洞(身份验证绕过、RCE、存储型 XSS、财务欺诈)
## 公告信息
| 字段 | 值 |
|-------|-------|
| **严重程度** | 严重 |
| **CWE** | CWE-287 (身份验证绕过) / CWE-434 (不受限制的文件上传) / CWE-79 (存储型 XSS) / CWE-841 (业务逻辑) |
| **CVSS v3.1** | 9.8 (身份验证绕过) / 9.1 (文件上传 RCE) / 9.0 (财务绕过) |
| **CVSS Vector** | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
## 摘要
NotrinosERP(包含 700 多个 PHP 文件,完整的 ERP 系统)存在 76 个漏洞,包括:(1) 通过 `$hash == md5($password)` 进行的 MD5 类型杂凑身份验证绕过,(2) 6 个导致 RCE 的不受限制的文件上传攻击向量,(3) 由于每个模块中未转义的 `label_cell()` 导致的系统性存储型 XSS,(4) 24 个可导致财务欺诈的业务逻辑缺陷,(5) 安装目录在安装后可被重复利用。
## 漏洞详情
### 受影响的包/仓库
- **仓库:** NotrinosERP
- **受影响版本:** v1.0.0(当前版本)
- **修复版本:** 无(0-day)
**Commit Hash(已审计):** `3c538484454ab0f5755188c8edc4b11542bff085`
## CVE-REQUEST-001:MD5 类型杂凑身份验证绕过 (CVSS 9.8)
**文件:** `admin/db/users_db.inc`,第 108 行
```
$hash == md5($password) // LOOSE COMPARISON!
```
PHP 的 `==` 运算符容易受到类型杂凑的攻击。以 `0e` 开头且后跟数字的 MD5 散列值会被视为科学计数法(`0eNNNN` = `0`)。如果某个密码的 MD5 散列值为 `0eNNNN`,则可以使用任何其他的“魔术散列值”将其绕过。
**PoC:** 如果任何账户具有类似 `0e462097431907509062922748828535` 的 MD5 散列值,则密码 `240610708` 会通过松散比较匹配成功(在 PHP 中两者都等于 `0`)。
**另外:** 位于 `install/index.php:151` 的安装脚本将管理员密码存储为**未加盐 MD5**:
```
$sql = "INSERT INTO users ... VALUES (..., '" . md5($_POST['password']) . "', ...)";
```
## CVE-REQUEST-002:通过员工文档上传实现已认证 RCE (CVSS 9.1)
**文件:** `hrm/manage/employees.php`,第 572 行
```
$file_path = ... . $_FILES['doc_file']['name']; // RAW FILENAME
```
**无验证:** 没有扩展名白名单,没有 MIME 检查,没有内容检查。文件被保存到可从 Web 访问的 `company/0/documents/employees/` 目录中,并且没有 `.htaccess` 保护。
### PoC:
```
curl -X POST http://target/hrm/manage/employees.php \
-b "session=VALID" \
-F "doc_file=@shell.php;filename=shell.php"
# 访问: http://target/company/0/documents/employees/shell.php?cmd=id
```
**额外的 RCE 攻击向量(共 6 个):**
- 公司 Logo 上传(可通过绕过扩展名检查上传 `.php`)
- `preg_replace /e` 修饰符 RCE(`reporting/includes/html_entity_decode_php4.php:343`)
- 备份配套脚本执行(`Backup.php` 需要 `.php` 配套文件)
- 将 Tar 文件解压到项目根目录,存在路径遍历风险
- 通过 Intune worker 的 `popen()` 命令注入
## CVE-REQUEST-003:通过未转义的 label_cell() 导致的系统性存储型 XSS (CVSS 8.5)
**文件:** `includes/ui/ui_input.inc`,第 470-483 行
```
function label_cell($label, ...) {
echo "" . $label . " \n"; // NO htmlspecialchars()!
}
```
在所有模块(CRM、库存、销售、采购、管理、GL、银行)中被调用了**数百次**。通过此函数显示的每个数据库值都是存储型 XSS 攻击向量。
**主要的存储型 XSS 目标:**
- 客户名称、供应商名称、物料描述 — 可由销售/采购用户编辑 → 供管理员查看
- 登录页面上的公司名称 — 在身份验证之前渲染
- 质量检查字段 — 15 个以上的字段未转义
- CRM 线索/商机数据
## CVE-REQUEST-004:通过 24 个业务逻辑缺陷进行的财务欺诈 (CVSS 9.0)
**主要的财务绕过攻击向量:**
1. **无服务端价格验证** — 未针对价格表检查用户提交的价格(`sales_order_entry.php:692`)
2. **高达 99.99% 的折扣** — 未检查客户的授权折扣率
3. **负数总计** — 可以创建向客户付款的发票
4. **用户提供的汇率** — 在跨币种发票上覆盖系统汇率
5. **GL 作废会破坏数据** — `UPDATE gl_trans SET amount=0 WHERE...`(违反 GAAP)
6. **交易编号冲突** — 使用 `MAX(trans_no)+1` 且未加锁
7. **浮点容差为 0.004** — 允许系统性的“意大利香肠切片”欺诈
8. **贷项通知单绕过三向匹配** — 未针对原始发票进行验证
9. **包含交易记录的会计年度仍可删除** — 无参照完整性检查
10. **注销移除分配且无 GL 条目** — 静默的 AR 减记
## 其他严重发现(共 76 个):
| 类别 | 数量 | 最大 CVSS | 主要示例 |
|----------|-------|----------|-------------|
| 身份验证绕过 | 6 | 9.8 | MD5 杂凑、安装重复利用、超级管理员绕过 |
| 文件上传 RCE | 6 | 9.1 | 员工文档、Logo、附件、Tar 解压 |
| 存储型 XSS | 20+ 个系统性 | 8.5 | label_cell(), display_heading(), display_error() |
| 业务逻辑 | 24 | 9.0 | 价格绕过、折扣欺诈、GL 作废、税务篡改 |
| CSRF | 5 | 8.8 | 所有 POST endpoint,未受保护的 GET 操作 |
| 信息泄露 | 12 | 7.5 | .git 暴露、开启调试、显示 SQL 错误、DB 凭据 |
| SSRF | 1 | 7.0 | url_get_contents() 支持 file:// 协议 |
| 路径遍历 | 2 | 7.5 | 日志文件查看器、模板路径 |
## 攻击链:从未经身份验证到完全攻破系统
1. 访问 `.git/` 目录 → 发现代码结构和凭据
2. 或者访问 `install/index.php` → 使用攻击者控制的数据库重新安装
3. 以管理员身份登录(通过 MD5 类型杂凑或硬编码的演示密码)
4. 通过员工文档上传 PHP shell → RCE
5. 修改财务记录(价格、折扣、GL 条目)且无审计跟踪
## 补丁 / 修复
### 严重:
1. 将 `$hash == md5($password)` 替换为 `password_verify()` + bcrypt
2. 在所有文件上传处理程序中添加扩展名白名单 + MIME 验证
3. 在 `label_cell()` 和所有显示函数中添加 `htmlspecialchars()` 或使用模板引擎转义
4. 添加针对价格表的服务端价格验证
5. 为 `get_next_trans_no()` 添加行级锁
6. 用正确的会计冲销条目替换 `SET amount=0`
7. 安装后移除安装目录
8. 添加 `.htaccess` 规则,在上传目录中阻止 `.git/`、`config_db.php` 和 PHP 执行
## 披露时间表
- **2026-06-28:** 由 Fatullayev Asadbek (Kimdir01) 发现了全部 76 个漏洞
- **TBD:** 报告给维护者
- **TBD:** 申请 CVE
- **TBD:** 发布公告
## 致谢
- 发现者:Fatullayev Asadbek | GitHub:Kimdir01
- 独立安全研究员
## 参考
- CWE-287:身份验证不当(类型杂凑)
- CWE-434:不受限制的危险类型文件上传
- CWE-79:在网页生成时对输入的不正确中和
- CWE-841:行为工作流的不当执行
- CWE-480:使用了错误的运算符
标签:CISA项目, PoC, Web安全, 安全助手, 暴力破解, 漏洞披露, 网页分析工具, 蓝队分析