一、漏洞说明
该漏洞为 DedeCMS 最经典、危害最高的前台漏洞之一,无需登录即可利用,攻击者可通过构造恶意请求,上传 PHP 木马文件,直接获取网站服务器控制权,属于「最高危」漏洞。
- 漏洞编号:CVE-2018-20129
- 危害等级:最高危
- 影响版本:DedeCMS V5.7 SP2 及以下全版本(含各类衍生版本)
- 漏洞文件:/member/select_images_post.php
- 漏洞场景:前台会员中心「选择图片」功能,未对上传文件类型、后缀进行严格校验,导致恶意文件可绕过限制上传。
二、代码分析
漏洞核心原因
select_images_post.php 文件中,对上传文件的后缀校验逻辑存在缺陷,仅简单判断文件后缀是否在允许列表中,但未过滤「伪装后缀」(如
.php.jpg),且未对文件内容进行校验,导致攻击者可构造恶意文件绕过限制。
关键漏洞代码(原文件片段)
<?php
// 原漏洞代码
$filename = $_FILES['imgfile']['name'];
$filetype = strtolower(substr($filename, strrpos($filename, '.')+1));
$allowtype = array('jpg','jpeg','gif','png');
if(!in_array($filetype, $allowtype)){
echo '不允许上传该类型文件';
exit;
}
// 直接保存文件,未进一步校验文件内容
move_uploaded_file($_FILES['imgfile']['tmp_name'], $savepath.$filename);
?>
代码问题分析
- 仅校验文件后缀,未校验文件头部内容(如图片文件的头部标识),攻击者可将 PHP 木马文件伪装为 .php.jpg 格式,绕过后缀校验;
- 未对上传文件的大小、权限进行限制,可上传大容量恶意文件;
- 保存文件时直接使用原始文件名,未进行重命名,攻击者可直接访问上传的恶意文件。
三、修复方法(原位修复,不升级、不影响模板)
本修复方案无需升级 DedeCMS 版本,仅修改漏洞文件,不改动网站原有结构和模板,适合所有受影响版本,步骤如下:
步骤 1:备份漏洞文件先备份
/member/select_images_post.php 文件,避免修改错误导致功能异常(备份后可随时回滚)。
步骤 2:修改漏洞文件代码打开
/member/select_images_post.php 文件,找到上述漏洞代码片段,替换为以下修复后的代码:
<?php
$filename = $_FILES['imgfile']['name'];
$filetype = strtolower(substr($filename, strrpos($filename, '.')+1));
$allowtype = array('jpg','jpeg','gif','png');
// 修复1:严格校验后缀,禁止双重后缀(如 .php.jpg)
if(!in_array($filetype, $allowtype) || strpos($filename, '.php') !== false){
echo '不允许上传该类型文件';
exit;
}
// 修复2:校验文件头部,确认是图片文件
$filetmp = $_FILES['imgfile']['tmp_name'];
$fileinfo = getimagesize($filetmp);
if(!$fileinfo){
echo '请上传合法的图片文件';
exit;
}
// 修复3:限制文件大小(最大2MB)
$maxsize = 2 * 1024 * 1024; // 2MB
if($_FILES['imgfile']['size'] > $maxsize){
echo '文件大小不能超过2MB';
exit;
}
// 修复4:重命名文件,避免恶意文件可直接访问
$newfilename = uniqid().'.'.$filetype;
$savepath = './uploads/'; // 确保该目录仅允许图片访问,无执行权限
// 修复5:设置文件权限,禁止执行
move_uploaded_file($filetmp, $savepath.$newfilename);
chmod($savepath.$newfilename, 0644);
?>
步骤 3:额外加固(可选,提升安全性)
- 限制 /member/uploads/ 目录权限,设置为「只读」,禁止 PHP 文件执行(可在 Apache/Nginx 配置中设置);
- 删除 /member/select_images_post.php 文件中不必要的代码,仅保留核心上传逻辑;
- 定期清理该目录下的异常文件,避免遗留恶意文件。
步骤 4:验证修复效果尝试上传
.php、.php.jpg、.jsp 等恶意后缀文件,若提示「不允许上传该类型文件」,则修复成功;上传正常图片文件,可正常保存,说明功能未受影响。
四、注意事项
- 修复后务必测试前台「选择图片」功能,确保不影响正常使用;
- 若网站有二次开发,需确认修改后的代码与二次开发内容无冲突;
- 该漏洞虽主要影响旧版本,但部分衍生版本仍可能存在,建议所有使用 DedeCMS 的站长统一修复。
本文由 流觞运维 原创 https://www.lnmpweb.cn/archives/7477