某CMS审计(php)
字数 1477 2025-08-20 18:18:05
FrPHP CMS安全审计与漏洞分析教学文档
一、系统架构分析
1.1 目录结构
A/ - 后台控制器、模板、插件等
Home/ - 用户相关控制器和模板文件
Conf/ - 配置文件目录
Frphp/ - MVC框架核心目录
1.2 核心流程
- 入口文件index.php定义常量并包含Fr.php
- FrPHP类构造函数:
- 定义系统常量
- 包含公共函数库(/common/Functions.php)
- 包含项目函数库(/CONF/Functions.php)
- 加载扩展目录(/Extend)下的PHP文件
- 运行流程:
- 设置数据库配置
- 检测开发环境
- 处理路由
- 实例化控制器并调用方法
二、路由机制分析
2.1 路由处理流程
- 获取REQUEST_URI并进行URL解码
- 从缓存读取系统配置(缓存机制使用双重MD5)
- 自定义路由处理(Conf/route.php):
return [ ['正则url', '系统内真实链接', '传输方式'], // 示例 ['/\/base\/([0-9]+)\.html$/', 'Home/test/id/$1', 'GET'] ]; - 参数提取:
$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 核心组件
- View类负责模板渲染
- 主要方法:
assign(): 赋值模板变量render(): 渲染模板template(): 解析模板template_html(): 替换模板标签为PHP代码
3.2 模板缓存机制
- 模板处理流程:
$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); - 最终包含缓存文件执行:
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
漏洞原理:
- 表jz_comment存在id字段
- 外部传入id参数未经过frparam()过滤
- 预处理时保留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
绕过原理:
- 验证码模块可自定义session键名
// Imagecode调用 $_SESSION[$param['session_name']] = $code; - 普通用户检测仅检查session中是否有member键
if(isset($_SESSION['member'])){ $this->islogin = true; }
4.4 后台文件包含漏洞1
漏洞位置:Home/c/MessageController.php
利用步骤:
- 上传图片马到可访问目录
- 后台编辑message模型,设置模板路径为:
@../../static/upload/2021/11/23/202111235399.png - 访问留言详情触发包含:
http://ip/message/details.html?id=1
4.5 后台文件包含漏洞2
利用步骤:
- 修改上传设置:
- 允许上传html后缀
- 设置上传路径为模板目录:
Home/template/default/message
- 上传HTML文件(包含PHP代码)
- 新建栏目选择该模板文件
- 预览栏目触发代码执行
五、安全建议
-
输入过滤:
- 所有外部输入必须经过frparam()过滤
- 严格区分过滤类型(整数、字符串、数组等)
-
SQL防护:
- 使用预处理语句替代直接拼接
- 实现字段白名单验证机制
-
会话管理:
- 加强登录状态验证
- 限制session_name参数值
-
文件包含防护:
- 限制模板文件路径
- 禁止用户控制完整文件路径
-
上传限制:
- 严格限制上传文件类型和后缀
- 禁止上传文件到模板目录
-
路由安全:
- 加强路由参数验证
- 实现严格的路由匹配规则
本教学文档详细分析了FrPHP CMS的安全机制和存在的漏洞,涵盖了从架构设计到具体漏洞利用的全过程,可作为安全研究和代码审计的参考材料。