前言
前几天在学代码审计,翻cnvd看到一个emlog的新漏洞,想着自己复现一下
搭建
访问官网找到对应版本下载即可
https://www.emlog.net/
解压到phpstudy的www目录下
访问install.php即可安装
审计
该漏洞需要登录到后台,因此先进行登录
进入后台,来到插件这,可以看到有一个安装插件,即上传功能
分析相应的代码
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; } }
重点为以下两个部分
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
使用 ZipArchive::getNameIndex(0) 获取 ZIP 文件中第一个文件的完整路径。
使用 explode 函数将路径按 / 分割,取第一个部分作为目录名($dir),并确保其以 / 结尾。
这里的 $dir 是 ZIP 文件中第一个文件所在的目录,用于后续的文件检查
2.
由于传参是“plugin”,所以主要是这一部分
要让re不为false
则$dir和$plugin_name需要相同
因此zip目录结构如下
phpinfo/phpinfo.php
即目录要和最后的文件名相同
上传后访问路径为
因此访问../content/plugins/phpinfo/phpinfo.php
来源:https://www.freebuf.com/ 感谢【鸡你太美666】
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论