研究人员: K | 产品: Cacti ≤ 1.2.30 | CVE: CVE-2026-39938
| 字段 | 值 |
|---|---|
| 产品 | Cacti — 基于 RRDtool 的完整图形化解决方案 |
| 受影响版本 | ≤ 1.2.30 |
| 漏洞类型 | CWE-22:路径遍历(LFI)→ CWE-78:操作系统命令注入 |
| 攻击向量 | 网络 |
| 认证 | 无需认证(访客账户绕过) |
| 用户交互 | 无 |
| CVSSv3.1 评分 | 9.8 — 严重 |
| 向量 | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
在 Windows 平台上,Cacti ≤ 1.2.30 容易受到 graph_image.php 中 graph_theme 参数导致的未认证本地文件包含(LFI)漏洞影响,并通过 cacti_escapeshellarg() 的操作系统命令注入链接到远程代码执行(RCE)。
HTTP Request
│
▼
graph_image.php
│
├── $guest_account = true → Auth bypass (no login needed)
│
├── graph_theme param → LFI (CWE-22)
│ └── Path traversal via basename() bypass
│
└── Other params (graph_height, etc.)
└── cacti_escapeshellarg() → OS injection (CWE-78)
└── proc_open() → RCE
graph_theme 实现的 LFIgraph_theme 参数的过滤不充分。修复尝试使用 basename(),但该方法极易被绕过——像 themes/../../etc/passwd 这样的路径既能通过 basename() 的验证,同时仍然可以遍历目录。
graph_image.php 中的漏洞代码路径:
$theme = basename($_GET['graph_theme']); // basename() is NOT sufficient
include_once("./include/theme_" . $theme . ".php"); // LFI
1.2.31 中的修复用 cacti_validate_theme() 替换了 basename(),该函数使用文件系统白名单进行校验。
GET /cacti/graph_image.php?local_graph_id=1&graph_theme=../../../../etc/passwd
GET /cacti/graph_image.php?local_graph_id=1&graph_height=100" & whoami & "&action=view
操作系统命令注入本身已提供直接的远程代码执行(RCE),因此实现入侵并不需要 LFI。
然而,从研究人员的角度来看,如果将这两个问题放在一起考虑:
config.php,获取数据库凭据或敏感配置数据。这表明,组合多个漏洞会提高整体影响,并使利用更容易、更可靠。
| 支柱 | 评级 | 描述 |
|---|---|---|
| 机密性 | 高 | 可完全读取 Web 服务器文件系统(配置、数据库凭据) |
| 完整性 | 高 |
评分: 9.8 — 严重
| 优先级 | 操作 |
|---|---|
| 立即 | 升级到 Cacti 1.2.31 或更高版本 |
MENG HOKSENG
独立安全研究员
参考链接:
| 条件 | 可能性 | 备注 |
|---|
| Cacti 运行在 Windows 上 | 企业中常见 | cmd.exe 转义缺陷可实现 RCE |
| 已启用访客账户 | 常见——通常为默认 | 访客用户可公开查看图形 |
| 至少存在一个图形 | 几乎普遍 | 安装后存在 local_graph_id=1 |
| 已安装 RRDtool | Cacti 必需 | 始终存在 |
| 任意命令执行、部署 Web Shell |
| 可用性 | 高 | 进程终止、文件损坏、拒绝服务(DoS) |
| 度量 | 值 |
|---|
| 攻击向量 | 网络 |
| 攻击复杂度 | 低 |
| 所需权限 | 无 |
| 用户交互 | 无 |
| 影响范围 | 不变 |
| 机密性 | 高 |
| 完整性 | 高 |
| 可用性 | 高 |