emlogpro文件上传漏洞代码审计(CVE-2023-44974)(CVE-2023-44973)

【产品介绍】

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官网下载存在漏洞版本的源码:
Releases · emlog/emlog · GitHub

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

开始代码审计,根据上面emlog pro提示 路径/admin/plugin.php存在任意文件上传漏洞,远程攻击者可利用该漏洞提交特殊的请求,可上传恶意文件,以应用程序上下文执行任意代码。
先访问路径,看看页面是什么样的,这个是原生开发的可以这样,如果是mvc的就不行
 


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


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


使用burp抓包


知道了这个数据包是成功上传文件的
 


打开源码通过搜索全局upload_zip
 


根据上面的提示路径找到了这个文件

 
  1. if ($action == 'upload_zip') {
  2. LoginAuth::checkToken();
  3. $zipfile = isset($_FILES['pluzip']) ? $_FILES['pluzip'] : '';
  4. if ($zipfile['error'] == 4) {
  5. emDirect("./plugin.php?error_d=1");
  6. }
  7. if ($zipfile['error'] == 1) {
  8. emDirect("./plugin.php?error_g=1");
  9. }
  10. if (!$zipfile || $zipfile['error'] >= 1 || empty($zipfile['tmp_name'])) {
  11. emMsg('插件上传失败, 错误码:' . $zipfile['error']);
  12. }
  13. if (getFileSuffix($zipfile['name']) != 'zip') {
  14. emDirect("./plugin.php?error_f=1");
  15. }
  16. $ret = emUnZip($zipfile['tmp_name'], '../content/plugins/', 'plugin');
  17. switch ($ret) {
  18. case 0:
  19. emDirect("./plugin.php?activate_install=1");
  20. break;
  21. case -1:
  22. emDirect("./plugin.php?error_e=1");
  23. break;
  24. case 1:
  25. case 2:
  26. emDirect("./plugin.php?error_b=1");
  27. break;
  28. case 3:
  29. emDirect("./plugin.php?error_c=1");
  30. break;
  31. }
  32. }

这段是可以绕过的,没什么问题获取文件后缀名zip
 


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

 
  1. function emUnZip($zipfile, $path, $type = 'tpl') {
  2. if (!class_exists('ZipArchive', FALSE)) {
  3. return 3;//zip模块问题
  4. }
  5. $zip = new ZipArchive();
  6. if (<span class="label label-primary">@$zip-</span>&gt;open($zipfile) !== TRUE) {
  7. return 2;//文件权限问题
  8. }
  9. $r = explode('/', $zip-&gt;getNameIndex(0), 2);
  10. $dir = isset($r[0]) ? $r[0] . '/' : '';
  11. switch ($type) {
  12. case 'tpl':
  13. $re = $zip-&gt;getFromName($dir . 'header.php');
  14. if (false === $re) {
  15. return -2;
  16. }
  17. break;
  18. case 'plugin':
  19. $plugin_name = substr($dir, 0, -1);
  20. $re = $zip-&gt;getFromName($dir . $plugin_name . '.php');
  21. if (false === $re) {
  22. return -1;
  23. }
  24. break;
  25. case 'backup':
  26. $sql_name = substr($dir, 0, -1);
  27. if (getFileSuffix($sql_name) != 'sql') {
  28. return -3;
  29. }
  30. break;
  31. case 'update':
  32. break;
  33. }
  34. if (true === <span class="label label-primary">@$zip-</span>&gt;extractTo($path)) {
  35. $zip-&gt;close();
  36. return 0;
  37. }
  38. return 1; //文件权限问题
  39. }

通过跟踪并没有什么过滤,emUnZip函数,可以发现他需要获取一个路径$dir,但是咱们的压缩包里面就是一个文件,安装正常的插件压缩包里面都有一个文件夹


去网上找了一个正常插件,上传,可以成功上传


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


写入内容
 


然后进行压缩上传,分析上面代码,知道了上传解压没有对文件内的内容进行过滤,成功上传


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


网页访问路径

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


打开网站,还是先找功能点,根据上面的cnvd提示也知道是模板那个位置有问题
 


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


