免责声明
由于传播、利用本公众号所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!
欢迎关注本公众号,长期推送技术文章
前言
前段时间给大家分享了一篇关于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
存在任意文件上传漏洞,远程攻击者可利用该漏洞提交特殊的请求,可上传恶意文件,以应用程序上下文执行任意代码。
咱们先看看网页长什么样子
这儿有个上传的,按黑盒测试来说,第一反应就是这里的问题,测就完啦
现在咱们是有源码的,瞅瞅这个文件,这里有个小技巧,咱们可以查看这个安装插件
,看看这个地址
这里咱们可以知道,上传的函数在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
,然后将其进行压缩测试
将其进行压缩
提示上传失败
根据这个提示,定位代码的位置
if (isset($_GET['error_e'])):
<div class="alert alert-danger">安装失败,插件安装包不符合标准</div> 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注入漏洞
原文始发于微信公众号(实战安全研究):代码审计 | CNVD 1day Emlog_pro 任意文件上传2则
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论