CVE-2023-44974 emlog CMS任意文件上传漏洞分析
字数 1009 2025-08-19 12:42:36

EMLog CMS 任意文件上传漏洞分析 (CVE-2023-44974)

漏洞概述

EMLog CMS 在插件上传功能中存在任意文件上传漏洞,攻击者可以通过上传恶意 ZIP 文件来在服务器上执行任意 PHP 代码。该漏洞影响最新版本(2.3.0),无需身份验证即可利用。

环境搭建

准备工作

  1. 下载 EMLog CMS 最新版:https://github.com/emlog/emlog
  2. 准备 PHP 环境(推荐使用 PHPStudy)

安装步骤

  1. 解压项目文件到网站根目录
  2. 创建 MySQL 数据库(名为 emlog)
  3. 访问 http://localhost/emlog2.3.0/install.php
  4. 配置数据库信息:
    • 数据库名:emlog
    • 用户名:自定义
    • 密码:自定义
  5. 设置网站后台管理员信息
  6. 完成安装

漏洞复现

攻击步骤

  1. 准备恶意 ZIP 文件结构:

    shell/
    └── shell.php
    

    其中 shell.php 包含恶意代码,如:

    <?php phpinfo(); ?>
    
  2. 登录后台,访问插件上传功能(/admin/plugin.php

  3. 上传 shell.zip 文件

  4. 上传成功后,文件将被解压到:

    /content/plugins/shell/shell.php
    
  5. 访问恶意文件:

    http://localhost/emlog2.3.0/content/plugins/shell/shell.php
    

漏洞分析

关键代码路径

  • 上传处理:/admin/plugin.php
  • 解压函数:emUnzip()
  • 错误处理:view/plugin.php

漏洞原理

  1. 上传流程:

    • 首先检查用户 token 和上传文件错误
    • 调用 emUnzip() 函数处理上传的 ZIP 文件
  2. 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;
            }
            // ... 解压代码 ...
        }
    }
    
  3. 漏洞关键点:

    • 函数要求 ZIP 文件中必须包含 [目录名]/[目录名].php 的结构
    • 但未对解压后的文件内容进行安全检查
    • 允许上传任意 PHP 文件并保持原始目录结构

绕过限制

  • 必须确保 ZIP 文件结构为 [dirname]/[dirname].php
  • 示例:
    • 有效:shell/shell.php
    • 无效:test/shell.phpshell/test.php

修复建议

  1. 对上传的 ZIP 文件内容进行严格检查
  2. 限制解压后的文件类型,禁止 PHP 文件
  3. 对插件文件进行签名验证
  4. 将插件上传目录设置为不可执行

总结

该漏洞利用 EMLog CMS 插件上传功能中的 ZIP 文件处理缺陷,通过精心构造的 ZIP 文件结构绕过限制,最终实现任意文件上传。由于未对上传的 PHP 文件内容进行过滤,导致远程代码执行风险。

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.php 包含恶意代码,如: 登录后台,访问插件上传功能( /admin/plugin.php ) 上传 shell.zip 文件 上传成功后,文件将被解压到: 访问恶意文件: 漏洞分析 关键代码路径 上传处理: /admin/plugin.php 解压函数: emUnzip() 错误处理: view/plugin.php 漏洞原理 上传流程: 首先检查用户 token 和上传文件错误 调用 emUnzip() 函数处理上传的 ZIP 文件 emUnzip() 函数关键逻辑: 漏洞关键点: 函数要求 ZIP 文件中必须包含 [目录名]/[目录名].php 的结构 但未对解压后的文件内容进行安全检查 允许上传任意 PHP 文件并保持原始目录结构 绕过限制 必须确保 ZIP 文件结构为 [dirname]/[dirname].php 示例: 有效: shell/shell.php 无效: test/shell.php 或 shell/test.php 修复建议 对上传的 ZIP 文件内容进行严格检查 限制解压后的文件类型,禁止 PHP 文件 对插件文件进行签名验证 将插件上传目录设置为不可执行 总结 该漏洞利用 EMLog CMS 插件上传功能中的 ZIP 文件处理缺陷,通过精心构造的 ZIP 文件结构绕过限制,最终实现任意文件上传。由于未对上传的 PHP 文件内容进行过滤,导致远程代码执行风险。