wolfcmd代码审计及漏洞复现

wolfcms代码审计

1.审计过程

审计同样是使用主动加被动扫描,这样可以帮帮助你对一些你没有注意到的参数进行测试,特别在黑盒审计的过程中,特别有作用,当然大佬当我啥也没说。我是在这小白逗小白的。嘻嘻嘻。同样和审计douphp时,漏洞存在与安装文件配置中,没有对于是否安装进行验证,导致新配置一样可以写入到配置文件中,尽管使用了单引号包裹参数,但是没有对于数据进行全局过滤,导致了可以任意命令执行,在不通过升级的情况下,可以在安装之后通过删除/wolf/install文件夹修复漏洞。

2.漏洞验证

通过查看代码,我们发现只需要闭合’)即可完成,所以我们构造payload '); eval(phpinfo());//

传入参数查看结果
在这里插入图片描述

3.漏洞分析

我们查看wolf/install/下install.php indes.php do-install.php文件进行分析,

这里直接粘贴出代码

<?php
if (isset($_POST['install']) && !isset($_POST['commit']) && file_exists(CFG_FILE) && !(filesize(CFG_FILE) > 1)) {
    require_once 'install.php';
}
else if (isset($_POST['install']) && isset($_POST['commit']) && isset($_POST['config'])) {
    $config = $_POST['config'];
    require_once 'do-install.php';
    require_once 'post-install.php';
}

通过分析数据包,我们传递进去的参数进行分析,通过分类使我们进入不同的模块,完成不同的功能,我们进入do-install.php进行分析,主要代码

// Create config.php template
$config_tmpl = new Template('config.tmpl');
$config_tmpl->assign($config);

// Get generated config.php
$config_content = $config_tmpl->fetch();

// Write config.php
if (!file_put_contents(CFG_FILE, $config_content)) {
    $error .= "<ul><li><strong>Config file could not be written!</strong></li>\n";
}

c o n f i g p o s t c o n f i g config就是在前面代码中,将post过来的config数组赋值给了 config,之后通过assign和fetch函数进行处理,我们跟踪这两个函数

    public function assign($name, $value=null) {
        if (is_array($name)) {
            foreach($name as $n => $v) {
                $this->_vars[$n] = $v;
            }
        } else {
            $this->_vars[$name] = $value;
        }
    }

    /**
     * Display template and return output as string
     *
     * @return string content of compiled template
     */
    public function fetch() {
        ob_start();
        if ($this->_includeTemplate()) {
            return ob_get_clean();
        }
        ob_end_clean();
    }

只是对数据的键值与键名进行处理分割存入数据中,在下面对数据进行拼接,通过把数据写入缓冲区之后进行拼接,最后取出。

我们可以通过调试来查看这些参数实时的参数值

在这里插入图片描述

继续跟踪

在这里插入图片描述

看到了我们最终的参数,通过file_put_contents函数写入了配置文件中

接着在下面查看代码,对我们的配置文件进行了包含,从而触发漏洞,实现命令执行,我们来查看配置文件

<?php 

// Database information:
// for SQLite, use sqlite:/tmp/wolf.db (SQLite 3)
// The path can only be absolute path or :memory:
// For more info look at: www.php.net/pdo

// Database settings:
define('DB_DSN', 'mysql:dbname=wolf;host=');eval(phpinfo());//;port=3306');
define('DB_USER', 'root');
define('DB_PASS', 'root');
define('TABLE_PREFIX', '');

发现shell已经成功写入,当然我们还可以通过构造,来实现前面的内容拼接完成,又不影响数据库的连接配置,具体就不在介绍了,感兴趣的同学自己区研究下

4.总结

没有对这个cms进行系统的审计,当然,我们在审计的时候一定要注意我们需要的参数是否可控,并且是否可以控制成我们需要的参数,有些时候尽管使用了全局对于引号的过滤,但是有些时候也会有疏忽,导致用户传入变量并没有使用单引号包裹,导致了sql注入的产生,不要相信用户输入的任何参数,对于需要的参数的类型长度进行严格限制,可以有效防止漏洞的产生。

发布了14 篇原创文章 · 获赞 0 · 访问量 13

猜你喜欢

转载自blog.csdn.net/qq_43645782/article/details/105468251
今日推荐