发现网站被挂马,该如何紧急清理与恢复?
那是一个阴雨绵绵的下午,我突然收到服务器监控的告警——网站首页被篡改,弹出了恶意赌博广告,作为一名织梦CMS运维工程师,我立刻进入应急状态。
第一步:切断攻击源
迅速登录服务器,使用netstat -anp | grep :80检查异常连接,发现一个陌生IP频繁访问/plus/feedback.php,我立即在服务器防火墙中添加规则:iptables -A INPUT -s 恶意IP -j DROP。
第二步:诊断挂马痕迹
使用grep -rn "eval\|base64_decode\|gzinflate" /www/搜索疑似恶意代码,发现/data/tplcache/目录下存在多个被加密的PHP文件,检查/include/目录的common.inc.php文件末尾,找到了一段混淆后的恶意跳转代码。
织梦CMS安全运维实录,从应急响应到系统加固的完整指南
第三步:清理与恢复
我将整个网站目录打包备份后,立即从织梦官方下载同版本的干净源码,覆盖/include/、/plus/、/data/tplcache/等核心目录,使用sed -i 's/恶意域名//g' /www/*.php清除所有残余恶意链接。
第四步:数据库查杀
登录phpMyAdmin,在dede_archives表里搜索<script>标签,发现部分文章内容被插入了恶意iframe,我执行SQL语句:UPDATE dede_archives SET body = REPLACE(body, '恶意代码', '') WHERE body LIKE '%恶意代码%',同时检查dede_sysconfig表,确认系统参数未被篡改。
如何隐藏后台登录路径,防止暴力破解?
挂马事件追根溯源,发现攻击者是通过默认的/dede/后台路径进行爆破登录的,我决定立即修改后台路径。
第一步:修改目录名
在服务器上执行:mv /www/dede /www/admin_secret_2023,注意,此处admin_secret_2023建议使用包含数字和字母的组合,长度不少于12位。
第二步:更新配置文件
编辑/www/data/common.inc.php,将$cfg_admin_path = 'dede'改为$cfg_admin_path = 'admin_secret_2023',在/www/index.php中检查是否有硬编码的后台路径引用,一并更新。
第三步:限制访问IP
在/www/admin_secret_2023/目录下创建.htaccess文件,写入:
order allow,deny
allow from 你的公司公网IP
deny from all
如果使用Nginx,则在对应server块中添加:
location /admin_secret_2023/ {
allow 你的IP;
deny all;
}
文件权限如何设置,才能既安全又不影响运行?
清理完挂马后,我检查了文件权限设置,发现很多目录权限过于宽松,按照最小权限原则,我重新做了调整。
核心原则:
- 目录权限:755(所有者可读写执行,组和其他用户可读执行)
- 文件权限:644(所有者可读写,组和其他用户只读)
- 特殊目录:
/data/、/uploads/、/templets/设为755,但写入权限仅归Web用户
具体操作命令:
find /www -type d -exec chmod 755 {} \;
find /www -type f -exec chmod 644 {} \;
chmod -R 777 /www/data/tplcache # 模板缓存需写入
chmod -R 777 /www/data/rss
chmod -R 777 /www/uploads # 上传目录
chmod -R 755 /www/dede # 后台目录
关键检查点:
- 禁用
/data/目录的PHP执行权限:在Nginx配置中添加location /data/ { deny all; } - 检查
/uploads/目录是否有可执行文件:find /www/uploads -name "*.php" -type f,如有立即删除
如何进行整站搬家,确保数据完整迁移?
半年后,公司服务器需要升级,我不得不进行整站迁移,执行一套标准的搬家流程,可以避免数据丢失。
第一步:备份原站
打包所有文件:tar -czf www_backup_2023.tar.gz /www/
导出数据库:mysqldump -u root -p dedecmsdb > dedecmsdb.sql
第二步:新服务器环境搭建
确认PHP版本(织梦CMS推荐5.6-7.4)、MySQL版本(5.6-5.7)、Nginx/Apache配置,安装同版本的织梦CMS核心文件。
第三步:数据导入
上传备份文件到新服务器,解压:tar -xzf www_backup_2023.tar.gz -C /www/
恢复数据库:mysql -u root -p dedecmsdb < dedecmsdb.sql
第四步:修改配置文件
编辑/www/data/common.inc.php,修改数据库连接信息:
$cfg_dbhost = '新数据库地址';
$cfg_dbname = '新数据库名';
$cfg_dbuser = '新数据库用户';
$cfg_dbpwd = '新数据库密码';
同时检查$cfg_cmspath、$cfg_basehost配置。
第五步:修改目录权限
重新执行文件权限设置命令,确保/data/tplcache等目录可写。
更换域名后,如何快速替换数据库中的旧域名链接?
搬家完成后,公司启用了新域名www.newdomain.com,但数据库中还有大量旧域名www.olddomain.com的链接,手动替换不现实,我使用SQL语句批量处理。
数据库替换操作:
UPDATE dede_archives SET body = REPLACE(body, 'www.olddomain.com', 'www.newdomain.com');
UPDATE dede_addonarticle SET body = REPLACE(body, 'www.olddomain.com', 'www.newdomain.com');
UPDATE dede_arctype SET typedir = REPLACE(typedir, 'olddomain.com', 'newdomain.com');
UPDATE dede_sysconfig SET value = REPLACE(value, 'www.olddomain.com', 'www.newdomain.com') WHERE varname = 'cfg_basehost';
注意:先备份数据库再执行,如果开启了静态HTML,需要重新生成所有页面,在后台“系统”→“系统基本参数”中修改站点根网址,然后执行“生成→更新主页HTML”、“更新栏目HTML”、“更新文档HTML”。
如何正确备份与恢复数据库,避免数据灾难?
每个月初我都会执行一次数据库备份,但有一次备份文件损坏,差点酿成大祸,从此我采用双备份策略。
冷备份(每日一次):
mysqldump -u root -p --opt --single-transaction --master-data=2 dedecmsdb > /backup/dedecmsdb_$(date +%Y%m%d).sql
优点:一致性高,适合恢复。
热备份(每6小时一次,使用phpMyAdmin):
在后台使用dede_backup插件,导出为JSON格式,存入云存储。
同时开启二进制日志:在my.cnf中添加log-bin=mysql-bin,配合FLUSH LOGS;实现增量备份。
恢复操作:
- 停止Web服务:
systemctl stop nginx - 删除旧数据库:
mysql -u root -p -e "DROP DATABASE dedecmsdb;" - 创建新数据库:
mysql -u root -p -e "CREATE DATABASE dedecmsdb CHARACTER SET utf8;" - 导入备份:
mysql -u root -p dedecmsdb < 备份文件.sql - 如果使用增量备份,回放二进制日志:
mysqlbinlog mysql-bin.000005 | mysql -u root -p dedecmsdb
关键贴士:
- 备份文件命名带时间戳,方便回滚
- 至少保留最近7天的备份
- 定期测试恢复流程,确保备份可用
经过这一系列操作,网站不仅脱离了挂马危机,还建立起了一套完整的安全防御体系,织梦CMS虽然经典,但运维工作永远在路上,最好的安全不是等出事后修复,而是提前预防、定期巡检、随时准备应急响应。



发表评论