
在进行任何代码级修复操作前,必须对网站程序和数据库进行完整备份,防止误操作导致网站无法访问。请根据你的服务器环境选择以下方式操作:
SSH命令行备份(Linux服务器):
```bash 进入网站根目录 cd /www/wwwroot/your_site_directory/ 打包压缩所有程序文件,文件名包含当前日期 tar -zcvf dedecms_backup_$(date +%Y%m%d).tar.gz ./ 备份数据库(请替换用户名、数据库名和密码) mysqldump -u root -pYourPassword databasename > sql_backup_$(date +%Y%m%d).sql ```FTP工具备份:
使用FileZilla或FlashFXP等工具,将根目录下所有文件下载至本地,并使用phpMyAdmin导出数据库。
版本确认:
查看/data/admin/ver.txt文件内容,确认当前版本。本文修复方案主要针对DedeCMS V5.7 SP2及以下版本存在的通用高危漏洞。
该漏洞位于include/common.inc.php文件。攻击者可以通过构造特殊的HTTP请求,利用foreach循环覆盖系统全局变量(如cfg_df_lang),进而包含恶意文件执行代码,直接获取服务器最高权限。
操作步骤:
include/common.inc.php文件。$_REQUEST的过滤代码段。原始漏洞代码段:
```php foreach($_REQUEST as $_k=>$_v) { if( strlen($_k)>0 && preg_match('^(cfg_|GLOBALS|_GET|_POST|_COOKIE)', $_k) ) { exit('Request var not allow!'); } } ```上述代码仅检查了键名是否以特定前缀开头,但在特定环境下,攻击者可以通过构造数组键值绕过检查,或者利用未过滤的变量覆盖其他关键配置。
修复后代码段:
```php foreach($_REQUEST as $_k=>$_v) { // 增强正则匹配,增加对_ENV和_SERVER的防护 if( strlen($_k)>0 && preg_match('^(cfg_|GLOBALS|_GET|_POST|_COOKIE|_REQUEST|_SERVER|_ENV)', $_k) ) { exit('Request var not allow!'); } // 递归检查数组值,防止通过传递数组结构进行绕过 if(is_array($_v)) { foreach($_v as $_k2 => $_v2) { if( strlen($_k2)>0 && preg_match('^(cfg_|GLOBALS|_GET|_POST|_COOKIE|_REQUEST|_SERVER|_ENV)', $_k2) ) { exit('Request var not allow!'); } } } } ``>修改完成后保存文件。此步骤通过增强正则匹配和增加递归检查,彻底封堵了通过全局变量覆盖进行权限提升的路径。

漏洞文件位于dede/media_add.php。在处理媒体文件上传时,程序未对文件后缀名进行严格的二次校验,且未正确处理文件名解析,导致攻击者可以上传包含恶意代码的图片(如shell.php;.jpg),在解析漏洞环境下直接获取WebShell。
操作步骤:
dede/media_add.php文件。else if($dopost=='save')代码块,通常在第119行左右。原始漏洞代码:
```php else if($dopost=='save') { // ...省略前置代码... $fullfilename = $cfg_basedir.$activepath.'/'.$filename; move_uploaded_file($upfile, $fullfilename); // ...省略后置代码... } ```修复后代码:
```php else if($dopost=='save') { // ...省略前置代码... $fullfilename = $cfg_basedir.$activepath.'/'.$filename; // [修复核心代码] 增加后缀白名单检查 $allowext = array('jpg', 'png', 'gif', 'jpeg', 'bmp'); // 获取文件后缀并转为小写 $fileext = strtolower(trim(substr(strrchr($filename, '.'), 1))); // 检查是否为允许的后缀 if(!in_array($fileext, $allowext)){ ShowMsg("仅允许上传 jpg, png, gif, jpeg, bmp 格式的图片!", "-1"); exit(); } // 检查文件名中是否包含危险字符(防止解析漏洞) if(preg_match('(php|phtml|php5|asp|aspx|jsp|cgi)i', $filename)){ ShowMsg("文件名中包含非法字符!", "-1"); exit(); } move_uploaded_file($upfile, $fullfilename); // 移动成功后,强制将文件权限修改为644,防止执行 @chmod($fullfilename, 0644); // ...省略后置代码... } ```漏洞文件位于member/flink_main.php。在删除友情链接操作中,aid参数未经过任何过滤直接拼接到SQL语句中,导致存在SQL注入漏洞。攻击者可利用此漏洞获取管理员账号密码的MD5值,进而解密登录后台。
操作步骤:
member/flink_main.php文件。elseif($dopost == 'delete')逻辑块。原始漏洞代码:
```php elseif($dopost == 'delete') { $aid = isset($aid) ? $aid : 0; $dsql->ExecuteNoneQuery("DELETE FROM `@__member_flink` WHERE aid='$aid' AND mid='".$cfg_ml->M_ID."';"); // ... } ```修复后代码:
```php elseif($dopost == 'delete') { // [修复核心代码] 强制转换为整型 $aid = isset($aid) ? intval($aid) : 0; // 二次确认,防止负数或异常值 if($aid < 1){ ShowMsg("参数错误!", "-1"); exit(); } $dsql->ExecuteNoneQuery("DELETE FROM `@__member_flink` WHERE aid='$aid' AND mid='".$cfg_ml->M_ID."';"); // ... } ```漏洞文件位于dede/login.php。在某些特定PHP配置或Session机制下,验证码校验逻辑存在缺陷,可能导致攻击者通过空值或特定构造绕过验证码验证,结合用户名爆破即可入侵后台。
操作步骤:
dede/login.php文件。原始漏洞代码:
```php if($validate=="" || $validate != $svali) { ResetVdValue(); ShowMsg("验证码不正确!","login.php",0,1000); exit(); } ```修复后代码:
```php // [修复核心代码] 增加对$svali是否为空的判断,并统一转小写比较 if(isset($validate)) { // 转为小写比较,增加容错性 if(strtolower($validate) != strtolower($svali)) { ResetVdValue(); ShowMsg("验证码不正确!","login.php",0,1000); exit(); } } else { // 如果未提交验证码,直接拦截 ResetVdValue(); ShowMsg("验证码不正确!","login.php",0,1000); exit(); } ```
除了修复代码逻辑,还必须在Web服务器层面禁止敏感目录执行PHP脚本。这是防止即使文件上传漏洞被利用也无法直接获取Shell的最后一道防线。
Apache服务器配置(.htaccess):
在uploads、data、templets目录下分别创建一个.htaccess文件,内容如下:
Nginx服务器配置:
在网站对应的Nginx配置文件(nginx.conf或vhost/.conf)的server块中添加以下location规则:
配置完成后,使用以下命令重载Nginx配置:
```bash nginx -t 测试配置是否正确 nginx -s reload 重载配置 ```DedeCMS默认后台目录为dede,这是攻击者扫描的首要目标。修改后台目录名是防止被自动化工具攻击的最有效手段。
操作步骤:
dede文件夹重命名为一个复杂的名称,建议包含数字和下划线,例如admin_manage_8899。data/common.inc.php文件,找到$cfg_admin_dir变量,将其值修改为新的目录名。配置示例:
```php // data/common.inc.php $cfg_admin_dir = 'admin_manage_8899'; ```data/cache/目录下的所有文件,确保新配置生效。完成上述所有步骤后,请按以下清单进行验证:
/dede目录,应返回404 Not Found错误;访问新目录应正常显示登录页。.txt或.php),系统应提示拦截并拒绝上传。uploads/xxx.php(如果存在),应返回403 Forbidden或404错误,而非PHP代码执行结果。请务必检查网站根目录下是否存在install文件夹,如果存在,请立即删除。该文件夹仅用于安装程序,保留在服务器上存在极大的被重置安装风险。












易频IT社区是综合性互联网IT技术门户网站,专注分享网络技术、服务器运维、网络安全、编程开发、系统架构、云计算、大数据等行业干货,实时更新IT行业资讯、零基础教程、实战案例,为IT从业者、技术爱好者提供专业的学习交流平台。
Copyright © 2021-2026 易频IT社区. All Rights Reserved. 备案号:闽ICP备2023013482号 网站地图