某cms博客存在模板文件上传漏洞
某cms博客存在模板文件上传漏洞
0x01概述
EMLOG是一款基于PHP的轻量级开源博客建站系统。EMLOG管理后台存在文件上传漏洞,攻击者可利用该漏洞上传恶意文件执行任意代码。
0x02 指纹
web.body="content=emlog"

0x03 版本号&&环境
版本:Pro 2.5.4
https://www.emlog.net/download


0x04漏洞分析
1在admin/template.php页面中,调用了名为emUnZip的函数,尝试将上传的ZIP文件(通过其临时路径$zipfile['tmp_name']访问)解压到指定的目录../content/templates/中。

2.跟进 emUnZip函数到include/lib/common.php

这行代码从ZIP文件中读取第一个文件或目录的名称(通过$zip->getNameIndex(0)),然后使用explode函数基于斜杠/进行分割,限制最大分割段数为2。
$r = explode('/', $zip->getNameIndex(0), 2);
如果分割的数组$r的第一个存在ZIP文件中确实包含一个顶级目录,然后加上斜杠后赋值给变量$dir。如果不存在顶级目录,$dir被设置为空字符串。
$dir = isset($r[0]) ? $r[0] . '/' : '';使用$zip->getFromName($dir . 'header.php')尝试从ZIP文件中读取名为header.php的文件内容,这个文件位于之前确定的顶级目录下。如果无法找到或读取header.php(然后从getFromName方法返回false),函数返回-2,导致安装过程失败。
$re = $zip->getFromName($dir . 'header.php');
if (false === $re) {
return -2;
}使用extractTo方法将ZIP文件内容解压到指定的路径$path如果解压成功extractTo返回true,关闭ZIP文件并返回0表示成功 文件上传到 /content/templates/目录下

0x05漏洞复现

必须要有一个顶级目录,先制作恶意的zip文件 zip内容为 xxxxx(文件夹)/header.php(必须要有header.php文件)。

/content/templates/自定义顶级目录/header.php
