emlog2.5.3代码审计(后台文件上传漏洞)
字数 980 2025-08-29 08:29:41

emlog 2.5.3/2.5.4 后台文件上传漏洞分析报告

漏洞概述

本报告详细分析 emlog 2.5.3 及 2.5.4 版本中存在的后台文件上传漏洞,该漏洞允许经过认证的攻击者通过插件上传功能上传恶意 ZIP 文件,最终导致任意代码执行。

环境搭建

  1. 下载安装

    • 从官网 https://www.emlog.net/ 下载 emlog 2.5.3 版本
    • 解压到 PHP 环境(如 phpstudy 的 www 目录)
    • 访问 install.php 完成安装
  2. 后台访问

    • 需要管理员权限账号登录后台

漏洞定位

漏洞位于插件上传功能,相关文件为 /admin/plugin.php

代码分析

关键代码段

if ($action == 'upload_zip') {
    if (defined('APP_UPLOAD_FORBID') && APP_UPLOAD_FORBID === true) {
        emMsg('系统禁止上传安装应用');
    }
    LoginAuth::checkToken();
    $zipfile = isset($_FILES['pluzip']) ? $_FILES['pluzip'] : '';

    // 省略部分错误检查代码...

    if (getFileSuffix($zipfile['name']) != 'zip') {
        emDirect("./plugin.php?error_f=1");
    }

    $ret = emUnZip($zipfile['tmp_name'], '../content/plugins/', 'plugin');
    // 省略后续处理代码...
}

核心函数 emUnZip

function emUnZip($zipfile, $path, $type = 'tpl') {
    if (!class_exists('ZipArchive', FALSE)) {
        return 3;
    }
    $zip = new ZipArchive();
    if (@$zip->open($zipfile) !== TRUE) {
        return 2;
    }
    
    $r = explode('/', $zip->getNameIndex(0), 2);
    $dir = isset($r[0]) ? $r[0] . '/' : '';
    
    switch ($type) {
        case 'plugin':
            $plugin_name = substr($dir, 0, -1);
            $re = $zip->getFromName($dir . $plugin_name . '.php');
            if (false === $re) {
                return -1;
            }
            break;
        // 其他 case 省略...
    }
    
    if (true === @$zip->extractTo($path)) {
        $zip->close();
        return 0;
    }
    return 1;
}

漏洞原理

  1. 上传流程

    • 系统仅检查上传文件是否为 ZIP 格式
    • 调用 emUnZip 函数解压 ZIP 文件到插件目录
  2. 关键缺陷

    • 检查机制不完善:仅验证 ZIP 中是否存在 目录名/目录名.php 文件
    • 目录遍历:未对 ZIP 文件中的目录结构进行安全过滤
  3. 绕过方法

    • 构造 ZIP 文件,使其包含一个目录和同名 PHP 文件
    • 例如:malicious/malicious.php

漏洞利用步骤

  1. 构造恶意 ZIP

    /malicious/
      ├── malicious.php (包含恶意代码)
    
  2. 上传流程

    • 登录后台
    • 访问插件管理页面
    • 上传构造的恶意 ZIP 文件
  3. 访问路径

    • 上传成功后,文件将解压到 /content/plugins/malicious/malicious.php
    • 直接访问该路径即可执行恶意代码

影响范围

  • 确认受影响版本:emlog 2.5.3 和 2.5.4
  • 需要后台管理员权限
  • 可导致任意代码执行

修复建议

  1. 临时解决方案

    • 禁用插件上传功能(设置 APP_UPLOAD_FORBID 为 true)
  2. 长期修复

    • 对 ZIP 文件中的目录名和文件名进行严格过滤
    • 增加文件类型白名单验证
    • 限制解压路径,防止目录遍历

漏洞验证

  1. 验证 2.5.4 版本
    • 确认该漏洞在 2.5.4 版本中仍然存在
    • 利用方式与 2.5.3 完全相同

总结

该漏洞源于对上传 ZIP 文件内容检查不严格,结合 PHP 的 ZipArchive 类特性,导致攻击者可上传任意 PHP 文件。虽然需要管理员权限,但对于已获取后台权限的攻击者来说危害较大,可完全控制网站服务器。

emlog 2.5.3/2.5.4 后台文件上传漏洞分析报告 漏洞概述 本报告详细分析 emlog 2.5.3 及 2.5.4 版本中存在的后台文件上传漏洞,该漏洞允许经过认证的攻击者通过插件上传功能上传恶意 ZIP 文件,最终导致任意代码执行。 环境搭建 下载安装 : 从官网 https://www.emlog.net/ 下载 emlog 2.5.3 版本 解压到 PHP 环境(如 phpstudy 的 www 目录) 访问 install.php 完成安装 后台访问 : 需要管理员权限账号登录后台 漏洞定位 漏洞位于插件上传功能,相关文件为 /admin/plugin.php 代码分析 关键代码段 核心函数 emUnZip 漏洞原理 上传流程 : 系统仅检查上传文件是否为 ZIP 格式 调用 emUnZip 函数解压 ZIP 文件到插件目录 关键缺陷 : 检查机制不完善:仅验证 ZIP 中是否存在 目录名/目录名.php 文件 目录遍历:未对 ZIP 文件中的目录结构进行安全过滤 绕过方法 : 构造 ZIP 文件,使其包含一个目录和同名 PHP 文件 例如: malicious/malicious.php 漏洞利用步骤 构造恶意 ZIP : 上传流程 : 登录后台 访问插件管理页面 上传构造的恶意 ZIP 文件 访问路径 : 上传成功后,文件将解压到 /content/plugins/malicious/malicious.php 直接访问该路径即可执行恶意代码 影响范围 确认受影响版本:emlog 2.5.3 和 2.5.4 需要后台管理员权限 可导致任意代码执行 修复建议 临时解决方案 : 禁用插件上传功能(设置 APP_ UPLOAD_ FORBID 为 true) 长期修复 : 对 ZIP 文件中的目录名和文件名进行严格过滤 增加文件类型白名单验证 限制解压路径,防止目录遍历 漏洞验证 验证 2.5.4 版本 : 确认该漏洞在 2.5.4 版本中仍然存在 利用方式与 2.5.3 完全相同 总结 该漏洞源于对上传 ZIP 文件内容检查不严格,结合 PHP 的 ZipArchive 类特性,导致攻击者可上传任意 PHP 文件。虽然需要管理员权限,但对于已获取后台权限的攻击者来说危害较大,可完全控制网站服务器。