parlakbarann/CVE-2026-30480
GitHub: parlakbarann/CVE-2026-30480
针对 LibreNMS 中路径遍历导致的本地文件包含漏洞的复现与验证工具。
Stars: 1 | Forks: 0
# CVE-2026-30480:LibreNMS 通过路径遍历的本地文件包含(LFI)漏洞
## 概述
LibreNMS 的 NFSen 模块中存在本地文件包含(LFI)漏洞。认证攻击者可以利用路径遍历序列包含服务器文件系统中的任意 PHP 文件。
| 字段 | 值 |
|------|----|
| **产品** | LibreNMS |
| **厂商** | LibreNMS 项目 |
| **漏洞类型** | 本地文件包含(LFI)/ 路径遍历 |
| **CWE** | CWE-98、CWE-22 |
| **CVSS 评分** | 7.5 - 8.5(高危) |
| **需要身份验证** | 是 |
| **发现日期** | 2026-02-01 |
## 受影响组件
**文件:** `includes/html/pages/device/nfsen.inc.php`
**行号:** 46-48
```
if (is_file('includes/html/pages/device/nfsen/' . $vars['nfsen'] . '.inc.php')) {
include 'includes/html/pages/device/nfsen/' . $vars['nfsen'] . '.inc.php';
} else {
include 'includes/html/pages/device/nfsen/general.inc.php';
}
```
## 漏洞描述
`$vars['nfsen']` 参数来源于用户输入(`$_GET`/`$_POST`),并在未进行适当清理的情况下直接拼接到 `include()` 语句中。执行的唯一验证是 `is_file()` 检查,该检查无法防止路径遍历序列。
### 根本原因
1. 用户输入直接流入文件路径构造
2. 未对路径遍历字符(`../`)进行清理
3. 未对允许的值进行白名单验证
4. `is_file()` 仅检查存在性,不检查路径安全性
## 概念验证(PoC)
### 先决条件
- 已认证的 LibreNMS 用户
- 可访问至少一个带有 Netflow/NFSen 标签的设备
### 复现步骤
1. 以任意认证用户身份登录 LibreNMS
2. 访问任意设备的 Netflow 标签页:
https://[TARGET]/device/[DEVICE_ID]/tab=netflow
3. 添加恶意参数:
https://[TARGET]/device/[DEVICE_ID]/tab=netflow?nfsen=..%2f..%2fapi-access
4. 观察到 API Access 页面内容被加载,而非 NFSen 内容
### 预期行为与实际行为
| 场景 | 预期 | 实际 |
|------|------|------|
| 正常请求 | NFSen 通用页面(流量、数据包、流量统计) | NFSen 通用页面 |
| 恶意请求 | NFSen 通用页面 | **API Access 页面内容** |
## 影响
| 影响类型 | 描述 |
|----------|------|
| **信息泄露** | 包含并执行任意 `.inc.php` 文件 |
| **权限提升** | 以低权限用户身份访问仅限管理员页面 |
| **潜在 RCE** | 若攻击者可控制任意 `.inc.php` 文件内容 |
## 截图
### 0. LibreNMS 版本
**URL:** `https://[REDACTED]/about`
**版本:** `22.11.0-23-gd091788f2`(2022年12月15日)
**描述:** 显示测试版本的 LibreNMS 版本信息。该版本在 CVE-2021-44278 补丁(v21.12.0)之后,确认这是一个新的、未修补的漏洞。

### 1. 正常的 NFSen 页面
**URL:** `https://[REDACTED]/device/114/tab=netflow`
**描述:** 显示流量、数据包和流量统计部分的正常 NFSen/Netflow 页面。这是未利用时的预期行为。

### 2. 被利用 - API Access 页面(管理员用户)
**URL:** `https://[REDACTED]/device/114/tab=netflow?nfsen=..%2f..%2fapi-access`
**载荷:** `..%2f..%2fapi-access`(URL 编码的路径遍历)
**描述:** 注入恶意载荷后,加载的是 API Access 页面内容,而非 NFSen 内容。这成功演示了本地文件包含——包含的是 `api-access.inc.php` 文件,而非 `general.inc.php`。

### 3. 被利用 - 权限错误(全局只读用户)
**URL:** `https://[REDACTED]/device/114/tab=netflow?nfsen=..%2f..%2fapi-access`
**载荷:** `..%2f..%2fapi-access`(URL 编码的路径遍历)
**描述:** 使用权限较低的用户(全局只读)尝试相同载荷。页面显示“您没有足够的权限查看此页面”错误。这确认了:
1. LFI 漏洞有效(文件已被包含)
2. 目标文件的内部权限检查被触发
3. 与正常 NFSen 页面显示的内容不同

## 受影响版本
- 包含 NFSen 模块的 LibreNMS 版本
- **测试版本:** 22.11.0-23-gd091788f2(2022年12月15日)
- 漏洞存在于当前主分支
- **注意:** 这与 CVE-2021-44278(影响 `showconfig.inc.php`,在 v21.12.0 中已修补)不同。此漏洞影响 `nfsen.inc.php`,且仍未被修补。
## 修复建议
### 推荐修复
实施基于白名单的验证:
```
$allowed_pages = ['general', 'stats', 'channel'];
if (in_array($vars['nfsen'], $allowed_pages, true)) {
include 'includes/html/pages/device/nfsen/' . $vars['nfsen'] . '.inc.php';
} else {
include 'includes/html/pages/device/nfsen/general.inc.php';
}
```
### 替代修复
使用 `basename()` 剥离路径遍历:
```
$nfsen_page = basename($vars['nfsen']);
if (is_file('includes/html/pages/device/nfsen/' . $nfsen_page . '.inc.php')) {
include 'includes/html/pages/device/nfsen/' . $nfsen_page . '.inc.php';
}
```
## 时间线
| 日期 | 动作 |
|------|------|
| 2026-02-01 | 漏洞发现 |
| 2026-04-14 | CVE 发布,厂商通知 |
| 2026-04-14 | 公开披露 |
## 参考链接
- [CWE-98:包含/要求语句中文件名控制不当](https://cwe.mitre.org/data/definitions/98.html)
- [CWE-22:路径名未正确限制在受限目录内](https://cwe.mitre.org/data/definitions/22.html)
- [OWASP 路径遍历](https://owasp.org/www-community/attacks/Path_Traversal)
- [LibreNMS 官方网站](https://www.librenms.org/)
## 免责声明
本漏洞报告仅供教育和授权安全研究使用。研究人员在公开披露前已遵循负责任披露流程通知厂商。
## 致谢
**发现者:** Ömer Baran Parlak
**联系:** omerbaranparlak@gmail.com
**GitHub:** [parlakbarann](https://github.com/parlakbarann)
标签:API密钥检测, CVE-2026-30480, ffuf, is_file, LFI, LibreNMS, Local File Inclusion, NFSen, OpenVAS, PHP, traversal, Web安全, 包含漏洞, 文件包含, 服务端文件读取, 漏洞, 白名单校验, 网络安全研究, 蓝队分析, 认证绕过, 路径拼接, 路径遍历, 输入验证