PHP代码审计-百家CMS
字数 1271 2025-08-10 19:49:13
百家CMS漏洞分析与审计教学文档
0x00 前言
本文档详细分析百家CMS存在的多个安全漏洞,包括任意文件删除、任意文件写入和命令执行漏洞。所有分析仅用于技术研究和防御学习,严禁用于非法用途。
0x01 漏洞分析
1. 任意文件删除漏洞
漏洞位置:系统管理 → 备份与还原 → 删除备份文件
漏洞文件:database.php
漏洞分析:
- 前端传递
id参数与$path进行拼接 - 使用
is_dir()判断是否为目录- 如果是目录:进入
redirs()函数进行递归删除 - 如果不是目录:直接删除文件
- 如果是目录:进入
- 整个过程中没有任何过滤措施
漏洞代码关键点:
// 伪代码表示漏洞逻辑
$file_path = $path . $_GET['id'];
if(is_dir($file_path)) {
redirs($file_path); // 递归删除目录
} else {
unlink($file_path); // 直接删除文件
}
利用方法:
攻击者可以通过构造恶意的id参数,删除服务器上的任意文件,如:
id=../../../config.php
2. 任意文件写入漏洞
漏洞位置:商城设置 → 商城入口 → 选择图片 → 提取网络图片
漏洞文件:file.php
漏洞分析:
- 通过
$_GPC获取url参数 - 将
url值传入fetch_net_file_upload()函数 - 函数从远程服务器读取文件内容
- 将内容写入
attachment目录下的临时文件 - 攻击者可上传恶意文件获取Webshell
漏洞代码关键点:
$url = $_GPC['url']; // 获取外部URL
$content = file_get_contents($url); // 读取远程文件内容
$file_tmp_name = 'attachment/'.md5(time()).'.php'; // 生成临时文件名
file_put_contents($file_tmp_name, $content); // 写入文件
利用方法:
- 在攻击者控制的服务器上放置恶意PHP文件
- 通过
url参数指向该文件 - 系统会下载并保存该文件,形成Webshell
3. 命令执行漏洞
漏洞位置:第三方接入 → 微信号设置 → 上传授权文件
漏洞文件:setting.php
漏洞分析:
$file['name']从$_FILES获取- 传入
file_save()函数 - 在
file_save()函数中,file_full_path参数被拼接到system()函数 - 导致命令注入漏洞
漏洞代码关键点:
$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); // 命令拼接
}
利用方法:
- 上传文件时,构造恶意文件名如
test;whoami;.jpg - 系统执行命令时会解析为:
mv test;whoami;.jpg /path/to/upload/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命令注入防御指南