天涯论坛

 找回密码
 立即注册
搜索
查看: 19|回复: 4

emlog pro文件上传漏洞审计(CVE-2023-44974)(CVE-2023-44973)

[复制链接]

3089

主题

3万

回帖

9909万

积分

论坛元老

Rank: 8Rank: 8

积分
99098770
发表于 2024-10-3 03:25:48 | 显示全部楼层 |阅读模式

制品介绍】

emlog 是 “Every Memory Log” 的简叫作,意即:点滴记忆。它是一款基于PHP语言和MySQL数据库的开源、免费、功能强大的个人或多人联合撰写的博客系统(blog)。基于PHP和MySQL的功能强大的博客及CMS建站系统。致力于供给快速、稳定,且在运用上又极其简单、舒适的博客服务。安装和运用都非常方便

环境配置环境配置

影响版本:emlog emlog pro 2.2.0

emlog pro /admin/plugin.php任意文件上传漏洞 CVE-2023-44974

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

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

运用PhpStudy进行搭建,配置数据库信息

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

拜访路径,瞧瞧页面是什么样的,这个是原生研发的可以这般倘若是mvc的就不行

挖掘文件上传这种漏洞就直接找功能点,这个页面的功能点仅有一个安装插件

先正常的安装个插件走一下流程

运用burp抓包

晓得了这个数据包是成功上传文件的

打开源码经过搜索全局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

继续跟踪一下emUnZip,解压文件瞧瞧解压过程中有什么过滤

