一、漏洞说明
该漏洞属于后台中高危SQL注入漏洞,影响DedeCMS V5.7 SP2 ~ 5.7.116版本,攻击者登录后台后,可利用栏目管理功能中的参数未过滤漏洞,构造恶意SQL语句,执行非法查询,获取网站数据库敏感信息(如管理员账号密码、用户数据),甚至篡改数据库内容,危害网站数据安全。
- 漏洞类型:SQL注入
- 危害等级:中高危
- 影响版本:DedeCMS V5.7 SP2 ~ 5.7.116及衍生版本
- 漏洞文件:/dede/catalog_edit.php
- 漏洞场景:后台栏目编辑、删除功能中,程序未对提交的栏目ID(id参数)进行过滤和校验,直接拼接SQL语句,攻击者可构造恶意ID参数,执行SQL注入攻击,获取敏感信息。
二、代码分析
漏洞核心原因:catalog_edit.php 文件中,后台栏目管理功能(编辑、删除)未对id参数进行过滤和类型转换,直接将id参数拼接至SQL语句中,存在SQL注入漏洞,攻击者可通过构造恶意id参数,执行非法SQL查询,获取数据库敏感信息。
关键漏洞代码(原文件片段):
<?php
// 原漏洞代码(后台栏目编辑/删除逻辑,存在SQL注入漏洞)
require_once(dirname(__FILE__)."/config.php");
$action = $_POST['action'];
$id = $_POST['id']; // 未过滤、未转换类型,直接拼接SQL
if($action == 'delete'){
// 直接拼接id参数,存在SQL注入风险
$sql = "DELETE FROM `#@__arctype` WHERE id=$id";
$dsql->ExecuteNoneQuery($sql);
echo '栏目删除成功';
}elseif($action == 'edit'){
$typename = $_POST['typename'];
// 直接拼接id参数,存在SQL注入风险
$sql = "UPDATE `#@__arctype` SET typename='$typename' WHERE id=$id";
$dsql->ExecuteNoneQuery($sql);
echo '栏目编辑成功';
}
?>
代码问题分析:
- 参数未过滤:id参数直接从POST请求中获取,未进行任何过滤处理,允许传入恶意SQL语句片段;
- 未进行类型转换:id参数应为整数类型,但未进行intval转换,允许传入字符串类型的恶意参数;
- SQL语句直接拼接:将未处理的id参数直接拼接至SQL语句中,攻击者可构造恶意参数(如 id=1 OR 1=1),执行非法查询;
- 无参数合法性校验:未校验id参数是否为合法的栏目ID,允许传入任意值,扩大漏洞危害;
- 无操作日志:未记录栏目编辑、删除操作,出现SQL注入攻击后无法追溯。
漏洞利用示例(仅用于学习,请勿非法测试):
// 1. 普通管理员登录后台,访问栏目管理页面,抓包修改delete请求的id参数;
// 2. 构造恶意id参数:id=1 OR 1=1,拼接后的SQL语句为:DELETE FROM `#@__arctype` WHERE id=1 OR 1=1;
// 3. 提交请求,执行后会删除所有栏目,造成网站瘫痪;
// 4. 构造查询类恶意参数,可获取管理员账号密码:id=1 UNION SELECT 1,adminname,pwd,4 FROM `#@__admin`。
三、修复方法(原位修复,不升级、不影响模板)
本修复方案无需升级DedeCMS版本,仅修改catalog_edit.php文件,通过过滤参数、类型转换、校验参数合法性,封堵SQL注入漏洞,不影响正常栏目管理功能,步骤如下:
步骤1:备份漏洞文件
备份 /dede/catalog_edit.php 文件,备份路径示例:/dede/catalog_edit.php.bak,避免修改错误导致后台栏目管理功能异常,便于后续回滚操作。
步骤2:核心修复(过滤参数+类型转换+校验)
打开 /dede/catalog_edit.php 文件,替换为以下修复后的代码,核心是过滤参数、进行类型转换、校验参数合法性,杜绝SQL注入风险:
<?php
require_once(dirname(__FILE__)."/config.php");
// 修复1:过滤和转换参数,防止SQL注入
$action = addslashes($_POST['action']);
$id = intval($_POST['id']); // 将id转换为整数,杜绝字符串注入
$typename = addslashes($_POST['typename']); // 过滤字符串参数
// 修复2:校验id参数合法性,确保为有效栏目ID
$row = $dsql->GetOne("SELECT id FROM `#@__arctype` WHERE id=$id");
if(empty($row) && $action != 'add'){ // 新增栏目无需校验id,编辑/删除需校验
exit('栏目ID不存在,禁止操作');
}
// 修复3:获取当前登录管理员信息,用于日志记录
$currentAdmin = $cuserLogin->getUserInfo();
$adminName = $currentAdmin['adminname'];
if($action == 'delete'){
// 修复后:id已转换为整数,无SQL注入风险
$sql = "DELETE FROM `#@__arctype` WHERE id=$id";
$dsql->ExecuteNoneQuery($sql);
// 修复4:添加操作日志,记录删除操作
$logContent = "管理员【$adminName】于".date('Y-m-d H:i:s')."删除栏目,栏目ID:$id";
$dsql->ExecuteNoneQuery("INSERT INTO `#@__admin_log` (adminname, action, logtime, content) VALUES ('$adminName', 'catalog_delete', ".time().", '$logContent')");
echo '栏目删除成功';
}elseif($action == 'edit'){
// 修复后:id已转换为整数,typename已过滤,无SQL注入风险
$sql = "UPDATE `#@__arctype` SET typename='$typename' WHERE id=$id";
$dsql->ExecuteNoneQuery($sql);
// 修复4:添加操作日志,记录编辑操作
$logContent = "管理员【$adminName】于".date('Y-m-d H:i:s')."编辑栏目,栏目ID:$id,新栏目名:$typename";
$dsql->ExecuteNoneQuery("INSERT INTO `#@__admin_log` (adminname, action, logtime, content) VALUES ('$adminName', 'catalog_edit', ".time().", '$logContent')");
}elseif($action == 'add'){
// 新增栏目逻辑,补充过滤,防止连带注入
$sql = "INSERT INTO `#@__arctype` (typename) VALUES ('$typename')";
$dsql->ExecuteNoneQuery($sql);
$logContent = "管理员【$adminName】于".date('Y-m-d H:i:s')."新增栏目,栏目名:$typename";
$dsql->ExecuteNoneQuery("INSERT INTO `#@__admin_log` (adminname, action, logtime, content) VALUES ('$adminName', 'catalog_add', ".time().", '$logContent')");
echo '栏目新增成功';
}else{
exit('非法操作');
}
?>
步骤3:额外加固(可选,提升安全性)
- 限制栏目操作权限:细分栏目管理权限,仅允许超级管理员执行删除操作,普通管理员仅可编辑自己创建的栏目;
- 加强参数过滤:在网站全局配置中添加SQL注入过滤函数,对所有后台提交的参数进行统一过滤;
- 启用数据库防注入机制:在config.php中添加数据库防注入配置,禁止执行危险SQL语句;
- 定期审计栏目操作日志:定期查看栏目操作日志,排查异常操作(如批量删除栏目),及时发现攻击行为。
步骤4:验证修复效果
- SQL注入测试:构造恶意id参数(如 id=1 OR 1=1),提交后提示「栏目ID不存在」,无法执行非法SQL,修复生效;
- 非法ID测试:尝试编辑/删除不存在的栏目ID,提示「栏目ID不存在」,修复生效;
- 正常操作测试:编辑、删除、新增合法栏目,可正常操作,说明功能未受影响;
- 日志测试:查看后台操作日志,可看到栏目操作记录,修复生效;
- 参数过滤测试:传入含特殊字符的栏目名(如 ‘ OR 1=1 #),可正常保存且无注入风险,修复生效。
四、注意事项
- 该漏洞可导致数据库信息泄露、栏目被恶意删除,修复后务必全面测试,确保SQL注入漏洞已彻底封堵;
- 若网站有自定义栏目字段,需在修复代码中补充对应字段的过滤处理,避免出现连带注入风险;
- 修复后需检查所有栏目是否正常显示、编辑和删除,确保栏目管理功能正常;
- 定期查看后台操作日志,排查异常栏目操作,若发现可疑记录,及时排查是否有攻击者利用漏洞;
- 若修复后出现栏目操作失败、无法保存的情况,可恢复备份文件,检查代码修改是否有误,或联系技术人员协助排查。
本文由 流觞运维 原创整理,如需 DedeCMS 该漏洞代修复、全站点漏洞扫描、安全加固、挂马清理服务,可联系微信:lnmp_wuyi(备注:dede修复)。