php代码审计-emlog漏洞分析(1day分析)
1518864114458142 发表于 山西 漏洞分析 1970浏览 · 2024-02-05 08:52

0X00 前言

这是我的第一篇代码审计的文章,师傅们多多指点!!

官网:https://www.emlog.net/
version:emlog pro 2.1.9

0X01 文件上传漏洞(CVE-2023-44974)

漏洞分析


根据漏洞情报,说明该漏洞出现在 /content/templates/ 目录下,实际上表达的意思应该是该漏洞存在于安装模块这里

通过关键字定位,我们定位到 admin/template.php 文件,寻找关于上传的代码段
以下就是关于上传的代码段

if ($action === 'upload_zip') {
    LoginAuth::checkToken();
    $zipfile = isset($_FILES['tplzip']) ? $_FILES['tplzip'] : '';

    if ($zipfile['error'] == 4) {
        emDirect("./template.php?error_d=1");
    }
    if ($zipfile['error'] == 1) {
        emDirect("./template.php?error_f=1");
    }
    if (!$zipfile || $zipfile['error'] > 0 || empty($zipfile['tmp_name'])) {
        emMsg('模板上传失败, 错误码:' . $zipfile['error']);
    }
    if (getFileSuffix($zipfile['name']) != 'zip') {
        emDirect("./template.php?error_a=1");
    }

    $ret = emUnZip($zipfile['tmp_name'], '../content/templates/', 'tpl');
    switch ($ret) {
        case 0:
            emDirect("./template.php?activate_install=1");
            break;
        case -2:
            emDirect("./template.php?error_e=1");
            break;
        case 1:
        case 2:
            emDirect("./template.php?error_b=1");
            break;
        case 3:
            emDirect("./template.php?error_c=1");
            break;
    }
}

actionupload_zip时,执行if后面的语句,LoginAuth::checkToken();是用来检测登录状态的。$zipfile用来接收tplzip上传上来的数据,然后对上传的数据进行各种错误判断,判断成功后,执行下面的emUnZip函数进行解压,并把解压后的文件放到/content/templates/目录下,我们在追踪一下emUnZip函数看看是否有过滤等情况

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;
    }
    if (true === @$zip->extractTo($path)) {
        $zip->close();
        return 0;
    }

    return 1; //文件权限问题
}

我们不难看出emUnZip函数只是核对压缩包里的文件名称,压缩包和压缩包里的文件名必须相同,并没有进行过滤等操作,于是我们构造一个恶意的文件模板

利用过程

制作过程:将源码自带的模板里插入一个恶意文件 muma.php
最终效果

查看结果

成功触发漏洞

0X02 sql注入漏洞(CVE-2023-39121)

漏洞分析


也是根据漏洞情报,说明该漏洞出现在 /admin/user.php 目录下,我们进行分析
挖sql注入最重要的就是抓住可控变量,在通篇看了user.php文件后,似乎并没有可控的变量
于是我在追踪他用到的各类函数

在$email和$nickname不为空的时候是可以控制的,于是添加用户发现,用户名不可在添加时控制,他是随机生成8位的随机字符串(如下图所示),于是想办法看看如何控制用户名。

于是在功能点上找到了,上传数据库备份的功能,我们可以直接在数据库中进行更改用户名的方式插入payload

利用过程

于是直接套用他现成的模板,将用户名的值改为payload

上传数据库备份,进行导入

查看结果

复现完成

0 条评论
某人
表情
可输入 255