凌晨三点,监控告警声划破寂静,你登录服务器,发现 /data/tplcache/ 目录下多出几十个陌生PHP文件,网站首页被篡改为赌博广告页,更棘手的是,系统计划任务每15分钟自动生成一次报错日志,不断向数据库写入恶意数据——这是织梦CMS典型的后门触发机制。
紧急挂马清理与系统恢复
1 切断攻击链路
立即执行以下命令锁定可疑进程:
# 查找异常PHP进程 ps aux | grep php | grep -v "php-fpm" # 终止非正常进程(示例进程号88321) kill -9 88321
同时修改数据库连接密码,避免攻击者复用凭据。
织梦CMS定时生成报错深度排查与应急恢复全指南
2 文件级深度清理
使用以下命令扫描最近24小时被修改的核心文件:
find /www/wwwroot -name "*.php" -mtime -1 -type f > /tmp/modified.txt
重点检查以下高危路径:
/include/taglib/下的异常标签库/plus/目录内非官方扩展文件/data/tplcache/以evil_开头的缓存模板
3 数据库应急清洗
执行SQL脚本清理恶意内容:
-- 删除article表中含iframe的注入内容
DELETE FROM `dede_archives` WHERE `body` LIKE '%<iframe%';
-- 清除管理员表中的异常字段
UPDATE `dede_admin` SET `pwd`='' WHERE `userid`='admin';
-- 重置所有用户密码复杂度
UPDATE `dede_member` SET `pwd`=MD5(CONCAT('NewSalt',id));
后台路径深度加固方案
1 动态路径隐蔽技巧
修改 /include/common.inc.php 文件中的路径定义:
// 原路径:/admin/
define('DEDEADMIN', '/admin/');
// 改为随机路径,/SysCtl-2024/
define('DEDEADMIN', '/SysCtl-'.date('Y').'/');
2 Nginx层双重拦截
在虚拟主机配置中添加:
location /admin/ {
allow 192.168.1.100;
allow 10.0.0.0/8;
deny all;
# 增加二次验证参数
if ($arg_key != 'aB3fG8k') {
return 403;
}
}
文件权限安全矩阵
1 最小权限原则配置
# 核心目录权限锁死
chmod 755 /www/wwwroot/include
chmod 644 /www/wwwroot/include/*.php
# 可写目录限制
chmod 755 /www/wwwroot/data/tplcache
chmod 755 /www/wwwroot/plus
# 移除所有目录的执行权限相关设置
find /www/wwwroot -type d -exec chmod u=rwx,g=rx,o=rx {} \;
find /www/wwwroot -type f -exec chmod u=rw,g=r,o=r {} \;
2 特殊文件防护
对config.cache.inc.php进行防覆盖保护:
chattr +i /www/wwwroot/include/config.cache.inc.php
整站搬家完整操作流程
1 数据完整导出
使用mysqldump生成防注入备份:
mysqldump -u root -p --hex-blob --routines --triggers dedecms > /backup/clean.sql
2 迁移后数据库纠正
在新服务器执行硬编码路径替换:
UPDATE `dede_addonarticle` SET `body`=REPLACE(`body`,'旧域名.com','新域名.cn'); UPDATE `dede_archives` SET `litpic`=REPLACE(`litpic`,'/uploads/','/newuploads/');
域名更换后数据替换实战
1 全表URL清洗脚本
执行Python批量替换工具:
import pymysql
conn = pymysql.connect(host='localhost', user='root', password='pass', db='dedecms')
cursor = conn.cursor()
tables = ['dede_archives', 'dede_addonarticle', 'dede_flink']
for table in tables:
cursor.execute(f"UPDATE {table} SET content=REPLACE(content, 'olddomain.com', 'newdomain.net')")
conn.commit()
2 配置残留清理
删除旧域名生成的缓存文件:
find /data/tplcache -name "*.htm" -exec rm -f {} \;
数据库备份与精准恢复
1 自动化备份脚本
编写计划任务备份脚本 /scripts/db_backup.sh:
#!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
mysqldump -u root -p'P@ssw0rd' dedecms | gzip > /backup/dedecms_${DATE}.sql.gz
# 保留最近7天备份
find /backup -name "*.sql.gz" -mtime +7 -delete
2 灾难恢复三步法
当网站完全崩溃时执行:
# 第一步:恢复原始库 mysql -u root -p'P@ssw0rd' dedecms < /backup/latest_clean.sql # 第二步:重建缓存 curl -s http://你的域名/plus/cache.php?action=make # 第三步:重置管理密码 mysql -e "UPDATE dedecms.dede_admin SET pwd='新MD5密码' WHERE id=1"
终极安全加固清单
- 禁用危险功能:在
/include/dedesql.class.php中注释checkSql()函数 - 安装WAF规则:ModSecurity规则集拦截SQL注入尝试
- 设置文件完整性检查:编写cron每6小时比对
/www/wwwroot文件hash值 - 启用双因素认证:在
/admin/login.php添加Google Authenticator验证
当再次遇到“定时生成报错”时,立即执行上述流程中的数据库应急清洗步骤,并检查/plus/task.php是否被植入恶意计划任务,织梦CMS的安全不是终点,而是持续对抗的过程,每次异常报错,都是系统安全能力升级的契机。



发表评论