feifeicms 4.0 几处任意文件删除
字数 946 2025-08-29 08:31:41
FeifeiCMS 4.0 任意文件删除漏洞分析
漏洞概述
FeifeiCMS 4.0 存在多处任意文件删除漏洞,攻击者可以利用这些漏洞删除服务器上的任意文件。这些漏洞主要存在于后台管理模块中,由于对用户输入参数缺乏充分过滤,直接将参数拼接到文件路径中,导致可以删除非预期的文件。
漏洞位置与详情
1. DataAction.class.php 中的任意文件删除
漏洞位置
Lib/Lib/Action/Admin/DataAction.class.php
漏洞代码
public function del(){
$filename = trim($_GET['id']);
@unlink(DATA_PATH.'_bak/'.$filename);
$this->success($filename.'已经删除!');
}
//删除所有分卷文件
public function delall(){
foreach($_POST['ids'] as $value){
@unlink(DATA_PATH.'_bak/'.$value);
}
$this->success('批量删除分卷文件成功!');
}
漏洞分析
- 直接使用未经处理的
$_GET['id']和$_POST['ids']参数拼接文件路径 - 攻击者可以构造特殊的文件名路径,实现目录穿越,删除任意文件
- 默认情况下
_bak文件夹不存在,需要先触发备份功能创建该目录
利用条件
- 需要先触发备份功能创建
_bak目录 - 需要后台管理员权限
利用步骤
-
触发备份功能创建
_bak目录:- 访问数据库备份功能
- 满足
strlen($sql) >= $filesize*1000条件创建备份文件
-
构造删除payload:
http://localhost:8888/4.0.181010/index.php?s=/admin-data-del&id=../../../path/to/target/file
2. TplAction.class.php 中的任意文件删除
漏洞位置
Lib/Lib/Action/Admin/TplAction.class.php
漏洞代码
public function del(){
$id = admin_ff_url_repalce(str_replace(trim($_GET['id'])));
if (!substr(sprintf("%o",fileperms($id)),-3)){
$this->error('无删除权限!');
}
@unlink($id);
if (!empty($_SESSION['tpl_jumpurl'])) {
$this->assign("jumpUrl",$_SESSION['tpl_jumpurl']);
}else{
$this->assign("jumpUrl",'?s=Admin/Tpl/Show');
}
$this->success('删除文件成功!');
}
漏洞分析
$_GET['id']参数仅经过trim()和str_replace()处理,没有过滤路径穿越字符- 直接使用用户输入作为文件路径进行删除操作
- 虽然检查了文件权限,但无法防止路径穿越
利用条件
- 需要后台管理员权限
利用步骤
构造删除payload:
http://localhost:8888/4.0.181010/index.php?s=/admin-tpl-del&id=/path/to/target/file
漏洞修复建议
-
对用户输入进行严格过滤:
- 过滤
../等路径穿越字符 - 限制文件名只能包含特定字符集
- 过滤
-
使用白名单机制:
- 只允许删除特定目录下的特定类型文件
- 验证文件路径是否在允许范围内
-
修复代码示例:
// 对于DataAction.class.php
public function del(){
$filename = basename(trim($_GET['id'])); // 只获取文件名部分
$filepath = DATA_PATH.'_bak/'.$filename;
if(!is_file($filepath)) {
$this->error('文件不存在!');
}
@unlink($filepath);
$this->success($filename.'已经删除!');
}
// 对于TplAction.class.php
public function del(){
$id = trim($_GET['id']);
// 验证文件路径是否在模板目录内
$allowed_dir = realpath(TEMPLATE_PATH);
$target_file = realpath($id);
if(strpos($target_file, $allowed_dir) !== 0) {
$this->error('非法文件路径!');
}
if (!substr(sprintf("%o",fileperms($id)),-3)){
$this->error('无删除权限!');
}
@unlink($id);
$this->success('删除文件成功!');
}
总结
FeifeiCMS 4.0 中存在的任意文件删除漏洞主要源于对用户输入缺乏充分验证,直接将用户可控参数拼接到文件路径中。攻击者利用这些漏洞可以删除服务器上的重要文件,可能导致服务中断或更严重的安全问题。开发者应当对所有用户输入进行严格验证,特别是涉及文件系统操作时,应采用白名单机制限制可操作的文件范围。