定位到代码位置

 
  1. if ($action === 'upload_zip') {
  2. LoginAuth::checkToken(); // 检查登录状态和令牌,确保安全性
  3. $zipfile = isset($_FILES['tplzip']) ? $_FILES['tplzip'] : ''; // 获取上传的ZIP文件
  4. if ($zipfile['error'] == 4) {
  5. emDirect("./template.php?error_d=1"); // 如果上传文件为空,重定向到错误页面
  6. }
  7. if ($zipfile['error'] == 1) {
  8. emDirect("./template.php?error_f=1"); // 如果上传文件超过了php.ini中的限制大小,重定向到错误页面
  9. }
  10. if (!$zipfile || $zipfile['error'] &gt; 0 || empty($zipfile['tmp_name'])) {
  11. emMsg('模板上传失败, 错误码:' . $zipfile['error']); // 如果上传文件出错,显示错误信息并返回
  12. }
  13. if (getFileSuffix($zipfile['name']) != 'zip') {
  14. emDirect("./template.php?error_a=1"); // 如果上传文件不是ZIP文件,重定向到错误页面
  15. }
  16. $ret = emUnZip($zipfile['tmp_name'], '../content/templates/', 'tpl'); // 调用解压缩函数解压上传的ZIP文件
  17. switch ($ret) {
  18. case 0:
  19. emDirect("./template.php?activate_install=1"); // 解压缩成功,重定向到激活安装页面
  20. break;
  21. case -2:
  22. emDirect("./template.php?error_e=1"); // 找不到header.php文件,重定向到错误页面
  23. break;
  24. case 1:
  25. case 2:
  26. emDirect("./template.php?error_b=1"); // 文件权限问题或解压缩失败,重定向到错误页面
  27. break;
  28. case 3:
  29. emDirect("./template.php?error_c=1"); // 缺少ZIP模块,重定向到错误页面
  30. break;
  31. }
  32. }


当action为upload_zip时,执行if后面的语句,LoginAuth::checkToken();是用来检测登录状态的。$zipfile用来接收tplzip上传上来的数据,然后对上传的数据进行各种错误判断,判断成功后,执行下面的emUnZip函数进行解压,并把解压后的文件放到/content/templates/目录下,我们在追踪一下emUnZip函数看看是否有过滤等情况
通过查看代码文件上传时会执行if后面的语句,$zipfile变量来接收上传的数据,对数据进行判断,符合要求执行解压函数emUnZip进行解压,所以我们继续跟踪emUnZip看看有没有过滤

 
  1. function emUnZip($zipfile, $path, $type = 'tpl') {
  2. if (!class_exists('ZipArchive', FALSE)) {
  3. return 3; // 如果服务器上没有安装Zip模块,返回错误码3,表示zip模块问题
  4. }
  5. $zip = new ZipArchive(); // 创建一个ZipArchive对象
  6. if (<span class="label label-primary">@$zip-</span>&gt;open($zipfile) !== TRUE) {
  7. return 2; // 如果无法打开指定的压缩文件,返回错误码2,表示文件权限问题
  8. }
  9. $r = explode('/', $zip-&gt;getNameIndex(0), 2); // 获取压缩文件中的第一个文件的路径
  10. $dir = isset($r[0]) ? $r[0] . '/' : ''; // 获取文件的目录路径
  11. switch ($type) {
  12. case 'tpl':
  13. $re = $zip-&gt;getFromName($dir . 'header.php'); // 从压缩文件中获取名为header.php的文件内容
  14. if (false === $re) {
  15. return -2; // 如果无法获取到header.php文件内容,返回错误码-2
  16. }
  17. break;
  18. case 'plugin':
  19. $plugin_name = substr($dir, 0, -1); // 获取插件的名称
  20. $re = $zip-&gt;getFromName($dir . $plugin_name . '.php'); // 从压缩文件中获取与插件名称对应的php文件内容
  21. if (false === $re) {
  22. return -1; // 如果无法获取到插件对应的php文件内容,返回错误码-1
  23. }
  24. break;
  25. case 'backup':
  26. $sql_name = substr($dir, 0, -1); // 获取备份文件的名称
  27. if (getFileSuffix($sql_name) != 'sql') { // 判断备份文件的后缀名是否为sql
  28. return -3; // 如果备份文件的后缀名不为sql,返回错误码-3
  29. }
  30. break;
  31. case 'update':
  32. break;
  33. }
  34. if (true === <span class="label label-primary">@$zip-</span>&gt;extractTo($path)) { // 将压缩文件内容解压到指定路径
  35. $zip-&gt;close();
  36. return 0; // 解压缩成功,返回0
  37. }
  38. return 1; // 解压缩失败,返回错误码1,表示文件权限问题
  39. }

可以看出没有过滤,然后对上传的文件添加恶意文件


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


上传成功访问


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

用户名金币积分时间理由
Track-魔方400.0002024-02-17 20:08:45深度 100 普适 200 可读 100

打赏我,让我更有动力~

 0  0

