代码审计-minicms
字数 2035 2025-08-26 22:11:40
MiniCMS 代码审计与漏洞分析教学文档
一、系统概述
MiniCMS 是一个轻量级的内容管理系统,采用 PHP 开发,具有以下特点:
- 无数据库设计,使用文件存储数据
- 采用 MVC 架构模式
- 使用 Markdown 解析库处理内容
- 管理功能集中在 mc-admin 目录
二、文件结构分析
核心文件
index.php:前端入口文件,负责路由和渲染mc-core.php:核心库,引入配置和标签功能mc-tags.php:模型层,包含核心函数和数据加载逻辑mc-conf.php:配置文件,存储用户名、密码等敏感信息
管理后台文件
mc-admin/index.php:后台登录页面mc-admin/head.php:处理 token 验证和 HTML head 部分mc-admin/foot.php:处理 HTML foot 部分mc-admin/post-edit.php:文章编辑处理逻辑mc-admin/page-edit.php:页面编辑处理逻辑mc-admin/conf.php:系统设置页面
数据存储结构
mc-files/posts/:文章数据存储目录index/:存储文章元数据(删除、草稿、已发布状态)data/:存储文章内容的序列化数据
mc-files/pages/:页面数据存储目录(类似文章结构)
三、漏洞分析
1. XSS 漏洞
1.1 登录页面反射型 XSS
位置:mc-admin/index.php
<form action="<?php echo $_SERVER['REQUEST_URI']; ?>" method="post">
漏洞原因:直接输出 $_SERVER['REQUEST_URI'] 未经过滤
利用条件:需要特定浏览器(如 IE)支持
1.2 文章内容存储型 XSS
位置:文章编辑功能
漏洞代码:
$post_content = get_magic_quotes_gpc() ? stripslashes(trim($_POST['content'])) : trim($_POST['content']);
漏洞原因:
- 仅使用
stripslashes和trim处理输入 - 无任何 HTML 过滤或转义
- 前端展示时未进行输出编码
1.3 标签/日期参数反射型 XSS
位置:mc-admin/post.php
if (isset($_GET['tag'])) $filter_tag = $_GET['tag'];
// ...
<a href="?state=<?php echo $state; ?>&tag=<?php echo $filter_tag; ?>">
漏洞原因:直接输出 GET 参数未经过滤
2. 文件删除漏洞
位置:mc-admin/post.php 删除功能
关键代码:
function delete_post($id, $state = '') {
if ($state != 'delete') {
// 移动到回收站
} else {
unlink('../mc-files/posts/data/'.$id.'.dat');
}
}
漏洞利用:
- 通过
load_posts()设置$state = 'delete' - 控制
$id参数删除任意.dat文件 - 利用路径遍历删除系统文件(如
../../../etc/passwd)
3. 文件包含+RCE 漏洞
位置:mc-admin/page-edit.php
关键代码:
$index_file = '../mc-files/posts/index/'.$post_state.'.php';
require $index_file;
$data['content'] = $post_content;
file_put_contents($file_path, serialize($data));
漏洞利用:
- 控制
$post_state进行路径遍历(如../../../shell) - 写入 PHP 代码到可控文件中
- 通过文件包含执行任意代码
限制条件:
- PHP 版本需 < 5.3.29
- magic_quotes_gpc 需为 off
- 可使用 NULL 字节截断(
%00)
4. 安装文件 RCE
位置:install.php
漏洞原因:安装过程中未对输入进行充分过滤
利用方式:
// 设置网站标题为
'); <?php phpinfo(); ?>
四、漏洞修复建议
1. XSS 防御
- 对所有用户输入进行 HTML 实体编码(
htmlspecialchars) - 对输出到 HTML 属性中的内容进行引号转义
- 实现 CSP 策略限制脚本执行
2. 文件操作安全
- 检查文件路径是否在允许范围内
- 使用
basename()过滤文件名 - 禁用危险函数或进行严格限制
3. 安装安全
- 安装完成后删除
install.php - 对安装过程中的输入进行严格过滤
- 生成随机的管理员凭证
4. 其他建议
- 升级 PHP 到最新版本
- 启用 magic_quotes_gpc(虽然不推荐依赖此功能)
- 实现完善的 CSRF 防护
五、审计技巧总结
-
敏感函数追踪:
- 全局搜索
unlink、file_put_contents、require等危险函数 - 检查
stripslashes使用点,这些通常是用户输入点
- 全局搜索
-
变量回溯:
- 从漏洞点回溯变量来源,确认是否可控
- 检查变量传递过程中是否有过滤或验证
-
权限验证检查:
- 确认每个管理功能是否有适当的身份验证
- 检查
head.php是否被包含(包含验证逻辑)
-
数据流分析:
- 跟踪用户输入从接收到存储再到展示的全过程
- 特别注意序列化和反序列化过程
-
环境依赖检查:
- 注意漏洞利用的 PHP 版本限制
- 检查 magic_quotes_gpc 等配置的影响
六、实战练习建议
- 搭建 MiniCMS 测试环境(PHP 5.2-5.3)
- 尝试复现文中提到的各类漏洞
- 编写漏洞利用脚本
- 尝试在不使用 NULL 字节截断的情况下实现 RCE
- 实践漏洞修复并验证有效性
通过本教学文档,您应该能够全面了解 MiniCMS 的安全问题及其成因,掌握基本的代码审计方法和漏洞修复技巧。