一、漏洞说明
该漏洞为 DedeCMS 前台代码执行漏洞,攻击者可通过构造特殊的搜索参数,触发代码执行,直接获取网站服务器控制权,属于「高危」漏洞,无需登录即可利用,影响范围极广。
- 漏洞编号:CVE-2020-18917
- 危害等级:高危
- 影响版本:DedeCMS V5.7 SP2 全版本
- 漏洞文件:/plus/search.php
- 漏洞场景:前台搜索功能,未对搜索参数进行严格过滤,导致攻击者可注入恶意代码,触发PHP代码执行。
二、代码分析
漏洞核心原因:search.php 文件中,对「搜索类型」参数(channelid)未进行过滤,直接将参数代入eval()函数执行,而eval()函数可执行任意PHP代码,攻击者通过构造恶意channelid参数,即可执行恶意代码。
关键漏洞代码(原文件片段):
<?php
// 原漏洞代码
$channelid = $_GET['channelid'];
// 未对channelid参数进行任何过滤,直接代入eval执行
eval("$rs = $dsql->GetOne("SELECT * FROM `#@__channeltype` WHERE id='$channelid'");");
if(!$rs){
echo '无效的频道ID';
exit;
}
?>
代码问题分析:
- 参数未过滤:channelid参数直接从GET请求中获取,未进行任何过滤、转义或强转,可被攻击者注入恶意代码;
- 危险函数使用不当:eval()函数是PHP中最危险的函数之一,可直接执行任意PHP代码,此处直接将用户可控参数代入,导致代码执行漏洞;
- 无参数校验:未校验channelid参数是否为合法的数字(频道ID应为整数),允许传入字符串类型的恶意参数。
漏洞利用示例(仅用于学习,请勿非法测试):
http://你的网站域名/plus/search.php?channelid=1′;phpinfo();//
上述请求会触发eval()函数执行phpinfo(),若漏洞存在,会显示服务器PHP信息;攻击者可替换为木马代码,获取服务器控制权。
三、修复方法(原位修复,不升级、不影响模板)
本修复方案通过禁用危险函数、过滤参数、修改代码逻辑,彻底封堵漏洞,不影响前台搜索功能,步骤如下:
步骤1:备份漏洞文件
备份 /plus/search.php 文件,避免修改错误导致搜索功能异常。
步骤2:修改漏洞代码(核心修复)
打开 /plus/search.php 文件,找到上述漏洞代码片段,替换为以下修复后的代码,核心是「移除eval()函数,对参数进行严格过滤」:
<?php
// 修复1:参数过滤,强转int,确保channelid为合法数字
$channelid = intval($_GET['channelid']);
// 修复2:移除eval()危险函数,直接执行SQL查询(参数已强转,无注入风险)
$rs = $dsql->GetOne("SELECT * FROM `#@__channeltype` WHERE id='$channelid'");
if(!$rs){
echo '无效的频道ID';
exit;
}
?>
步骤3:额外加固(可选,提升安全性)
- 禁用危险函数:在PHP配置文件(php.ini)中,添加 disable_functions = eval,exec,system ,禁止危险函数执行(需谨慎,避免影响网站其他功能);
- 过滤所有搜索参数:对search.php中的其他参数(如keyword、typeid等)进行过滤,添加 addslashes() 或 htmlspecialchars() 函数,防止XSS、SQL注入;
- 限制搜索请求频率:通过Apache/Nginx配置,限制单个IP的搜索请求频率,防止攻击者暴力测试。
步骤4:验证修复效果
- 访问漏洞利用示例链接,若提示「无效的频道ID」,则修复生效;
- 尝试构造其他恶意channelid参数(如 1′;phpinfo();//),无代码执行现象,修复生效;
- 测试正常搜索功能,输入关键词搜索,可正常显示结果,说明功能未受影响。
四、注意事项
- 修复后务必测试前台搜索功能,确保不影响正常使用;
- 若网站有二次开发,需确认修改后的代码与二次开发内容无冲突(尤其是涉及频道ID的逻辑);
- 该漏洞仅影响DedeCMS V5.7 SP2版本,若已升级到更高版本,可检查该文件是否存在相同问题,如有需同步修复。
本文由 流觞运维 整理,如需 DedeCMS 该漏洞代修复、全站点漏洞扫描、安全加固、挂马清理服务,可联系微信:lnmp_wuyi(备注:dede修复),支持全版本原位修复,不升级、不崩模板。