[PHP代码审计]emlog6.0.0整站审计

Posted Y4tacker

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[PHP代码审计]emlog6.0.0整站审计相关的知识,希望对你有一定的参考价值。

写在前面

---------------------------------不小心十点了,该送女朋友回寝室了,剩下的太简单了,自己分析,还有一堆洞------------------------------
随便花了点时间读完了代码,看了很多页面,至少前台也是比较安全的,主要是测试了sql注入xss之类的,那么就去后台看看,作者还是比较有水平的,蛮细心的;
节约时间,不带师傅们从起点分析过滤啥的,有用到再提,本篇算是一次随意的审计练习吧!也算是带师傅们踏入一次简单的审计之旅!
当然可能也有遗漏的漏洞,毕竟是自己审计出来的,也没翻别人的,见谅;

Emlog

SQL注入

注入点1

很明显在一个地方没过滤admin/comment.php

if ($action== 'delbyip') {
    LoginAuth::checkToken();
    if (ROLE != ROLE_ADMIN) {
        emMsg('权限不足!', './');
    }
    $ip = isset($_GET['ip']) ? $_GET['ip'] : '';
    $Comment_Model->delCommentByIp($ip);
    $CACHE->updateCache(array('sta','comment'));
    emDirect("./comment.php?active_del=1");
}

这里很明显ip没有过滤吧,至于你说LoginAuth::checkToken();怎么拿到token,到处都是反正这个插件
在这里插入图片描述

注入点2

比较常见的一种注入方式,去数据库备份页面
在这里插入图片描述
之后上传导入恢复数据,发现成功实现注入select version()
在这里插入图片描述

注入点3

admin/navbar.php
在这里插入图片描述

文件上传漏洞

利用点1

在后台,插件上传处,在admin/plugin.php
在这里插入图片描述
逻辑很简单,自己看看。但是返回结果是安装失败,插件安装包不符合标准尴尬,瞧瞧view视图,找到了结果

<?php if(isset($_GET['error_e'])):?><span class="alert alert-danger">安装失败,插件安装包不符合标准</span><?php endif;?>

再返回得到分支,只有这里传了error_e

case -1:
     emDirect("./plugin.php?error_e=1");
     break;

因此得到,返回结果-1,而这个返回结果来于

$ret = emUnZip($zipfile['tmp_name'], '../content/plugins/', 'plugin');

我跳过不重要的

$r = explode('/', $zip->getNameIndex(0), 2);
$dir = isset($r[0]) ? $r[0] . '/' : '';

这里是得到压缩包下目录路径,比如说我有个y4tacker.php,压缩文件有一个y4tacker文件夹,这个dir最后就会返回/y4tacker,很简单不多说,看看之前报错返回-1的地方,是由于$zip->getFromName带来的报错

case 'plugin':
    $plugin_name = substr($dir, 0, -1);
    $re = $zip->getFromName($dir . $plugin_name . '.php');
    if (false === $re)
        return -1;
    break;

substr($dir, 0, -1);截取全名不多说,耐心Y4还告诉你了,之后便执行解压

if (true === @$zip->extractTo($path)) {
        $zip->close();
        return 0;
    } else {
        return 1;//文件权限问题
    }

因此我们制作一个php文件,内容为<?php phpinfo();,放在y4tacker文件夹下面后压缩上传即可
在这里插入图片描述

任意文件删除漏洞

任意文件删除1

admin/data.php下139行,有点傻的洞

if ($action == 'dell_all_bak') {
    if (!isset($_POST['bak'])) {
        emDirect('./data.php?error_a=1');
    } else{
        foreach ($_POST['bak'] as $val) {
            unlink($val);
        }
        emDirect('./data.php?active_del=1');
    }
}

任意文件删除2(一不小心发现个洞交CNVD了)

漏洞点在后台插件删除处,点击删除抓包

在这里插入图片描述

当然从location处的值发现已经删除成功

在这里插入图片描述

检查下网站根目录是否如此,确实robots.txt被删除了

在这里插入图片描述

admin/plugin.php,能看见如果成功删除则重定向到./plugin.php?activate_del=1

//删除插件
if ($action == 'del') {
    LoginAuth::checkToken();
    $Plugin_Model = new Plugin_Model();
    $Plugin_Model->inactivePlugin($plugin);
    $pludir = preg_replace("/^([^\\/]+)\\/.*/", "$1", $plugin);
    if (true === emDeleteFile('../content/plugins/' . $pludir)) {
        $CACHE->updateCache('options');
        emDirect("./plugin.php?activate_del=1");
    } else {
        emDirect("./plugin.php?error_a=1");
    }
}

漏洞存在点在于这个preg_replace如果我们能绕过这个正则匹配那么他就可以返回我们原始字符串

这个正则表达式的意思是,输入的字符满足

1.开头不能为/

2.将匹配到的值替换为$1也就是第一个括号中的内容

因此我们如果传入../../则会返回..

那如果第一位是\\也就成功绕过了这个替换,也就是可以实现任意目录穿越了,

因此不难理解我为什么上面写的plugin=/../../robots.txt了,拼接起来也就是../content/plugins//../../robots.txt,根据linux特性两个//其实也就是一个/

漏洞太多了就这样了,躺平了

以上是关于[PHP代码审计]emlog6.0.0整站审计的主要内容,如果未能解决你的问题,请参考以下文章

代码审计学php还是java

代码审计思路之PHP代码审计

PHP代码审计18—PHP代码审计小结

0-PHP代码审计——通用代码审计的思路

0-PHP代码审计——通用代码审计的思路

PHP代码审计1-审计环境与调试函数