PHP代码审计-百家CMS
字数 1271 2025-08-10 19:49:13

百家CMS漏洞分析与审计教学文档

0x00 前言

本文档详细分析百家CMS存在的多个安全漏洞,包括任意文件删除、任意文件写入和命令执行漏洞。所有分析仅用于技术研究和防御学习,严禁用于非法用途。

0x01 漏洞分析

1. 任意文件删除漏洞

漏洞位置:系统管理 → 备份与还原 → 删除备份文件

漏洞文件:database.php

漏洞分析

  1. 前端传递id参数与$path进行拼接
  2. 使用is_dir()判断是否为目录
    • 如果是目录:进入redirs()函数进行递归删除
    • 如果不是目录:直接删除文件
  3. 整个过程中没有任何过滤措施

漏洞代码关键点

// 伪代码表示漏洞逻辑
$file_path = $path . $_GET['id'];

if(is_dir($file_path)) {
    redirs($file_path); // 递归删除目录
} else {
    unlink($file_path); // 直接删除文件
}

利用方法
攻击者可以通过构造恶意的id参数,删除服务器上的任意文件,如:

id=../../../config.php

2. 任意文件写入漏洞

漏洞位置:商城设置 → 商城入口 → 选择图片 → 提取网络图片

漏洞文件:file.php

漏洞分析

  1. 通过$_GPC获取url参数
  2. url值传入fetch_net_file_upload()函数
  3. 函数从远程服务器读取文件内容
  4. 将内容写入attachment目录下的临时文件
  5. 攻击者可上传恶意文件获取Webshell

漏洞代码关键点

$url = $_GPC['url']; // 获取外部URL
$content = file_get_contents($url); // 读取远程文件内容
$file_tmp_name = 'attachment/'.md5(time()).'.php'; // 生成临时文件名
file_put_contents($file_tmp_name, $content); // 写入文件

利用方法

  1. 在攻击者控制的服务器上放置恶意PHP文件
  2. 通过url参数指向该文件
  3. 系统会下载并保存该文件,形成Webshell

3. 命令执行漏洞

漏洞位置:第三方接入 → 微信号设置 → 上传授权文件

漏洞文件:setting.php

漏洞分析

  1. $file['name']$_FILES获取
  2. 传入file_save()函数
  3. file_save()函数中,file_full_path参数被拼接到system()函数
  4. 导致命令注入漏洞

漏洞代码关键点

$file['name'] = $_FILES['file']['name']; // 获取上传文件名
file_save($file); // 调用保存函数

// file_save函数内部
function file_save($file) {
    $file_full_path = '/path/to/upload/' . $file['name'];
    system('mv ' . $file['name'] . ' ' . $file_full_path); // 命令拼接
}

利用方法

  1. 上传文件时,构造恶意文件名如test;whoami;.jpg
  2. 系统执行命令时会解析为:
mv test;whoami;.jpg /path/to/upload/test;whoami;.jpg
  1. 导致whoami命令被执行

0x02 漏洞修复建议

  1. 任意文件删除修复

    • id参数进行严格过滤
    • 限制删除操作只能在指定目录内
    • 添加权限验证
  2. 任意文件写入修复

    • 禁止从远程URL下载可执行文件
    • 检查文件内容是否为合法图片
    • 限制文件扩展名
  3. 命令执行修复

    • 使用escapeshellarg()escapeshellcmd()过滤输入
    • 避免直接拼接用户输入到系统命令
    • 使用PHP内置文件操作函数代替系统命令

0x03 审计技巧总结

  1. 关注文件操作函数:unlink(), file_put_contents(), file_get_contents()
  2. 注意命令执行函数:system(), exec(), passthru(), shell_exec()
  3. 检查用户输入是否直接拼接到敏感操作中
  4. 注意目录穿越符号(../)的过滤情况
  5. 审计时重点关注后台管理功能,通常权限较高

0x04 参考

  • 百家CMS源码分析
  • PHP安全编程最佳实践
  • OWASP命令注入防御指南
百家CMS漏洞分析与审计教学文档 0x00 前言 本文档详细分析百家CMS存在的多个安全漏洞,包括任意文件删除、任意文件写入和命令执行漏洞。所有分析仅用于技术研究和防御学习,严禁用于非法用途。 0x01 漏洞分析 1. 任意文件删除漏洞 漏洞位置 :系统管理 → 备份与还原 → 删除备份文件 漏洞文件 :database.php 漏洞分析 : 前端传递 id 参数与 $path 进行拼接 使用 is_dir() 判断是否为目录 如果是目录:进入 redirs() 函数进行递归删除 如果不是目录:直接删除文件 整个过程中没有任何过滤措施 漏洞代码关键点 : 利用方法 : 攻击者可以通过构造恶意的 id 参数,删除服务器上的任意文件,如: 2. 任意文件写入漏洞 漏洞位置 :商城设置 → 商城入口 → 选择图片 → 提取网络图片 漏洞文件 :file.php 漏洞分析 : 通过 $_GPC 获取 url 参数 将 url 值传入 fetch_net_file_upload() 函数 函数从远程服务器读取文件内容 将内容写入 attachment 目录下的临时文件 攻击者可上传恶意文件获取Webshell 漏洞代码关键点 : 利用方法 : 在攻击者控制的服务器上放置恶意PHP文件 通过 url 参数指向该文件 系统会下载并保存该文件,形成Webshell 3. 命令执行漏洞 漏洞位置 :第三方接入 → 微信号设置 → 上传授权文件 漏洞文件 :setting.php 漏洞分析 : $file['name'] 从 $_FILES 获取 传入 file_save() 函数 在 file_save() 函数中, file_full_path 参数被拼接到 system() 函数 导致命令注入漏洞 漏洞代码关键点 : 利用方法 : 上传文件时,构造恶意文件名如 test;whoami;.jpg 系统执行命令时会解析为: 导致 whoami 命令被执行 0x02 漏洞修复建议 任意文件删除修复 : 对 id 参数进行严格过滤 限制删除操作只能在指定目录内 添加权限验证 任意文件写入修复 : 禁止从远程URL下载可执行文件 检查文件内容是否为合法图片 限制文件扩展名 命令执行修复 : 使用 escapeshellarg() 或 escapeshellcmd() 过滤输入 避免直接拼接用户输入到系统命令 使用PHP内置文件操作函数代替系统命令 0x03 审计技巧总结 关注文件操作函数: unlink() , file_put_contents() , file_get_contents() 注意命令执行函数: system() , exec() , passthru() , shell_exec() 检查用户输入是否直接拼接到敏感操作中 注意目录穿越符号( ../ )的过滤情况 审计时重点关注后台管理功能,通常权限较高 0x04 参考 百家CMS源码分析 PHP安全编程最佳实践 OWASP命令注入防御指南