一、漏洞说明
该漏洞属于后台中高危漏洞,影响DedeCMS全版本,攻击者登录后台后,可利用数据库备份功能,泄露网站数据库信息(含管理员账号密码、用户数据),或恶意备份恶意SQL语句,恢复后篡改数据库、植入恶意内容,危害网站数据安全和正常运行。
- 漏洞类型:信息泄露、恶意备份
- 危害等级:中高危
- 影响版本:DedeCMS 全版本(含V5.7 SP2 ~ 5.7.118及衍生版本)
- 漏洞文件:/dede/database_backup.php
- 漏洞场景:后台数据库备份功能中,程序未对备份内容进行校验,未限制备份文件的存储路径和访问权限,攻击者可备份整个数据库获取敏感信息,或备份恶意SQL语句,恢复后篡改数据库。
二、代码分析
漏洞核心原因:database_backup.php 文件中,后台数据库备份功能未对备份的SQL内容进行校验,未限制备份文件的存储路径和访问权限,未对备份操作进行日志记录,攻击者登录后台后,可随意备份数据库、篡改备份内容,导致信息泄露或数据库被篡改。
关键漏洞代码(原文件片段):
<?php
// 原漏洞代码(后台数据库备份逻辑,存在信息泄露和恶意备份漏洞)
require_once(dirname(__FILE__)."/config.php");
$action = $_POST['action'];
$tables = $_POST['tables'];
$backupDir = $_POST['backupDir'];
if($action == 'backup'){
// 未校验备份的表和内容,直接备份
$sql = "SELECT * FROM `$tables`";
$result = $dsql->Execute($sql);
// 未限制备份文件路径,直接写入
$filename = $backupDir.'/'.date('YmdHis').'.sql';
$fp = fopen($filename, 'w');
while($row = $dsql->GetArray($result)){
fwrite($fp, $dsql->GetInsertSQL($row));
}
fclose($fp);
echo '数据库备份成功,备份文件:'.$filename;
}
?>
代码问题分析:
- 备份内容未校验:未校验备份的表和SQL内容,攻击者可备份整个数据库,获取管理员账号密码、用户数据等敏感信息;
- 存储路径未限制:未限制备份文件的存储路径,攻击者可将备份文件写入网站可访问目录,直接下载获取敏感信息;
- 无访问权限限制:备份文件未设置权限,任何人可访问下载,即使未登录后台,也可能获取备份文件;
- 无操作日志:未记录备份操作的账号、时间、内容,出现信息泄露后无法追溯;
- 无备份校验:未校验备份文件的合法性,攻击者可上传恶意备份文件,恢复后篡改数据库。
漏洞利用示例(仅用于学习,请勿非法测试):
// 1. 信息泄露:登录后台,通过数据库备份功能,备份#@__admin表,下载备份文件,获取管理员账号密码(加密可破解);
// 2. 恶意备份:构造恶意SQL语句(如 UPDATE #@__admin SET pwd=’加密密码’),备份到文件,恢复后篡改管理员密码,获取后台控制权。
三、修复方法(原位修复,不升级、不影响模板)
本修复方案无需升级DedeCMS版本,仅修改database_backup.php文件,通过限制备份范围、设置备份文件权限、添加操作日志,封堵漏洞,不影响正常数据库备份功能,步骤如下:
步骤1:备份漏洞文件
备份 /dede/database_backup.php 文件,备份路径示例:/dede/database_backup.php.bak,避免修改错误导致后台数据库备份功能异常,便于后续回滚操作。
步骤2:核心修复(限制范围+权限控制+日志记录)
打开 /dede/database_backup.php 文件,替换为以下修复后的代码,核心是限制备份范围、设置备份文件权限、添加操作日志和校验:
<?php
require_once(dirname(__FILE__)."/config.php");
// 修复1:添加权限校验,仅允许超级管理员执行备份操作
if($cuserLogin->getUserType() != 1){
exit('无权限操作,请联系超级管理员');
}
$action = addslashes($_POST['action']);
$tables = addslashes($_POST['tables']);
$backupDir = $_POST['backupDir'];
// 修复2:限制备份范围,仅允许备份系统默认表,禁止备份敏感表单独备份(可根据需求调整)
$allowTables = array('#@__archives', '#@__arctype', '#@__comment', '#@__digg');
$tablesArr = explode(',', $tables);
foreach($tablesArr as $table){
if(!in_array($table, $allowTables) && $table != '*'){
exit('禁止备份非法表,仅允许备份系统默认表');
}
}
// 修复3:限制备份文件路径,仅允许备份到dede/backup目录,禁止写入其他路径
$allowBackupDir = realpath(dirname(__FILE__).'/backup');
$backupDir = realpath($backupDir);
if(strpos($backupDir, $allowBackupDir) === false){
exit('非法备份路径,禁止备份');
}
if($action == 'backup'){
// 修复4:校验备份内容,禁止备份恶意SQL语句
$forbidSql = array('UPDATE', 'DELETE', 'DROP', 'TRUNCATE', 'ALTER');
$sql = "SELECT * FROM `$tables`";
foreach($forbidSql as $sqlChar){
if(strpos($sql, $sqlChar) !== false){
exit('备份内容包含非法SQL语句,禁止备份');
}
}
$result = $dsql->Execute($sql);
// 修复5:重命名备份文件,添加随机字符串,防止猜测文件名
$filename = $backupDir.'/'.date('YmdHis').'_'.uniqid().'.sql';
$fp = fopen($filename, 'w');
while($row = $dsql->GetArray($result)){
fwrite($fp, $dsql->GetInsertSQL($row));
}
fclose($fp);
// 修复6:设置备份文件权限为600,仅允许管理员读取
chmod($filename, 0600);
// 修复7:添加操作日志,记录备份操作
$adminName = $cuserLogin->getUserName();
$logContent = "管理员【$adminName】于".date('Y-m-d H:i:s')."备份数据库,备份表:$tables,备份文件:$filename";
$dsql->ExecuteNoneQuery("INSERT INTO `#@__admin_log` (adminname, action, logtime, content) VALUES ('$adminName', 'database_backup', ".time().", '$logContent')");
echo '数据库备份成功,备份文件:'.$filename;
}
?>
步骤3:额外加固(可选,提升安全性)
- 加密备份文件:对备份文件进行加密处理,恢复时需要输入密码,防止备份文件被非法下载后查看;
- 定期清理备份文件:设置备份文件有效期(如7天),定期自动清理过期备份文件,减少敏感信息泄露风险;
- 限制备份频率:禁止短时间内多次备份,防止攻击者频繁备份获取敏感信息;
- 校验备份文件完整性:备份完成后,校验备份文件内容,确保未被篡改;恢复备份前,校验备份文件的合法性,防止恢复恶意备份。
步骤4:验证修复效果
- 低权限账号测试:使用非超级管理员账号登录后台,尝试备份数据库,提示「无权限操作」,修复生效;
- 非法表备份测试:尝试备份#@__admin敏感表,提示「禁止备份非法表」,修复生效;
- 恶意SQL测试:尝试备份包含UPDATE、DELETE的SQL语句,提示「备份内容包含非法SQL语句」,修复生效;
- 备份文件权限测试:查看备份文件权限,为600,普通用户无法访问,修复生效;
- 正常备份测试:备份允许的系统表,可正常备份和恢复,说明功能未受影响;
- 日志测试:查看后台操作日志,可看到备份操作记录,修复生效。
四、注意事项
- 修复后需全面测试数据库备份和恢复功能,确保正常备份、正常恢复,不影响网站数据;
- 若网站有自定义表需要备份,可在allowTables数组中添加对应表名,确保不影响正常业务;
- 备份文件需妥善保管,建议定期下载到本地存储,同时删除服务器上的过期备份文件,减少敏感信息泄露风险;
- 定期查看后台操作日志,排查异常备份操作,若发现可疑记录,及时排查是否有攻击者利用漏洞;
- 若修复后出现备份失败、恢复失败的情况,可恢复备份文件,检查代码修改是否有误,或联系技术人员协助排查。
本文由 流觞运维 原创整理,如需 DedeCMS 该漏洞代修复、全站点漏洞扫描、安全加固、挂马清理服务,可联系微信:lnmp_wuyi(备注:dede修复)