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安全, 安全助手, 暴力破解, 漏洞披露, 网页分析工具, 蓝队分析