从某CMS来看不安全的UNZIP操作
字数 1199 2025-08-29 08:31:53
PHPOK 6.0 不安全的UNZIP操作漏洞分析
漏洞概述
本文详细分析PHPOK 6.0 CMS系统中存在的多个不安全UNZIP操作漏洞,这些漏洞允许攻击者在获得后台管理员权限后,通过上传恶意ZIP压缩包实现任意文件上传,最终获取服务器WebShell。
漏洞背景
文件上传漏洞是Web应用中最常见且危害严重的漏洞之一。随着防护手段的增强,直接上传恶意PHP文件的难度增大,但不安全的UNZIP操作导致的Getshell问题仍广泛存在于许多CMS系统中。
漏洞点分析
1. 插件中心漏洞
利用步骤:
- 导出一个已安装的插件
- 修改文件名并添加恶意代码
- 本地上传修改后的插件
- 访问上传的恶意文件实现Getshell
请求示例:
/phpok6/admin.php?c=upload&f=zip&PHPSESSION=9ff1mj7tdjnnru3uahmdfg6nh5&id=WU_FILE_0&name=shell.zip&type=application/x-zip-compressed&lastModifiedDate=Tue+Mar+15+2022+12:20:22+GMT+0800+(中国标准时间)&size=10022
代码分析:
- 控制器路径:
framework/admin/upload_control.php - 关键方法
zip_f():
public function zip_f() {
$rs = $this->lib('upload')->zipfile('upfile');
if($rs['status'] != 'ok'){
$this->json($rs['error']);
}
$this->json($rs['filename'],true);
}
- 调用
framework/libs/upload.php中的zipfile()方法:
public function zipfile($input,$folder='') {
if(!$input){
return array('status'=>'error','content'=>P_Lang('未指定表单名称'));
}
// 文件类型检测和上传处理
$this->set_type('zip');
$this->cate = array('id'=>0,'filemax'=>104857600,'root'=>$folder,'folder'=>'/','filetypes'=>'zip');
if(isset($_FILES[$input])){
$rs = $this->_upload($input);
}else{
$rs = $this->_save($input);
}
// ...
}
漏洞原因:
- 仅检测文件类型是否为ZIP和文件大小限制
- 未对压缩包内容进行安全检测
- 直接解压上传的ZIP文件,导致恶意PHP文件被保存
2. 程序升级漏洞
利用方式:
- 通过后台"程序升级"功能中的"压缩包升级"上传恶意ZIP文件
- 利用方式与插件中心漏洞相同
代码路径:
framework/admin/update_control.php中的zip_f()方法
3. 模块管理漏洞
利用步骤:
- 导出已有模块
- 在压缩包中添加PHP文件
- 导入模块
- 虽然显示"导入模块失败",但文件已解压到
_cache目录
请求示例:
/phpok6/admin.php?c=upload&f=zip&PHPSESSION=cb43j0h4epcfr589foaphmk2p5&id=WU_FILE_0&name=wdnmd.zip&type=application/x-zip-compressed&lastModifiedDate=Tue+Mar+15+2022+15:23:16+GMT+0800+(中国标准时间)&size=1244
代码分析:
- 控制器路径:
framework/admin/module_control.php - 关键方法
import_f():
public function import_f() {
$zipfile = $this->get('zipfile');
// ...验证代码...
$this->lib('phpzip')->unzip($this->dir_root.$zipfile,$this->dir_cache);
if(!file_exists($this->dir_cache.'module.xml')){
$this->error(P_Lang('导入模块失败,请检查解压缩是否成功'));
}
}
漏洞特点:
- 先解压文件再进行验证
- 即使验证失败,文件已解压到
_cache目录 - 需要
_cache目录有访问权限且未清空缓存
漏洞利用条件
- 已获取后台管理员权限
- 目标系统存在以下功能之一:
- 插件管理
- 程序升级
- 模块管理
- 对于模块管理漏洞,还需满足:
_cache目录有访问权限- 后台未及时清空缓存
防御建议
-
对上传的ZIP文件内容进行严格检查:
- 检查文件扩展名
- 检查文件内容类型
- 禁止解压PHP等可执行文件
-
实现安全的解压流程:
- 先验证后解压
- 解压到临时目录,验证通过后再移动
- 解压失败时清理临时文件
-
权限控制:
- 限制上传目录的执行权限
- 对敏感目录设置访问限制
-
输入验证:
- 检查文件路径,防止目录穿越
- 对文件名进行规范化处理
总结
PHPOK 6.0中存在的多个不安全UNZIP操作漏洞,虽然需要管理员权限才能利用,但强调了后台安全的重要性。许多CMS系统往往只注重前台安全,而忽视了后台功能的安全性。攻击者在获取管理员权限后,配合此类漏洞可轻松获取WebShell,对系统安全构成严重威胁。