DedeCMS plus/download.php SQL注入漏洞修复教程

一、漏洞说明

该漏洞属于前台SQL注入高危漏洞,主要存在于DedeCMS下载模块中,攻击者无需登录,仅需构造恶意下载请求,即可通过注入获取数据库信息,包括管理员账号密码、网站数据等,严重时可导致网站被接管。

  • 漏洞编号:公开漏洞(CNVD收录同类漏洞)
  • 危害等级:高危
  • 影响版本:DedeCMS V5.7 SP2 ~ 5.7.112(含各类衍生版本)
  • 漏洞文件:/plus/download.php
  • 漏洞场景:前台下载功能中,程序未对URL中的id参数进行严格过滤,直接代入SQL查询语句,导致攻击者可构造恶意参数触发SQL注入漏洞。

二、代码分析

漏洞核心原因:download.php 文件中,对获取的id参数未进行任何过滤、转义或类型强转,直接将其代入SQL查询语句,属于典型的SQL注入漏洞,攻击者可通过构造特殊参数,篡改SQL查询逻辑,获取敏感数据。

关键漏洞代码(原文件片段):

复制代码
<?php
// 原漏洞代码
$id = $_GET['id'];
$sql = "SELECT * FROM `#@__downloads` WHERE id='$id'";
$row = $dsql->GetOne($sql);
// 后续下载逻辑...
?>

代码问题分析:

  1. 参数未过滤:id参数直接从GET请求中获取,未进行任何过滤、转义处理,攻击者可传入包含SQL语句的恶意参数;
  2. 类型未强转:id参数应为整数类型(下载文件ID),但程序未对其进行intval强转,允许传入字符串类型的恶意参数;
  3. 未使用预处理查询:直接将用户可控参数代入SQL字符串拼接,未使用参数化查询,无法抵御SQL注入攻击。

漏洞利用示例(仅用于学习,请勿非法测试):

http://你的网站域名/plus/download.php?id=1′ UNION SELECT 1,admin,pwd,1 FROM #@__admin--

上述请求可直接获取管理员账号(admin字段)和加密密码(pwd字段),攻击者破解密码后即可登录网站后台,控制整个网站。

三、修复方法(原位修复,不升级、不影响模板)

本修复方案无需升级DedeCMS版本,仅修改漏洞文件,通过参数过滤、类型强转等方式彻底封堵SQL注入漏洞,不影响前台下载功能,步骤如下:

步骤1:备份漏洞文件

先备份 /plus/download.php 文件,建议使用命令行或FTP工具备份,备份路径示例:/plus/download.php.bak,避免修改错误导致下载功能异常,备份后可随时回滚。

步骤2:核心修复(参数过滤+类型强转)

打开 /plus/download.php 文件,找到上述漏洞代码片段,替换为以下修复后的代码:

复制代码
<?php
// 修复1:参数过滤+类型强转,确保id为整数,彻底杜绝SQL注入
$id = intval($_GET['id']);
// 修复2:修改SQL查询语句,适配强转后的整数参数
$sql = "SELECT * FROM `#@__downloads` WHERE id=".$id;
$row = $dsql->GetOne($sql);
// 后续下载逻辑...(保留原有代码,不做修改)
?>

步骤3:额外加固(可选,提升安全性)

  1. 添加参数合法性校验:在获取id参数后,添加判断逻辑,禁止空值或非法参数,代码如下:

// 新增:参数合法性校验

if(!isset(_GET\['id'\]) \|\| !is_numeric(_GET'id') || $id <= 0){

exit('非法请求,禁止访问');

}

  1. 过滤其他参数:检查download.php文件中其他用户可控参数(如cid、aid等),若存在未过滤的情况,同样添加intval强转或addslashes过滤;
  2. 限制数据库查询权限:给网站数据库账号分配最小权限,禁止其执行drop、delete等高危SQL语句,降低注入攻击的危害。

步骤4:验证修复效果

  1. 访问恶意利用链接:http://你的网站域名/plus/download.php?id=1′ and 1=2--,若提示「非法请求,禁止访问」或无有效数据返回,则修复生效;
  2. 构造其他恶意参数(如 id=1′ UNION SELECT 1,2,3,4--),无SQL注入现象,修复生效;
  3. 测试正常下载功能:访问合法的下载链接(如 http://你的网站域名/plus/download.php?id=1),可正常下载文件,说明功能未受影响。

四、注意事项

  • 修复后务必测试前台下载功能,确保所有合法下载链接均可正常使用,避免影响用户体验;
  • 若网站有二次开发(如自定义下载逻辑),需确认修改后的代码与二次开发内容无冲突,尤其是涉及id参数的逻辑;
  • 该漏洞影响多个版本,即使升级到5.7.112版本,仍需检查该文件是否存在相同问题,如有需同步修复;
  • 建议定期检查download.php文件,避免二次开发或版本更新时重新引入该漏洞。

本文由 流觞运维 整理https://www.lnmpweb.cn/archives/7485

相关推荐
唐青枫5 天前
MySQL JSON 实战详解:从存储、查询、更新到 JSON_TABLE 与索引
sql·mysql
掉头发的王富贵7 天前
【StarRocks】极限十分钟入门StarRocks
数据库·sql·mysql
两个人的幸福12 天前
Windows 桌面应用自研 PHP 队列(下):完整代码与六大工程化优化
php
zzzzzz31012 天前
9K Star 炸裂开源!这个 C 语言写的代码知识图谱,把 Linux 内核索引压缩到了 3 分钟
linux·服务器·sql
云技纵横14 天前
唯一索引 INSERT 死锁实战:5 秒复现交叉插入的 S 锁循环等待
sql·mysql
BingoGo14 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
JaguarJack14 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
用户30745969820715 天前
PHP 扩展——从入门到理解
php
鹏仔先生16 天前
拷贝漫画APP下载页PHP程序,后台带免费AI写作
php
云水一下16 天前
从零开始学 PHP 系列(一):PHP 的前世今生与开发环境搭建
开发语言·php