免责声明
因为传播、利用本公众号所供给的信息而导致的任何直接或间接的后果及损失,均由运用者自己负责,公众号及作者不为此承担任何责任,一旦导致后果请自动承担!如有侵权烦请通知,咱们会立即删除并致歉。谢谢!
欢迎关注本公众号,长时间推送技术文案
前言
前段时间给大众分享了一篇关于Emlog的SQL注入的代码审计,今天继续给大众分享一篇关于emlog的代码审计文案
以下两则该漏洞均属于后台任意文件上传,两则思路是同样的,只是上传的位置区别,用来学习代码审计思路亦是蛮好的
环境配置
影响版本:emlog emlog pro 2.2.0
漏洞存在位置:
emlog pro /admin/plugin.php存在任意文件上传漏洞
emlog pro /content/templates/存在任意文件上传漏洞
Emlog官网下载存在漏洞版本的源码: https://github.com/emlog/emlog/releases
运用PhpStudy进行搭建,配置数据库信息,搭建完成界面如下。
代码审计
CNVD-2023-74535
按照提示emlog pro/admin/plugin.php存在任意文件上传漏洞,远程攻击者可利用该漏洞提交特殊的请求,可上传恶意文件,以应用程序上下文执行任意代码。
咱们先瞧瞧网页长什么样子
这儿有个上传的,按黑盒测试来讲,第1反应便是这儿的问题,测就完啦
此刻咱们是有源码的,瞅瞅这个文件,这儿有个小技巧,咱们能够查看这个安装插件,瞧瞧这个位置
这儿咱们能够晓得,上传的函数在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,而后将其进行压缩测试
将其进行压缩
提示上传失败
按照这个提示,定位代码的位置 <?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; }
咱们重新构建一下压缩包
此刻压缩包结构为shell/shell.php,重新上传
成功上传,这儿并无什么提示,不外这儿咱们能够查看源码路径结构,或直接复制插件源码进行压缩就能够看见了
咱们想的是合适的,拜访位置http://127.0.0.1:81/content/plugins/shell/shell.php
CNVD-2023-74536
按照漏洞提示emlog pro/content/templates/存在任意文件上传漏洞,远程攻击者可利用该漏洞提交特殊的请求,可上传恶意文件,以应用程序上下文执行任意代码。
查看这个文件所在的网页
和以上漏洞同样的页面,估计漏洞亦是同样的规律,查看这个上传位置
调用的同一个函数upload_zip,就不继续跟踪啦
总结
感谢大众看到这儿,文案写的必要啰嗦,大众请多多包涵。
关于文件上传,大众能够多关注一下函数,例如$_FILES、move_uploaded_file、is_uploaded_file等,以及直接搜索上传、文件upload.php都是能够的,特征点比较显著,咱们只需要重视过滤以及各样限制
以上只是鄙人的一点拙见,各位师傅瞧瞧就行,嘿嘿
往期精彩:
代码审计 | CNVD Emlog_Pro的二次SQL注入漏洞
干货 | SRC挖掘中容易被忽略的细节
|