代码审计 | CNVD 1day Emlog_pro 任意文件上传2则

admin 2024年3月31日21:42:23评论16 views字数 2845阅读9分29秒阅读模式

免责声明

由于传播、利用本公众号所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!

代码审计 | CNVD 1day Emlog_pro 任意文件上传2则

欢迎关注本公众号,长期推送技术文章

前言

前段时间给大家分享了一篇关于Emlog的SQL注入的代码审计,今天继续给大家分享一篇关于emlog的代码审计文章

以下两则该漏洞均属于后台任意文件上传,两则思路是一样的,只是上传的位置不同,用来学习代码审计思路也是蛮好的

环境配置

影响版本:emlog emlog pro 2.2.0

漏洞存在位置:

  • emlog pro /admin/plugin.php存在任意文件上传漏洞

  • emlog pro /content/templates/存在任意文件上传漏洞

代码审计 | CNVD 1day Emlog_pro 任意文件上传2则

代码审计 | CNVD 1day Emlog_pro 任意文件上传2则

Emlog官网下载存在漏洞版本的源码:

 https://github.com/emlog/emlog/releases

代码审计 | CNVD 1day Emlog_pro 任意文件上传2则

使用PhpStudy进行搭建,配置数据库信息,搭建完成界面如下。

代码审计 | CNVD 1day Emlog_pro 任意文件上传2则

代码审计 | CNVD 1day Emlog_pro 任意文件上传2则

代码审计

CNVD-2023-74535

根据提示emlog pro/admin/plugin.php存在任意文件上传漏洞,远程攻击者可利用该漏洞提交特殊的请求,可上传恶意文件,以应用程序上下文执行任意代码。

咱们先看看网页长什么样子

代码审计 | CNVD 1day Emlog_pro 任意文件上传2则

这儿有个上传的,按黑盒测试来说,第一反应就是这里的问题,测就完啦

现在咱们是有源码的,瞅瞅这个文件,这里有个小技巧,咱们可以查看这个安装插件,看看这个地址

代码审计 | CNVD 1day Emlog_pro 任意文件上传2则

这里咱们可以知道,上传的函数在upload_zip里面

if ($action == 'upload_zip') {     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;    } }

大体查看一番,这里就是检测上传的文件必须是zip,然后就是直接解压,这里咱们尝试写一个phpinfo,然后将其进行压缩测试

代码审计 | CNVD 1day Emlog_pro 任意文件上传2则

将其进行压缩

代码审计 | CNVD 1day Emlog_pro 任意文件上传2则

提示上传失败

代码审计 | CNVD 1day Emlog_pro 任意文件上传2则

根据这个提示,定位代码的位置

 <?php if (isset($_GET['error_e'])): ?>     <div class="alert alert-danger">安装失败,插件安装包不符合标准</div><?php endif ?>

继续查看这个error_e,这个是一个根据emUnZip返回值进行判断的

 $ret = emUnZip($zipfile['tmp_name'], '../content/plugins/', 'plugin');

继续跟踪这个emUnZip函数,可以发现他需要获取一个路径$dir,但是咱们的压缩包里面就是一个文件,所以报错

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;    }

咱们重新构建一下压缩包

代码审计 | CNVD 1day Emlog_pro 任意文件上传2则

现在压缩包结构为shell/shell.php,重新上传

代码审计 | CNVD 1day Emlog_pro 任意文件上传2则

成功上传,这里并没有什么提示,不过这里咱们可以查看源码路径结构,或者直接复制插件源码进行压缩就可以看见了

代码审计 | CNVD 1day Emlog_pro 任意文件上传2则

咱们想的是合适的,访问地址http://127.0.0.1:81/content/plugins/shell/shell.php

代码审计 | CNVD 1day Emlog_pro 任意文件上传2则

CNVD-2023-74536

根据漏洞提示emlog pro/content/templates/存在任意文件上传漏洞,远程攻击者可利用该漏洞提交特殊的请求,可上传恶意文件,以应用程序上下文执行任意代码。

查看这个文件所在的网页

代码审计 | CNVD 1day Emlog_pro 任意文件上传2则

和上述漏洞一样的页面,估计漏洞也是一样的逻辑,查看这个上传地址

代码审计 | CNVD 1day Emlog_pro 任意文件上传2则

调用的同一个函数upload_zip,就不继续跟踪啦

总结

感谢大家看到这里,文章写的必要啰嗦,大家请多多包涵。

关于文件上传,大家可以多关注一下函数,例如$_FILESmove_uploaded_fileis_uploaded_file等,以及直接搜索上传、文件upload.php都是可以的,特征点比较明显,咱们只需要注意过滤以及各种限制

以上只是鄙人的一点拙见,各位师傅看看就行,嘿嘿

代码审计 | CNVD 1day Emlog_pro 任意文件上传2则

代码审计 | CNVD 1day Emlog_pro 任意文件上传2则

代码审计 | CNVD 1day Emlog_pro 任意文件上传2则

往期精彩:

代码审计 | CNVD Emlog_Pro的二次SQL注入漏洞

干货 | SRC挖掘中容易被忽略的细节

原文始发于微信公众号(实战安全研究):代码审计 | CNVD 1day Emlog_pro 任意文件上传2则

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年3月31日21:42:23
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   代码审计 | CNVD 1day Emlog_pro 任意文件上传2则http://cn-sec.com/archives/2614951.html

发表评论

匿名网友 填写信息