一、漏洞说明
该漏洞属于后台高危文件写入漏洞,影响DedeCMS全版本,攻击者登录后台后,可利用模板编辑功能,在模板文件中写入PHP木马代码,直接获取网站服务器控制权,属于「最高危」后台漏洞,利用难度极低,危害极大。
- 漏洞类型:后台文件写入
- 危害等级:最高危
- 影响版本:DedeCMS 全版本(含V5.7 SP2 ~ 5.7.118及衍生版本)
- 漏洞文件:/templets_edit.php
- 漏洞场景:后台模板编辑功能中,程序未对模板编辑内容进行严格过滤,允许写入PHP代码,且模板文件为.php格式,可直接执行,攻击者可通过编辑模板,写入木马代码,实现Getshell。
二、代码分析
漏洞核心原因:templets_edit.php 文件中,后台模板编辑功能未对用户提交的模板内容进行任何过滤,直接将内容写入模板文件(.php格式),而模板文件可被服务器直接执行,攻击者登录后台后,编辑任意模板文件,写入PHP木马代码,即可获取服务器控制权。
关键漏洞代码(原文件片段):
<?php
// 原漏洞代码(后台模板编辑逻辑,存在文件写入漏洞)
require_once(dirname(__FILE__)."/config.php");
$filename = $_POST['filename'];
$content = $_POST['content'];
// 未对content内容进行过滤,直接写入文件
$fp = fopen($filename, 'w');
fwrite($fp, $content);
fclose($fp);
echo '模板编辑成功';
?>
代码问题分析:
- 内容未过滤:content参数(模板内容)直接从POST请求中获取,未进行任何过滤、转义处理,允许写入PHP代码、木马文件等恶意内容;
- 文件路径未限制:未对filename参数进行严格校验,攻击者可修改filename参数,写入任意路径的.php文件,扩大漏洞危害;
- 无权限额外校验:虽为后台漏洞,但未对模板编辑权限进行细分,只要登录后台,拥有模板编辑权限的账号均可利用该漏洞;
- 无内容校验:未校验模板内容的合法性,允许写入任意长度、任意类型的内容,进一步放大漏洞危害。
漏洞利用示例(仅用于学习,请勿非法测试):
// 后台模板编辑时,在模板内容中写入PHP木马代码: <?php @eval($_POST[pass]);?>
// 保存后,访问该模板文件,即可通过木马连接工具控制网站服务器
三、修复方法(原位修复,不升级、不影响模板)
本修复方案无需升级DedeCMS版本,仅修改templets_edit.php文件,通过过滤模板内容、限制文件路径、细分权限,彻底封堵文件写入漏洞,不影响模板编辑正常功能,步骤如下:
步骤1:备份漏洞文件
备份 /templets_edit.php 文件,备份路径示例:/templets_edit.php.bak,避免修改错误导致后台模板编辑功能异常,便于后续回滚操作。
步骤2:核心修复(过滤内容+限制路径+权限校验)
打开 /templets_edit.php 文件,替换为以下修复后的代码,核心是过滤恶意内容、限制文件路径、添加权限校验,杜绝Getshell风险:
<?php
require_once(dirname(__FILE__)."/config.php");
// 修复1:添加权限校验,仅允许超级管理员编辑模板(细分权限,降低风险)
if($cuserLogin->getUserType() != 1){
exit('无权限操作,请联系超级管理员');
}
$filename = $_POST['filename'];
$content = $_POST['content'];
// 修复2:限制文件路径,仅允许编辑templets目录下的.php模板文件,禁止写入其他路径
$allowDir = realpath(dirname(__FILE__).'/templets');
$filename = realpath($filename);
if(strpos($filename, $allowDir) === false || pathinfo($filename, PATHINFO_EXTENSION) != 'php'){
exit('非法文件路径,禁止编辑');
}
// 修复3:过滤模板内容,禁止写入PHP恶意代码和危险函数
$forbidChars = array('<?php', '?>', 'eval', 'exec', 'system', 'shell_exec', 'passthru', 'file_put_contents', 'fopen', 'unlink', 'phpinfo');
foreach($forbidChars as $char){
if(strpos($content, $char) !== false){
exit('模板内容包含非法字符,禁止提交');
}
}
// 修复4:转义特殊字符,进一步防范恶意内容
$content = htmlspecialchars($content, ENT_QUOTES);
// 保留原有写入逻辑,确保模板编辑功能正常
$fp = fopen($filename, 'w');
fwrite($fp, $content);
fclose($fp);
echo '模板编辑成功';
?>
步骤3:额外加固(可选,提升安全性)
- 限制模板编辑频率:通过Session记录用户编辑时间,禁止短时间内多次编辑模板,防止攻击者快速尝试写入恶意代码;
- 备份模板文件:定期备份templets目录下的所有模板文件,若发现模板被篡改,可及时恢复,降低损失;
- 修改模板文件权限:将templets目录下的模板文件权限设置为644(只读),编辑时临时改为666,编辑完成后恢复为644,防止恶意写入;
- 禁用PHP文件写入函数:在php.ini中添加 disable_functions = file_put_contents,fopen,fwrite,禁止危险写入函数(需谨慎,避免影响网站其他正常功能)。
步骤4:验证修复效果
- 低权限账号测试:使用非超级管理员账号登录后台,访问templets_edit.php,提示「无权限操作」,修复生效;
- 恶意路径测试:尝试编辑非templets目录下的文件(如 /config.php),提示「非法文件路径」,修复生效;
- 恶意内容测试:在模板内容中写入PHP木马代码(如 ),提示「模板内容包含非法字符」,修复生效;
- 正常编辑测试:编辑合法模板内容(如HTML、织梦标签),可正常保存和展示,说明功能未受影响。
四、注意事项
- 该漏洞利用难度极低、危害极大,修复后务必全面测试,确保漏洞已彻底封堵,避免攻击者登录后台后Getshell;
- 若网站模板有二次开发(如自定义标签、模板引入),需确认修改后的代码与二次开发内容无冲突,尤其是模板内容过滤部分;
- 修复后需定期检查templets目录下的模板文件,排查是否有恶意代码植入,若发现异常,及时恢复备份文件;
- 建议仅给超级管理员分配模板编辑权限,其他后台账号取消该权限,降低漏洞利用风险;
- 若修复后出现模板编辑失败、无法保存的情况,可恢复备份文件,检查代码修改是否有误,或联系技术人员协助排查。
本文由 流觞运维 原创整理,如需 DedeCMS 该漏洞代修复、全站点漏洞扫描、安全加固、挂马清理服务,可联系微信:lnmp_wuyi(备注:dede修复)