openemr任意文件读取删除漏洞
字数 1059 2025-08-09 16:00:17
OpenEMR 5.0.1 任意文件读取与删除漏洞分析
漏洞概述
OpenEMR 是一款流行的开源电子健康记录和医疗实践管理解决方案。在5.0.1版本中,后台存在一个严重的任意文件读取和删除漏洞,攻击者可以利用此漏洞读取服务器上的任意文件,并且在读取后会自动删除该文件。
漏洞位置
漏洞存在于 /custom/ajax_download.php 文件中,主要涉及 readfile() 函数的不安全使用。
漏洞分析
关键代码分析
-
漏洞触发点位于
ajax_download.php文件中使用了readfile()函数 -
文件路径由
$finalZip变量决定,该变量有两个赋值来源:- 第一处赋值(48行)有较多限制条件
- 第二处赋值(63行)更容易利用,只需满足43行条件为False
-
关键参数来源:
$fileName来自GET参数fileName$qrda_file_path由$GLOBALS['OE_SITE_DIR']构建$GLOBALS['OE_SITE_DIR']又由$GLOBALS['OE_SITES_BASE']构建
利用条件
- 攻击者需要已登录后台(需要有效会话)
fileName参数中不能包含逗号(,)- 通过路径遍历(
../)可以访问任意文件
漏洞复现步骤
环境搭建
-
下载受影响版本(5.0.1):
- 下载地址:https://www.open-emr.org/wiki/index.php?title=OpenEMR_Downloads&oldid=27661
-
安装OpenEMR环境
漏洞利用过程
-
访问登录页面:
http://127.0.0.1/interface/login/login.php?site=default -
使用有效凭证登录系统
-
使用Burp Suite等工具拦截请求
-
构造恶意请求:
GET /custom/ajax_download.php?fileName=version.php HTTP/1.1 Host: 127.0.0.1 Cookie: [有效的会话Cookie] -
发送请求后:
- 服务器会返回目标文件(如version.php)的内容
- 文件会被自动删除
路径遍历示例
要访问根目录下的文件,可以使用4层路径遍历:
/custom/ajax_download.php?fileName=../../../../etc/passwd
漏洞影响
- 敏感信息泄露:可以读取服务器上的任意文件
- 文件删除:读取后的文件会被自动删除,可能导致系统损坏
- 需要认证:攻击者需要先获取有效会话
修复建议
- 对用户输入的
fileName参数进行严格过滤 - 限制文件访问范围,禁止路径遍历
- 移除不必要的文件删除功能
- 升级到最新版本(检查是否有官方补丁)
总结
该漏洞允许认证用户通过构造特殊的GET请求读取并删除服务器上的任意文件,是一个高危漏洞。医疗机构使用OpenEMR时应及时检查并修复此漏洞,避免敏感医疗数据泄露和系统损坏。