收藏 回复, 快速到底

2 条回复   |  直到 4个月前 | 491 次浏览默认排序 

Track-魔方
发表于 4个月前

实际上有个错误:压缩包里面还需要一个文件夹才算正常插件,安装成功,这里,并不是因为压缩包里面需要有一个文件夹才能正常安装插件,在右键打压缩包的时候,windows是会自动创建一个和文件同名的zip压缩包,并且这个zip压缩包中的自带一个文件夹的【不需要额外创建】

这里需要满足的条件是:
由于这行代码,有个限制,需要你压缩包文件中有一个与文件夹同名的php文件,比如文件夹名是abc,那么你文件夹下面就需要有一个abc.php,并且abc.php中需要有内容,才能正常安装,否则返回 -1

 申明:本账号所分享内容仅用于网络安全技术讨论,切勿用于违法途径,所有渗透都需获取授权,违者后果自行承担,与本号及作者无关,请谨记守法。

免费领取安全学习资料包!

渗透工具

技术文档、书籍

 

面试题

帮助你在面试中脱颖而出

视频

基础到进阶

环境搭建、HTML,PHP,MySQL基础学习,信息收集,SQL注入,XSS,CSRF,暴力破解等等

 

应急响应笔记

学习路线

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/35092.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA【案例5-2】模拟默认密码自动生成

【模拟默认密码自动生成】 1、案例描述 本案例要求编写一个程序&#xff0c;模拟默认密码的自动生成策略&#xff0c;手动输入用户名&#xff0c;根据用户名自动生成默认密码。在生成密码时&#xff0c;将用户名反转即为默认的密码。 2、案例目的 &#xff08;1&#xff09…

JavaWeb系列六: 动态WEB开发核心(Servlet) 上

韩老师学生 官网文档为什么会出现Servlet什么是ServletServlet在JavaWeb项目位置Servlet基本使用Servlet开发方式说明快速入门- 手动开发 servlet浏览器请求Servlet UML分析Servlet生命周期GET和POST请求分发处理通过继承HttpServlet开发ServletIDEA配置ServletServlet注意事项…

【Python/Pytorch - 网络模型】-- 高阶SVD算法

文章目录 文章目录 00 写在前面01 基于Python版本的高阶SVD算代码02 HOSVD 的步骤 00 写在前面 高阶奇异值分解&#xff08;Higher-Order SVD&#xff0c;HOSVD&#xff09;是一种将传统的奇异值分解&#xff08;SVD&#xff09;扩展到高阶张量的方法。它能够将一个高阶张量分…

【AI编译器】triton学习:矩阵乘优化

Matrix Multiplication 主要内容&#xff1a; 块级矩阵乘法 多维指针算术 重新编排程序以提升L2缓存命 自动性能调整 Motivations 矩阵乘法是当今高性能计算系统的一个关键组件&#xff0c;在大多数情况下被用于构建硬件。由于该操作特别复杂&#xff0c;因此通常由软件提…

mprpc框架的配置文件加载

目录 1.回顾测试 2.mprpc框架的配置文件加载 2.1 mprpcconfig.h 2.2 完善mprpcapplication.h 2.3 完善mprpcapplication.cc 2.4 mprpcconfig.cc 2.5 test.conf 2.6 测试运行 ​3.扩展问题 1.回顾测试 我们先把之前的项目代码工程编译好&#xff0c;然后进入bin里面&am…

GPOPS-II教程(2): 可复用火箭再入大气层最优轨迹规划问题

问题描述 考虑一类可复用火箭再入大气层最优轨迹规划问题&#xff0c;其动力学方程为 { r ˙ v sin ⁡ γ , θ ˙ v cos ⁡ γ sin ⁡ ψ r cos ⁡ ϕ , ϕ ˙ v cos ⁡ γ cos ⁡ ψ r , v ˙ − F d m − F g sin ⁡ γ , γ ˙ F l cos ⁡ σ m v − ( F g v − v r …

高考填报志愿(选专业),为什么要尊重孩子的选择 ?

没有哪一位父母不希望自己的孩子能够考到理想的大学&#xff0c;甚至光宗耀祖&#xff0c;然而一些比较专制的家长&#xff0c;往往在孩子填报志愿的时候表现出很强的控制欲&#xff0c;希望将自己的意愿强加于孩子身上&#xff0c;并没有考虑到他们的兴趣是什么。其实&#xf…

【IM 服务】新用户为什么刚注册就能收到通知?为什么能接收注册前的通知?

