代码审计-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']);

漏洞原因

  • 仅使用 stripslashestrim 处理输入
  • 无任何 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');
    }
}

漏洞利用

  1. 通过 load_posts() 设置 $state = 'delete'
  2. 控制 $id 参数删除任意 .dat 文件
  3. 利用路径遍历删除系统文件(如 ../../../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));

漏洞利用

  1. 控制 $post_state 进行路径遍历(如 ../../../shell
  2. 写入 PHP 代码到可控文件中
  3. 通过文件包含执行任意代码

限制条件

  • 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 防护

五、审计技巧总结

  1. 敏感函数追踪

    • 全局搜索 unlinkfile_put_contentsrequire 等危险函数
    • 检查 stripslashes 使用点,这些通常是用户输入点
  2. 变量回溯

    • 从漏洞点回溯变量来源,确认是否可控
    • 检查变量传递过程中是否有过滤或验证
  3. 权限验证检查

    • 确认每个管理功能是否有适当的身份验证
    • 检查 head.php 是否被包含(包含验证逻辑)
  4. 数据流分析

    • 跟踪用户输入从接收到存储再到展示的全过程
    • 特别注意序列化和反序列化过程
  5. 环境依赖检查

    • 注意漏洞利用的 PHP 版本限制
    • 检查 magic_quotes_gpc 等配置的影响

六、实战练习建议

  1. 搭建 MiniCMS 测试环境(PHP 5.2-5.3)
  2. 尝试复现文中提到的各类漏洞
  3. 编写漏洞利用脚本
  4. 尝试在不使用 NULL 字节截断的情况下实现 RCE
  5. 实践漏洞修复并验证有效性

通过本教学文档,您应该能够全面了解 MiniCMS 的安全问题及其成因,掌握基本的代码审计方法和漏洞修复技巧。

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 漏洞原因 :直接输出 $_SERVER['REQUEST_URI'] 未经过滤 利用条件 :需要特定浏览器(如 IE)支持 1.2 文章内容存储型 XSS 位置 :文章编辑功能 漏洞代码 : 漏洞原因 : 仅使用 stripslashes 和 trim 处理输入 无任何 HTML 过滤或转义 前端展示时未进行输出编码 1.3 标签/日期参数反射型 XSS 位置 : mc-admin/post.php 漏洞原因 :直接输出 GET 参数未经过滤 2. 文件删除漏洞 位置 : mc-admin/post.php 删除功能 关键代码 : 漏洞利用 : 通过 load_posts() 设置 $state = 'delete' 控制 $id 参数删除任意 .dat 文件 利用路径遍历删除系统文件(如 ../../../etc/passwd ) 3. 文件包含+RCE 漏洞 位置 : mc-admin/page-edit.php 关键代码 : 漏洞利用 : 控制 $post_state 进行路径遍历(如 ../../../shell ) 写入 PHP 代码到可控文件中 通过文件包含执行任意代码 限制条件 : PHP 版本需 < 5.3.29 magic_ quotes_ gpc 需为 off 可使用 NULL 字节截断( %00 ) 4. 安装文件 RCE 位置 : install.php 漏洞原因 :安装过程中未对输入进行充分过滤 利用方式 : 四、漏洞修复建议 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 的安全问题及其成因,掌握基本的代码审计方法和漏洞修复技巧。