凌晨四点,网站被挂马后的紧急处理
“昨晚还正常,今天一打开首页就跳转到博彩页面!”接到客户电话时,我意识到这又是一次典型的织梦CMS定时生成功能被利用的攻击,攻击者通过老版本dede的定时生成插件漏洞,在系统计划任务中植入了恶意脚本,如果你也遇到类似情况,请立刻按以下步骤清理:
- 立即断开服务器外网连接,避免数据持续泄露。
- 用phpMyAdmin导出数据库备份,注意选择“结构和数据”完整导出。
- 删除所有计划任务:进入后台→系统→系统设置→计划任务管理,将状态全部改为“关闭”。
- 清理恶意文件:重点检查/data/tplcache/、/plus/、/include/目录下的陌生php文件,尤其是最近修改时间异常的文件。
恢复干净的站点:从文件级到数据库级
文件级别恢复
- 下载官方最新版本的同版本织梦CMS安装包。
- 保留/upload/、/data/、/templets/三个目录,其余目录用官方源文件覆盖。
- 特别检查/data/sessions/和/data/cache/,这两个目录最容易藏后门。
数据库级别清理
执行以下SQL语句(替换成你的表前缀,假设为dede_):
织梦CMS定时生成时间设置,从被挂马到彻底防御的六步实战指南
-- 查找被篡改的文章内容 SELECT id, title, body FROM dede_archives WHERE body LIKE '%<script%' OR body LIKE '%iframe%'; -- 查找后台用户表异常 SELECT * FROM dede_admin WHERE usertype > 1; -- 删除可疑的挂马代码(示例) UPDATE dede_addonarticle SET body = REPLACE(body, '<script src="恶意地址"></script>', '');
修改后台路径:给攻击者设置第一道屏障
默认后台路径/dede/是最容易被扫描的,修改方法如下:
-
SSH登录服务器,进入站点根目录。
-
执行命令:
mv /www/wwwroot/你的域名/dede /www/wwwroot/你的域名/random123
注意:random123建议使用随机字符串+数字组合,例如a9kZ3m7n。
-
修改/data/common.inc.php文件,找到:
define('DEDEADMIN', '/dede');改为:
define('DEDEADMIN', '/random123'); -
重要:在服务器防火墙中限制后台访问IP,只允许指定的内网IP或VPN地址访问该路径。
文件权限安全设置:让攻击者无处下手
这里需要区分Linux和Windows服务器:
Linux环境推荐权限:
- 目录权限:755(drwxr-xr-x)
- 文件权限:644(-rw-r--r--)
- 特殊目录:/upload/设为755但禁止执行php
find /www/wwwroot/你的域名 -type d -exec chmod 755 {} \; find /www/wwwroot/你的域名 -type f -exec chmod 644 {} \; chmod -R 755 /www/wwwroot/你的域名/upload
必须禁止执行权限的文件类型:
- /upload/目录下所有php、phtml、pht、shtml文件
- /data/目录下不允许有可执行脚本
在Nginx配置中加入:
location ~* /upload/.*\.(php|php5|php7|phtml)$ {
deny all;
}
整站搬家的完整流程:零出错的迁移方案
当你需要更换服务器时,按这个顺序操作:
- 新服务器准备:安装相同版本的PHP(推荐7.4)、MySQL(5.7)、Nginx。
- 打包文件传输:
# 旧服务器打包 tar -czvf site_backup.tar.gz /www/wwwroot/你的域名 # 下载到本地再上传到新服务器
- 数据库迁移:
# 导出 mysqldump -u用户名 -p密码 数据库名 > db_backup.sql # 导入新服务器 mysql -u新用户名 -p新密码 新数据库名 < db_backup.sql
- 修改配置文件:编辑/data/common.inc.php,更新数据库连接信息。
- 开启伪静态:复制.htaccess或nginx.conf中的重写规则。
- 测试访问:先不要解析域名,用IP+临时端口测试。
域名更换后的数据替换:别漏掉这些隐藏点
假设旧域名为old.com,新域名为new.com:
-- 替换文章内容中的链接 UPDATE dede_addonarticle SET body = REPLACE(body, 'old.com', 'new.com'); -- 替换系统配置中的站点链接 UPDATE dede_sysconfig SET value = REPLACE(value, 'old.com', 'new.com') WHERE varname = 'cfg_basehost'; -- 替换自定义字段(如果有) UPDATE dede_addonarticle SET literal = REPLACE(literal, 'old.com', 'new.com'); -- 模板文件中的链接手动替换 grep -rl "old.com" /www/wwwroot/你的域名/templets/ | xargs sed -i 's/old.com/new.com/g'
关键遗漏点:
- /data/config.cache.inc.php中的站点域名缓存
- 第三方插件配置文件中写死的域名
- Sitemap、RSS文件中的域名
数据库备份与恢复:你的最后一道防线
备份策略(建议每天执行):
#!/bin/bash # 定时任务:0 3 * * * /root/backup.sh DATE=$(date +%Y%m%d) mysqldump -uroot -p密码 databasename > /backup/db_$DATE.sql find /backup -name "*.sql" -mtime +7 -delete
恢复操作(慎重执行):
-- 先锁定表 FLUSH TABLES WITH READ LOCK; -- 恢复 mysql -u用户名 -p密码 数据库名 < 备份文件.sql -- 解锁 UNLOCK TABLES;
定时生成任务的正确开启方法:
在织梦后台→系统→系统设置→计划任务管理中,设置以下参数:
- 任务名称:生成首页
- 执行脚本:/dede/makehtml_homepage.php
- 执行时间:每天凌晨3:00(避开流量高峰)
- 状态:开启
然后在服务器crontab中添加:
* * * * * curl -s http://你的域名/dede/makehtml_homepage.php >/dev/null 2>&1
当你完成以上所有步骤后,建议立即检查服务器日志中的异常IP,封禁可疑访问源,织梦CMS的安全从来不是一次性工作,而是需要持续维护的体系,定时生成时间设置只是安全链条中的一环,真正有效的防御是从代码级到运维级的立体防护,如果你按照本文操作后仍遇到问题,欢迎在评论区交流具体报错信息。



发表评论