CVE-2023-44974 emlog CMS任意文件上传漏洞分析
字数 1009 2025-08-19 12:42:36
EMLog CMS 任意文件上传漏洞分析 (CVE-2023-44974)
漏洞概述
EMLog CMS 在插件上传功能中存在任意文件上传漏洞,攻击者可以通过上传恶意 ZIP 文件来在服务器上执行任意 PHP 代码。该漏洞影响最新版本(2.3.0),无需身份验证即可利用。
环境搭建
准备工作
- 下载 EMLog CMS 最新版:https://github.com/emlog/emlog
- 准备 PHP 环境(推荐使用 PHPStudy)
安装步骤
- 解压项目文件到网站根目录
- 创建 MySQL 数据库(名为 emlog)
- 访问
http://localhost/emlog2.3.0/install.php - 配置数据库信息:
- 数据库名:emlog
- 用户名:自定义
- 密码:自定义
- 设置网站后台管理员信息
- 完成安装
漏洞复现
攻击步骤
-
准备恶意 ZIP 文件结构:
shell/ └── shell.php其中
shell.php包含恶意代码,如:<?php phpinfo(); ?> -
登录后台,访问插件上传功能(
/admin/plugin.php) -
上传
shell.zip文件 -
上传成功后,文件将被解压到:
/content/plugins/shell/shell.php -
访问恶意文件:
http://localhost/emlog2.3.0/content/plugins/shell/shell.php
漏洞分析
关键代码路径
- 上传处理:
/admin/plugin.php - 解压函数:
emUnzip() - 错误处理:
view/plugin.php
漏洞原理
-
上传流程:
- 首先检查用户 token 和上传文件错误
- 调用
emUnzip()函数处理上传的 ZIP 文件
-
emUnzip()函数关键逻辑:function emUnzip($zipfile, $path, $type = 'plugin') { // ... 校验代码 ... if ($type == 'plugin') { $dir = substr($zip->getNameIndex(0), 0, -1); $plugin_name = $dir; $re = $dir . '/' . $plugin_name . '.php'; if (!$zip->locateName($re)) { return false; } // ... 解压代码 ... } } -
漏洞关键点:
- 函数要求 ZIP 文件中必须包含
[目录名]/[目录名].php的结构 - 但未对解压后的文件内容进行安全检查
- 允许上传任意 PHP 文件并保持原始目录结构
- 函数要求 ZIP 文件中必须包含
绕过限制
- 必须确保 ZIP 文件结构为
[dirname]/[dirname].php - 示例:
- 有效:
shell/shell.php - 无效:
test/shell.php或shell/test.php
- 有效:
修复建议
- 对上传的 ZIP 文件内容进行严格检查
- 限制解压后的文件类型,禁止 PHP 文件
- 对插件文件进行签名验证
- 将插件上传目录设置为不可执行
总结
该漏洞利用 EMLog CMS 插件上传功能中的 ZIP 文件处理缺陷,通过精心构造的 ZIP 文件结构绕过限制,最终实现任意文件上传。由于未对上传的 PHP 文件内容进行过滤,导致远程代码执行风险。