从某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. 插件中心漏洞

利用步骤:

  1. 导出一个已安装的插件
  2. 修改文件名并添加恶意代码
  3. 本地上传修改后的插件
  4. 访问上传的恶意文件实现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. 模块管理漏洞

利用步骤:

  1. 导出已有模块
  2. 在压缩包中添加PHP文件
  3. 导入模块
  4. 虽然显示"导入模块失败",但文件已解压到_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目录有访问权限且未清空缓存

漏洞利用条件

  1. 已获取后台管理员权限
  2. 目标系统存在以下功能之一:
    • 插件管理
    • 程序升级
    • 模块管理
  3. 对于模块管理漏洞,还需满足:
    • _cache目录有访问权限
    • 后台未及时清空缓存

防御建议

  1. 对上传的ZIP文件内容进行严格检查:

    • 检查文件扩展名
    • 检查文件内容类型
    • 禁止解压PHP等可执行文件
  2. 实现安全的解压流程:

    • 先验证后解压
    • 解压到临时目录,验证通过后再移动
    • 解压失败时清理临时文件
  3. 权限控制:

    • 限制上传目录的执行权限
    • 对敏感目录设置访问限制
  4. 输入验证:

    • 检查文件路径,防止目录穿越
    • 对文件名进行规范化处理

总结

PHPOK 6.0中存在的多个不安全UNZIP操作漏洞,虽然需要管理员权限才能利用,但强调了后台安全的重要性。许多CMS系统往往只注重前台安全,而忽视了后台功能的安全性。攻击者在获取管理员权限后,配合此类漏洞可轻松获取WebShell,对系统安全构成严重威胁。

PHPOK 6.0 不安全的UNZIP操作漏洞分析 漏洞概述 本文详细分析PHPOK 6.0 CMS系统中存在的多个不安全UNZIP操作漏洞,这些漏洞允许攻击者在获得后台管理员权限后,通过上传恶意ZIP压缩包实现任意文件上传,最终获取服务器WebShell。 漏洞背景 文件上传漏洞是Web应用中最常见且危害严重的漏洞之一。随着防护手段的增强,直接上传恶意PHP文件的难度增大,但不安全的UNZIP操作导致的Getshell问题仍广泛存在于许多CMS系统中。 漏洞点分析 1. 插件中心漏洞 利用步骤: 导出一个已安装的插件 修改文件名并添加恶意代码 本地上传修改后的插件 访问上传的恶意文件实现Getshell 请求示例: 代码分析: 控制器路径: framework/admin/upload_control.php 关键方法 zip_f() : 调用 framework/libs/upload.php 中的 zipfile() 方法: 漏洞原因: 仅检测文件类型是否为ZIP和文件大小限制 未对压缩包内容进行安全检测 直接解压上传的ZIP文件,导致恶意PHP文件被保存 2. 程序升级漏洞 利用方式: 通过后台"程序升级"功能中的"压缩包升级"上传恶意ZIP文件 利用方式与插件中心漏洞相同 代码路径: framework/admin/update_control.php 中的 zip_f() 方法 3. 模块管理漏洞 利用步骤: 导出已有模块 在压缩包中添加PHP文件 导入模块 虽然显示"导入模块失败",但文件已解压到 _cache 目录 请求示例: 代码分析: 控制器路径: framework/admin/module_control.php 关键方法 import_f() : 漏洞特点: 先解压文件再进行验证 即使验证失败,文件已解压到 _cache 目录 需要 _cache 目录有访问权限且未清空缓存 漏洞利用条件 已获取后台管理员权限 目标系统存在以下功能之一: 插件管理 程序升级 模块管理 对于模块管理漏洞,还需满足: _cache 目录有访问权限 后台未及时清空缓存 防御建议 对上传的ZIP文件内容进行严格检查: 检查文件扩展名 检查文件内容类型 禁止解压PHP等可执行文件 实现安全的解压流程: 先验证后解压 解压到临时目录,验证通过后再移动 解压失败时清理临时文件 权限控制: 限制上传目录的执行权限 对敏感目录设置访问限制 输入验证: 检查文件路径,防止目录穿越 对文件名进行规范化处理 总结 PHPOK 6.0中存在的多个不安全UNZIP操作漏洞,虽然需要管理员权限才能利用,但强调了后台安全的重要性。许多CMS系统往往只注重前台安全,而忽视了后台功能的安全性。攻击者在获取管理员权限后,配合此类漏洞可轻松获取WebShell,对系统安全构成严重威胁。