emlog2.5.3代码审计(后台文件上传漏洞)

admin 2025年5月27日14:51:04emlog2.5.3代码审计(后台文件上传漏洞)已关闭评论3 views字数 2214阅读7分22秒阅读模式

前言

前几天在学代码审计,翻cnvd看到一个emlog的新漏洞,想着自己复现一下

emlog2.5.3代码审计(后台文件上传漏洞)

搭建

访问官网找到对应版本下载即可

https://www.emlog.net/

解压到phpstudy的www目录下

访问install.php即可安装

审计

该漏洞需要登录到后台,因此先进行登录

emlog2.5.3代码审计(后台文件上传漏洞)

进入后台,来到插件这,可以看到有一个安装插件,即上传功能

分析相应的代码

if ($action == 'upload_zip') {     if (defined('APP_UPLOAD_FORBID') && APP_UPLOAD_FORBID === true) {         emMsg('系统禁止上传安装应用');     }     LoginAuth::checkToken();     $zipfile = isset($_FILES['pluzip']) ? $_FILES['pluzip'] : '';      if ($zipfile['error'] == 4) {         emDirect("./plugin.php?error_d=1");     }     if ($zipfile['error'] == 1) {         emDirect("./plugin.php?error_g=1");     }     if (!$zipfile || $zipfile['error'] >= 1 || empty($zipfile['tmp_name'])) {         emMsg('插件上传失败, 错误码:' . $zipfile['error']);     }     if (getFileSuffix($zipfile['name']) != 'zip') {         emDirect("./plugin.php?error_f=1");     }   $ret = emUnZip($zipfile['tmp_name'], '../content/plugins/', 'plugin');switch ($ret) {      case 0:             emDirect("./plugin.php?activate_install=1");             break;case -1:             emDirect("./plugin.php?error_e=1");             break;         case 1:         case 2:             emDirect("./plugin.php?error_b=1");             break;         case 3:             emDirect("./plugin.php?error_c=1");             break;     } }

重点为以下两个部分

emlog2.5.3代码审计(后台文件上传漏洞)

1.emUnZip

function emUnZip($zipfile, $path, $type = 'tpl') {     if (!class_exists('ZipArchive', FALSE)) {         return 3; //zip模块问题     }     $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 'tpl':             $re = $zip->getFromName($dir . 'header.php');             if (false === $re) {                 return -2;             }             break;       case 'plugin':             $plugin_name = substr($dir, 0, -1);             $re = $zip->getFromName($dir . $plugin_name . '.php');             if (false === $re) {                 return -1;             }             break;case 'backup':             $sql_name = substr($dir, 0, -1);             if (getFileSuffix($sql_name) != 'sql') {                 return -3;             }             break;         case 'update':             break;     }     if (true === @$zip->extractTo($path)) {         $zip->close();         return 0;     }      return 1; //文件权限问题 }

重点为以上加粗的两部分

1.1

emlog2.5.3代码审计(后台文件上传漏洞)
emlog2.5.3代码审计(后台文件上传漏洞)
emlog2.5.3代码审计(后台文件上传漏洞)

使用 ZipArchive::getNameIndex(0) 获取 ZIP 文件中第一个文件的完整路径。

使用 explode 函数将路径按 / 分割,取第一个部分作为目录名($dir),并确保其以 / 结尾。

这里的 $dir 是 ZIP 文件中第一个文件所在的目录,用于后续的文件检查

2.

由于传参是“plugin”,所以主要是这一部分

emlog2.5.3代码审计(后台文件上传漏洞)emlog2.5.3代码审计(后台文件上传漏洞)

要让re不为false

则$dir和$plugin_name需要相同

因此zip目录结构如下

phpinfo/phpinfo.php

即目录要和最后的文件名相同

emlog2.5.3代码审计(后台文件上传漏洞)

上传后访问路径为

emlog2.5.3代码审计(后台文件上传漏洞)

因此访问../content/plugins/phpinfo/phpinfo.php

emlog2.5.3代码审计(后台文件上传漏洞)

来源:https://www.freebuf.com/ 感谢【鸡你太美666】

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年5月27日14:51:04
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   emlog2.5.3代码审计(后台文件上传漏洞)https://cn-sec.com/archives/4102102.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.