一、漏洞说明
该漏洞属于后台高危文件上传漏洞,影响DedeCMS全版本,攻击者登录后台后,可利用后台文件管理器的上传功能,绕过文件类型校验,上传PHP木马文件,直接获取网站服务器控制权,属于「最高危」后台漏洞,利用门槛低,危害极大。
- 漏洞类型:后台文件上传
- 危害等级:最高危
- 影响版本:DedeCMS 全版本(含V5.7 SP2 ~ 5.7.118及衍生版本)
- 漏洞文件:/file_manage_upload.php
- 漏洞场景:后台文件管理器上传功能中,程序仅简单校验文件后缀名,未校验文件内容,攻击者可通过修改文件后缀名(如将.php改为.php.jpg)、构造恶意文件头,绕过校验,上传PHP木马文件,实现Getshell。
二、代码分析
漏洞核心原因:file_manage_upload.php 文件中,后台文件上传功能仅对文件后缀名进行简单校验,未校验文件实际内容,且未限制上传文件的存储路径和权限,攻击者可构造恶意文件,绕过后缀名校验,上传PHP木马,获取服务器控制权。
关键漏洞代码(原文件片段):
<?php
// 原漏洞代码(后台文件上传逻辑,存在文件上传漏洞)
require_once(dirname(__FILE__)."/config.php");
$uploadDir = $_POST['uploadDir'];
$file = $_FILES['file'];
// 仅简单校验文件后缀名,存在绕过风险
$allowExt = array('jpg', 'png', 'gif', 'txt', 'doc');
$ext = pathinfo($file['name'], PATHINFO_EXTENSION);
if(!in_array($ext, $allowExt)){
exit('禁止上传该类型文件');
}
// 未校验文件内容,直接上传
$filename = $uploadDir.'/'.$file['name'];
move_uploaded_file($file['tmp_name'], $filename);
echo '文件上传成功';
?>
代码问题分析:
- 后缀名校验松散:仅校验文件后缀名,未校验文件实际内容,攻击者可通过修改后缀名、构造文件头(如在PHP文件前添加图片头)绕过校验;
- 无文件内容校验:未校验文件是否为合法的图片、文档,允许上传包含PHP代码的恶意文件;
- 存储路径未限制:未限制上传文件的存储路径,攻击者可上传到网站可访问目录,直接执行恶意文件;
- 无权限校验:未对文件上传权限进行细分,只要登录后台,拥有文件管理权限的账号均可利用该漏洞;
- 无文件大小限制:未限制上传文件大小,攻击者可上传大型木马文件,扩大危害。
漏洞利用示例(仅用于学习,请勿非法测试):
// 1. 构造恶意文件:将PHP木马代码写入文件,后缀名改为.php.jpg,添加图片头(如GIF89a) // 木马文件内容:GIF89a<?php @eval($_POST[pass]);?>
// 2. 后台文件管理器上传该文件,因后缀名是jpg,绕过校验
// 3. 访问上传后的文件(如 http://你的网站域名/upload/1.php.jpg),服务器会解析PHP代码,实现Getshell
三、修复方法(原位修复,不升级、不影响模板)
本修复方案无需升级DedeCMS版本,仅修改file_manage_upload.php文件,通过加强后缀名校验、增加文件内容校验、限制存储路径,彻底封堵文件上传漏洞,不影响正常文件上传功能,步骤如下:
步骤1:备份漏洞文件
备份 /file_manage_upload.php 文件,备份路径示例:/file_manage_upload.php.bak,避免修改错误导致后台文件上传功能异常,便于后续回滚操作。
步骤2:核心修复(加强校验+限制路径)
打开 /file_manage_upload.php 文件,替换为以下修复后的代码,核心是加强后缀名校验、增加文件内容校验、限制存储路径和权限:
<?php
require_once(dirname(__FILE__)."/config.php");
// 修复1:添加权限校验,仅允许超级管理员上传文件
if($cuserLogin->getUserType() != 1){
exit('无权限操作,请联系超级管理员');
}
$uploadDir = $_POST['uploadDir'];
$file = $_FILES['file'];
// 修复2:加强后缀名校验,仅允许上传指定类型文件,禁止PHP相关后缀
$allowExt = array('jpg', 'png', 'gif', 'txt', 'doc', 'xls', 'pdf');
$forbidExt = array('php', 'php5', 'php7', 'phtml', 'php3', 'php4');
$ext = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
// 禁止危险后缀,允许合法后缀
if(in_array($ext, $forbidExt) || !in_array($ext, $allowExt)){
exit('禁止上传该类型文件');
}
// 修复3:校验文件内容,防止伪装文件(以图片为例,其他类型可补充)
$fileType = mime_content_type($file['tmp_name']);
$allowType = array('image/jpeg', 'image/png', 'image/gif', 'text/plain', 'application/msword');
if(!in_array($fileType, $allowType)){
exit('文件内容非法,禁止上传');
}
// 修复4:限制存储路径,仅允许上传到upload目录,禁止上传到可执行目录
$allowUploadDir = realpath(dirname(__FILE__).'/upload');
$uploadDir = realpath($uploadDir);
if(strpos($uploadDir, $allowUploadDir) === false){
exit('非法上传路径,禁止上传');
}
// 修复5:限制文件大小(最大2M),防止大型恶意文件
$maxSize = 2 * 1024 * 1024;
if($file['size'] > $maxSize){
exit('文件过大,禁止上传(最大2M)');
}
// 修复6:重命名上传文件,避免攻击者猜测文件名
$newFilename = uniqid().'.'.$ext;
$filename = $uploadDir.'/'.$newFilename;
// 保留原有上传逻辑,确保正常功能
move_uploaded_file($file['tmp_name'], $filename);
// 设置文件权限为644,禁止执行
chmod($filename, 0644);
echo '文件上传成功,文件名:'.$newFilename;
?>
步骤3:额外加固(可选,提升安全性)
- 禁用上传目录执行权限:通过Apache/Nginx配置,禁止upload目录执行PHP代码,即使上传恶意文件,也无法执行;
// Apache配置(httpd.conf或.htaccess)
php_flag engine off
// Nginx配置
location /upload/ {
php_flag engine off;
}
- 记录上传日志:添加上传日志记录功能,记录上传者、上传时间、文件名、文件路径,便于后续排查异常上传;
- 定期清理上传目录:定期删除上传目录下的无用文件,尤其是可疑文件,降低恶意文件留存风险;
- 取消非必要账号的文件管理权限:仅给超级管理员分配文件管理权限,其他后台账号取消该权限,减少漏洞利用入口。
步骤4:验证修复效果
- 低权限账号测试:使用非超级管理员账号登录后台,尝试上传文件,提示「无权限操作」,修复生效;
- 恶意后缀测试:尝试上传.php、.phtml后缀的文件,提示「禁止上传该类型文件」,修复生效;
- 伪装文件测试:上传伪装为图片的PHP木马文件(如GIF89a.jpg),提示「文件内容非法」,修复生效;
- 正常上传测试:上传合法的图片、文档文件,可正常上传,说明功能未受影响;
- 权限测试:访问上传的文件,无法执行PHP代码,修复生效。
四、注意事项
- 该漏洞危害极大,登录后台即可上传木马获取服务器控制权,修复后务必全面测试,确保漏洞已彻底封堵;
- 若网站有特殊上传需求(如上传自定义格式文件),可在allowExt和allowType中添加对应类型,确保不影响正常业务;
- 修复后需检查upload目录的权限,确保为755(不可写),上传文件权限为644(不可执行),防止恶意篡改;
- 定期查看上传日志和上传目录,排查异常上传记录和可疑文件,及时清理;
- 若修复后出现文件上传失败、无法保存的情况,可恢复备份文件,检查代码修改是否有误,或联系技术人员协助排查。
本文由 流觞运维 原创整理,如需 DedeCMS 该漏洞代修复、全站点漏洞扫描、安全加固、挂马清理服务,可联系微信:lnmp_wuyi(备注:dede修复)。