功能说明&#xff1a; 默认新注册的用户可以接收到注册前 7 天内的广播消息。您可以从控制台免费基础功能页面关闭该服务。 开通方式&#xff1a; 访问开发者后台 免费基础功能 1页面&#xff0c;确认应用名称与环境&#xff08;开发 /生产 &#xff09;正确无误后&#xff0c…

springboot+vue+mybatis门窗管理系统+PPT+论文+讲解+售后

如今社会上各行各业&#xff0c;都在用属于自己专用的软件来进行工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。互联网的发展&#xff0c;离不开一些新的技术&#xff0c;而新技术的产生往往是为了解决现有问题而产生的。针对于仓库信息管理方…

Java-day01--基础知识

1、计算机基础知识&#xff1a; 计算机主要是由硬件和软件组成&#xff0c;软件指的是特定顺序的计算机指令&#xff0c;硬件主要可以看成是系统软件和应用软件等。 目前java主流分成三种&#xff1a;javase&#xff08;标准版&#xff09;、javame&#xff08;小型版&#x…

优化了自制的浏览器主页的全屏功能

第一次修改 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>全屏功能</title><style>…

数据分析必备:一步步教你如何用matplotlib做数据可视化(12)

1、Matplotlib 3D线框图 线框图采用值网格并将其投影到指定的三维表面上&#xff0c;并且可以使得到的三维形式非常容易可视化。plot_wireframe()函数用于此目的 import matplotlib.pyplot as plt import numpy as np import math import seaborn as sns plt.rcParams[font.s…

数据结构-----【链表:基础】

链表基础 1、链表的理论基础 1&#xff09;基础&#xff1a; 链表&#xff1a;通过指针串联在一起的线性结构&#xff0c;每个节点由两部分组成&#xff0c;一个是数据域&#xff0c;一个是指针域&#xff08;存放指向下一个节点的指针&#xff09;&#xff0c;最后一个指针…

在flask中加载mnist模型,并预测图片

一、在tensorflow中新建及保存模型 启动Jupyter Notebook 新建Notebook 生成 mnist_model.h5 模型的代码 import tensorflow as tf from tensorflow.keras.datasets import mnist from tensorflow.keras.models import Sequential from tensorflow.keras.layers import…

机器人控制系列教程之运动规划(2)

简介 在笛卡尔坐标空间中轨迹规划时&#xff0c;首先用位置矢量和旋转矩阵表示所有相应的机器人节点&#xff0c;其次在所有路径段插值计算相对的位置矢量和旋转矩阵&#xff0c;依次得出笛卡尔坐标空间中的轨迹序列通过求解运动学逆问题得到相应关节位置参数。 优点&#xf…

评测|贪吃小猫疯狂长肉,让它停不下嘴的希喂、鲜朗、帕特真实调研

我发现很多铲屎官存在一个误区&#xff0c;认为“进口即是高贵”&#xff0c;过度信赖进口产品。一见到进口宠物粮就冲动购买&#xff0c;甚至对国产品牌持贬低态度&#xff0c;贴上“质量不佳”、“不符合标准”等标签。 为了更深入地了解这一现象&#xff0c;我深入研究了主食…

【Unity小技巧】记一个RenderTexture无法正确输出Camera视图下的Depth渲染的问题

问题 这个问题出现在使用URP管线时&#xff0c;我试图用Shader实现血条的制作&#xff0c;并用RenderTexture将视图渲染到RawImage上。 但是渲染结果出现了问题&#xff1a; 可以看到液体边缘的渲染出现了错误&#xff0c;原因不明 在StackFlow上查找后找到了类似的问题&…

Spring Cloud - 开发环境搭建

1、JDK环境安装 1、下载jdk17&#xff1a;下载地址&#xff0c;在下图中红色框部分进行下载 2、双击安装&#xff0c;基本都是下一步直到完成。 3、设置系统环境变量&#xff1a;参考 4、设置JAVA_HOME环境变量 5、在PATH中添加%JAVA_HOME%/bin 6、在命令行中执行&#xff1a;j…

第三十篇——等价性:如何从等价信息里找答案?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 知道了等价性的逻辑&#xff0c;通过等价性去衡量事物&#xff0c;像是给…

Linux配置网卡详细教程

这个网卡配置然后头痛了两天&#xff0c;看了很多篇关于这方面的文章&#xff0c;但是都没让我成功&#xff0c;可惜工亏不负有心人&#xff0c;然后终于学会了下面此方法 实现完成的效果&#xff1a; 永久修改网卡IP vi /etc/sysconfig/network-scripts/ifcfg-ens33 TYPEEther…