记一次白盒审计解决CTF题目
字数 885 2025-08-23 18:31:18
白盒审计解决CTF题目:CMS后台漏洞分析与利用
漏洞背景
在一次CTF比赛中遇到一个CMS渗透题目,通过www.zip泄露了源代码,需要进行现场代码审计发现漏洞。该漏洞存在于后台系统中,通过在网站设置写入恶意语句并在工具首页生成处重新生成PHP文件来实现攻击。
代码结构分析
首先分析后台路由结构,位于admin/index.php:
// 路由参数
$model = $_GET['m']; // 控制功能点对应的文件
$action = $_GET['c']; // 控制文件中的具体函数
漏洞定位
通过抓包分析,定位到关键文件config.class.php中的save_action()功能:
// config.class.php
public function save_action() {
$this->model->setConfig($_POST); // 关键点1:POST数据传入setConfig方法
$this->cache->index_action(); // 关键点2:触发index_action方法
}
关键点1:setConfig方法分析
在config.model.php中:
public function setConfig($data) {
// 查询admin_config表中name列
$config = $this->db->select('admin_config', 'name');
$allList = array();
foreach($config as $v) {
$allList[] = $v['name']; // 将现有配置名存入数组
}
foreach($data as $k => $v) {
if(in_array($k, $allList)) {
// 更新存在的配置
$this->db->update('admin_config', array('value'=>$v), "name='$k'");
} else {
// 新增不存在的配置
$this->db->insert('admin_config', array('name'=>$k, 'value'=>$v));
}
}
}
关键点2:index_action方法分析
在cache.class.php中:
public function index_action() {
if(isset($_GET['make_index_url'])) {
$this->webindex(); // 关键函数调用
}
}
private function webindex() {
$path = 'index.php'; // 路径可控点
$content = $this->template->render('index'); // 模板渲染内容
// 文件写入操作
file_put_contents($path, $content);
}
漏洞利用链
- 通过后台配置功能向
admin_config表插入/更新数据 - 数据会被模板渲染后写入
index.php文件 - 通过控制配置值实现任意代码写入
安全限制与绕过
在global.php中存在安全过滤:
// 敏感词过滤
$filter_words = array('eval', 'system', 'exec', 'passthru', ...);
// 英文括号转中文括号
$content = str_replace(array('(', ')'), array('(', ')'), $content);
绕过方法:
- 使用非过滤的函数如
assert、create_function - 使用其他PHP特性如反引号执行、
include等 - 使用编码或混淆技术绕过关键词检测
完整利用步骤
- 访问后台配置页面(如
admin/index.php?m=config&c=index) - 提交恶意配置数据(POST请求):
malicious_param=<?php phpinfo(); ?> - 触发文件生成(访问
admin/index.php?m=cache&c=index&make_index_url=1) - 生成的
index.php将包含恶意代码 - 访问首页执行代码
防御建议
- 严格过滤用户输入,特别是配置数据
- 限制文件写入的路径和内容
- 禁用危险函数
- 对模板渲染内容进行安全检查
- 使用内容安全策略(CSP)等额外防护措施
总结
该漏洞是一个典型的二次注入+文件写入漏洞,通过:
- 不安全的配置存储
- 不安全的模板渲染
- 不安全的文件写入操作
三个环节的组合实现了任意代码执行。在代码审计时需要特别关注数据流经的所有环节,特别是从用户输入到敏感操作(如文件操作、数据库操作、命令执行等)的完整路径。