织梦CMS(Dedecms)模板系统存在多个高危漏洞,主要源于模板解析机制不完善和权限验证缺失。攻击者可通过上传恶意模板文件获取服务器权限,或通过模板注入执行任意代码。受影响版本包括V5.7及以下所有版本,特别是未及时更新安全补丁的系统。
下载专用检测脚本到本地环境:
wget https://raw.githubusercontent.com/dedecms-scanner/dedecms-vuln-check/main/check.py
python check.py -u http://yourdomain.com
执行完整备份命令:
tar -czf dede_backup_$(date +%Y%m%d).tar.gz /var/www/html/dedecms/
mysqldump -u root -p dedecms_db > dede_db_$(date +%Y%m%d).sql
编辑文件 /dede/templets_one_edit.php,在第85行附近找到上传处理代码,修改为:
// 原漏洞代码替换
$uploadfile = $cfg_basedir.$cfg_templets_dir."/".$filename;
// 修改后安全代码
$allowed_ext = array('htm', 'html', 'css', 'js');
$file_ext = pathinfo($filename, PATHINFO_EXTENSION);
if(!in_array(strtolower($file_ext), $allowed_ext)) {
ShowMsg("禁止上传非模板文件", "-1");
exit();
}
$filename = preg_replace('/[^a-zA-Z0-9_\-\.]/', '', $filename);
$uploadfile = $cfg_basedir.$cfg_templets_dir."/".$filename;
修改 /include/dedetag.class.php,在ParseTemplet()函数开头添加:
function ParseTemplet($filename) {
// 新增安全过滤
if(preg_match('/\<\?php|\<\?=|eval\(|base64_decode|system\(|exec\(/i', file_get_contents($filename))) {
die('检测到恶意代码,模板解析终止');
}
// 原有代码继续...
}
执行以下权限设置命令:
chmod 755 /var/www/html/dedecms/
chmod 644 /var/www/html/dedecms/.php
chmod 000 /var/www/html/dedecms/data/
chmod 000 /var/www/html/dedecms/uploads/
chmod 644 /var/www/html/dedecms/templets/.htm
chmod 644 /var/www/html/dedecms/templets/.html
修改 /data/common.inc.php 文件权限:
chmod 400 /data/common.inc.php
chown www-data:www-data /data/common.inc.php
创建 /data/safe.inc.php 文件:
$value) {
$_GET[$key] = htmlspecialchars($value, ENT_QUOTES);
}
?>
在 /config.inc.php 文件开头添加:

require_once(dirname(__FILE__).'/data/safe.inc.php');
在Nginx配置文件中添加以下规则:
location ~ \.(php|php5)$ {
禁止访问敏感目录
location ~ ^/(data|uploads|templets)/.\.php$ {
deny all;
}
限制文件上传大小
client_max_body_size 10M;
安全头部
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options DENY;
add_header X-XSS-Protection "1; mode=block";
}
禁止访问模板文件
location ~ \.(tpl|htm|html)$ {
if ($request_uri ~ "\.(tpl|htm|html)$") {
return 403;
}
}
在.htaccess文件中添加:
Order Allow,Deny
Deny from all
Order Allow,Deny
Allow from all
禁止目录浏览
Options -Indexes
保护配置文件
Order Allow,Deny
Deny from all
使用以下脚本扫描模板文件:
!/bin/bash
find /var/www/html/dedecms/templets -name ".htm" -o -name ".html" | while read file; do
if grep -q "<\?php\|eval(\|base64_decode" "$file"; then
echo "发现恶意文件: $file"
自动备份并清理
cp "$file" "$file.bak"
sed -i '/<\?php\|eval(\|base64_decode/d' "$file"
fi
done
创建测试文件 test_vuln.html:
{dede:php}
echo "测试代码";
{/dede:php}
上传到模板目录,访问测试页面应显示空白或错误信息,而不是执行PHP代码。
创建监控脚本 /root/check_dede.sh:
!/bin/bash
LOG_FILE="/var/log/dede_security.log"
TEMPLATE_DIR="/var/www/html/dedecms/templets"
检查文件修改
find $TEMPLATE_DIR -type f -name ".htm" -o -name ".html" | while read file; do
if [ -f "$file" ]; then
MTIME=$(stat -c %Y "$file")
NOW=$(date +%s)
DIFF=$((NOW - MTIME))
if [ $DIFF -lt 300 ]; then
echo "$(date): 文件 $file 在5分钟内被修改" >> $LOG_FILE
发送警报
echo "警报:模板文件异常修改" | mail -s "织梦安全警报" admin@yourdomain.com
fi
fi
done
检查新增文件
find $TEMPLATE_DIR -type f -mmin -5 | while read file; do
echo "$(date): 发现新增文件 $file" >> $LOG_FILE
done
添加到crontab每5分钟执行一次:
/5 /root/check_dede.sh
立即执行以下操作:
确认安全后执行恢复:
从备份恢复
tar -xzf dede_backup_20240101.tar.gz -C /var/www/html/
mysql -u root -p dedecms_db < dede_db_20240101.sql
重新应用安全配置
chmod 755 /var/www/html/dedecms/
chmod 644 /var/www/html/dedecms/templets/.htm
chmod 000 /var/www/html/dedecms/data/
下一篇: 手把手教你织梦模板源码修改,避坑指南
易频IT社区是综合性互联网IT技术门户网站,专注分享网络技术、服务器运维、网络安全、编程开发、系统架构、云计算、大数据等行业干货,实时更新IT行业资讯、零基础教程、实战案例,为IT从业者、技术爱好者提供专业的学习交流平台。
Copyright © 2021-2026 易频IT社区. All Rights Reserved. 备案号:闽ICP备2023013482号 网站地图