wuzhiCMS audit
字数 1091 2025-08-09 09:46:33
wuzhiCMS 漏洞分析与利用教学文档
1. 环境搭建与准备
-
源码结构说明:
www文件夹:网站根目录coreframe文件夹:CMS框架目录,包含模块应用程序- 路径配置:
coreframe/configs/wz_config.php中定义网站根目录
-
路由解析:
m参数:调用coreframe中的具体文件夹名称f参数:调用的类名v参数:类中的函数方法名
2. 目录穿越导致任意文件删除漏洞
漏洞位置
后台"拓展模块->附件管理->目录模式"
漏洞分析
-
代码位置:
coreframe/app/attachment/admin/index.php中的dir()方法$dir = isset($GLOBALS['dir']) && trim($GLOBALS['dir']) ? str_replace(array('..\\', '../', './', '.\\'), '', trim($GLOBALS['dir'])) : ''; $dir = str_ireplace(array('%2F', '//'), '/', $dir); $lists = glob(ATTACHMENT_ROOT . $dir . '/' . '*'); -
过滤绕过:
- 过滤了
..\,../,./,.\ - 但可以通过传入
....//或类似变形绕过 - 拼接后形成
../实现目录穿越
- 过滤了
-
文件删除操作:
- 调用
my_unlink()方法:
private function my_unlink($path) { if(file_exists($path)) unlink($path); }- 只要路径存在,即可删除任意文件
- 调用
复现步骤
- 进入后台附件管理的目录模式
- 点击返回上一级目录时抓包
- 修改
dir参数为....//等变形 - 构造路径删除目标文件
3. RCE (远程代码执行) 漏洞
漏洞位置
coreframe/app/attachment/admin/index.php 第156行
漏洞分析
-
缓存写入机制:
- 通过
submit参数判断是否写入缓存 - 调用
set_cache()方法 (coreframe/app/core/libs/function/common.func.php第392行)
function set_cache($name, $data, $dir = '_cache_') { $filename = preg_replace('/([^a-z0-9_]+)/i', '', $name); // 创建目录并写入数据 file_put_contents($path, $data); } - 通过
-
利用点:
$data可控 (来自$setting参数)- 可写入PHP代码
-
缓存读取机制:
- 未传入
submit参数时调用get_cache() - 包含之前写入的缓存文件
- 未传入
利用POC
-
写入shell:
?m=attachment&f=index&_su=wuzhicms&v=ueditor&submit=1&setting=<?php phpinfo();?> -
触发执行:
?m=attachment&f=index&_su=wuzhicms&v=ueditor
4. 其他漏洞点
- 模板管理目录穿越:
- 维护界面->模板管理
- 类似附件管理的目录穿越逻辑
- 默认操作HTML文件
5. 防御建议
-
目录穿越防护:
- 使用
realpath()规范化路径 - 严格限制访问范围
- 使用
-
文件操作防护:
- 增加权限检查
- 限制可操作文件类型
-
RCE防护:
- 对写入内容严格过滤
- 避免直接包含用户可控文件
-
其他建议:
- 更新到最新版本
- 限制后台访问IP
6. 总结
wuzhiCMS存在多个高危漏洞:
- 后台目录穿越导致任意文件删除
- 缓存机制不当导致RCE
- 模板管理目录穿越
这些漏洞组合可导致服务器完全沦陷,建议用户立即采取防护措施。