function emUnZip($zipfile, $path, $type = tpl) { if (!class_exists(ZipArchive, FALSE)) { return3;//zip模块问题 }$zip = new ZipArchive(); if (<span class="label label-primary">@$zip-</span>>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 === <span class="label label-primary">@$zip-</span>>extractTo($path)) { $zip->close(); return 0; } return 1; //文件权限问题 }

经过跟踪并什么过滤,emUnZip函数,能够发掘他需要获取一个路径$dir,然则咱们的压缩包里面便是一个文件,安装正常的插件压缩包里面都有一个文件夹

去网上找了一个正常插件,上传,能够成功上传

而后在本地修改插件,创建一个php文件

写入内容

而后进行压缩上传,分析上面代码,晓得了上传解压对文件内的内容进行过滤,成功上传

查看本地文件夹是不是存在phpinfo.php

网页拜访路径

emlog pro /content/templates/任意文件上传漏洞 CVE-2023-44973

打开网站,还是先找功能点,按照上面的cnvd提示晓得是模板那个位置有问题

和上面第1同样先上传个正常的文件上去,抓一下包

定位到代码位置

if ($action === upload_zip) { LoginAuth::checkToken(); // 检测登录状态和令牌,保证安全性 $zipfile = isset($_FILES[tplzip]) ? $_FILES[tplzip] : ; // 获取上传的ZIP文件 if ($zipfile[error] == 4) { emDirect("./template.php?error_d=1");// 倘若上传文件为空,重定向到错误页面 } if ($zipfile[error] == 1) { emDirect("./template.php?error_f=1"); // 倘若上传文件超过了php.ini中的限制体积,重定向到错误页面 } if (!$zipfile || $zipfile[error] > 0 || empty($zipfile[tmp_name])) { emMsg(模板上传失败, 错误码: . $zipfile[error]); // 倘若上传文件出错,表示错误信息并返回 } if (getFileSuffix($zipfile[name]) != zip) { emDirect("./template.php?error_a=1"); // 倘若上传文件不是ZIP文件,重定向到错误页面 } $ret = emUnZip($zipfile[tmp_name], ../content/templates/, tpl); // 调用解压缩函数解压上传的ZIP文件 switch ($ret) { case 0: emDirect("./template.php?activate_install=1"); // 解压缩成功,重定向到激活安装页面 break; case -2: emDirect("./template.php?error_e=1"); // 找不到header.php文件,重定向到错误页面 break; case 1: case 2: emDirect("./template.php?error_b=1"); // 文件权限问题或解压缩失败,重定向到错误页面 break; case 3: emDirect("./template.php?error_c=1"); // 缺少ZIP模块,重定向到错误页面 break; } }

当action为upload_zip时,执行if后面的语句,LoginAuth::checkToken();是用来检测登录状态的。$zipfile用来接收tplzip上传上来的数据,而后对上传的数据进行各样错误判断,判断成功后,执行下面的emUnZip函数进行解压,并把解压后的文件放到/content/templates/目录下,咱们跟踪一下emUnZip函数瞧瞧是不是有过滤等状况

经过查看代码文件上传时会执行if后面的语句,$zipfile变量来接收上传的数据,对数据进行判断,符合需求执行解压函数emUnZip进行解压,因此咱们继续跟踪emUnZip瞧瞧过滤function emUnZip($zipfile, $path, $type = tpl) { if (!class_exists(ZipArchive, FALSE)) { return3; // 倘若服务器上安装Zip模块,返回错误码3,暗示zip模块问题 }$zip = new ZipArchive(); // 创建一个ZipArchive对象 if (<span class="label label-primary">@$zip-</span>>open($zipfile) !== TRUE) { return2; // 倘若没法打开指定的压缩文件,返回错误码2,暗示文件权限问题 }$r = explode(/, $zip->getNameIndex(0), 2); // 获取压缩文件中的第1个文件的路径 $dir = isset($r[0]) ? $r[0] . / : ; // 获取文件的目录路径 switch ($type) {case tpl: $re = $zip->getFromName($dir . header.php); // 从压缩文件中获取名为header.php的文件内容 if (false === $re) { return -2; // 倘若没法获取到header.php文件内容,返回错误码-2 } break; case plugin: $plugin_name = substr($dir, 0, -1); // 获取插件的名叫作 $re = $zip->getFromName($dir . $plugin_name . .php); // 从压缩文件中获取与插件名叫作对应的php文件内容 if (false === $re) { return -1; // 倘若没法获取到插件对应的php文件内容,返回错误码-1 } break; case backup: $sql_name = substr($dir, 0, -1); // 获取备份文件的名叫作 if (getFileSuffix($sql_name) != sql) { // 判断备份文件的后缀名是不是为sqlreturn -3; // 倘若备份文件的后缀名不为sql,返回错误码-3 } break; case update: break; } if (true === <span class="label label-primary">@$zip-</span>>extractTo($path)) { // 将压缩文件内容解压到指定路径 $zip->close(); return 0; // 解压缩成功,返回0 } return 1; // 解压缩失败,返回错误码1,暗示文件权限问题 }

能够看出过滤,而后对上传的文件添加恶意文件

还是和上面同样,在正常的模板里面添加一个php文件,文件内容不为空,压缩上传

上传成功拜访

这两个文件上传都是同样调用同一个文件





上一篇:电脑提速办法大全,让你的电脑飞起来!
下一篇:Emlog官方论坛宣布关闭
回复

使用道具 举报

3123

主题

3万

回帖

9910万

积分

论坛元老

Rank: 8Rank: 8

积分
99108623
发表于 2024-10-8 01:29:44 | 显示全部楼层
楼主的文章深得我心,表示由衷的感谢!
回复

使用道具 举报

2986

主题

3万

回帖

9956万

积分

论坛元老

Rank: 8Rank: 8

积分
99569168
发表于 2024-10-12 19:21:45 | 显示全部楼层
楼主听话,多发外链好处多,快到碗里来!外链论坛 http://www.fok120.com/
回复

使用道具 举报

3123

主题

3万

回帖

9910万

积分

论坛元老

Rank: 8Rank: 8

积分
99108623
发表于 2024-11-2 18:29:39 | 显示全部楼层
软文发布平台 http://www.fok120.com/
回复

使用道具 举报

3123

主题

3万

回帖

9910万

积分

论坛元老

Rank: 8Rank: 8

积分
99108623
发表于 2024-11-7 16:50:55 | 显示全部楼层
论坛是一个舞台,让我们在这里尽情的释放自己。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站点统计|Archiver|手机版|小黑屋|天涯论坛 ( 非经营性网站 )|网站地图

GMT+8, 2024-11-23 06:01 , Processed in 0.165283 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.