一、漏洞说明
该漏洞属于前台复合型漏洞,同时存在XSS(跨站脚本)和SQL注入风险,存在于DedeCMS评论模块,攻击者无需登录,可通过提交恶意评论内容,触发XSS攻击(劫持用户Cookie、植入恶意广告)或SQL注入(获取数据库信息、篡改评论数据),危害范围较广。
- 漏洞类型:XSS(跨站脚本)、SQL注入
- 危害等级:高危(复合型漏洞,危害叠加)
- 影响版本:DedeCMS 全版本(含V5.7 SP2 ~ 5.7.118及衍生版本)
- 漏洞文件:/plus/comment.php
- 漏洞场景:前台评论提交、评论展示功能中,程序未对评论内容、评论相关参数进行过滤和转义,导致XSS和SQL注入漏洞。
二、代码分析
漏洞核心原因:comment.php 文件中,存在两处核心漏洞点:1. 评论内容(content)未进行转义处理,直接存储和展示,导致XSS攻击;2. 评论相关参数(如aid、cid)未进行过滤,直接代入SQL查询,导致SQL注入漏洞。
关键漏洞代码(原文件片段):
<?php
// 原漏洞代码(评论提交+展示逻辑,存在XSS和SQL注入)
// 1. SQL注入漏洞:aid、cid参数未过滤
$aid = $_POST['aid'];
$cid = $_POST['cid'];
$content = $_POST['content'];
// 直接将未过滤的aid、cid代入SQL,存在注入风险
$sql = "INSERT INTO `#@__comment` (aid, cid, content, addtime) VALUES ('$aid', '$cid', '$content', ".time().")";
$dsql->ExecuteNoneQuery($sql);
// 2. XSS漏洞:评论内容未转义,直接展示
$row = $dsql->GetOne("SELECT content FROM `#@__comment` WHERE id='$id'");
echo "评论内容:".$row['content']; // 未转义,触发XSS
?>
代码问题分析:
- SQL注入问题:aid、cid参数直接从POST请求中获取,未进行过滤、转义或intval强转,可传入包含SQL语句的恶意参数,篡改查询逻辑;
- XSS问题:评论内容(content)未进行转义处理,直接存储到数据库,展示时也未进行转义,攻击者可提交包含恶意脚本的评论,劫持用户Cookie、植入恶意内容;
- 无参数校验:未对aid、cid、content等参数进行合法性校验,允许传入空值或恶意内容,进一步放大漏洞危害。
漏洞利用示例(仅用于学习,请勿非法测试):
// XSS利用:提交评论内容为 <script>alert(document.cookie)</script>,展示时触发脚本执行
// SQL注入利用:提交aid=1′ UNION SELECT 1,2,admin,pwd FROM #@__admin--,触发注入获取管理员信息
三、修复方法(原位修复,不升级、不影响模板)
本修复方案无需升级DedeCMS版本,仅修改comment.php文件,通过过滤内容、转义特殊字符,同时封堵XSS和SQL注入漏洞,不影响评论功能正常使用,步骤如下:
步骤1:备份漏洞文件
备份 /plus/comment.php 文件,备份路径示例:/plus/comment.php.bak,避免修改错误导致评论功能异常,便于后续回滚操作。
步骤2:核心修复(过滤内容、转义特殊字符)
打开 /plus/comment.php 文件,找到上述漏洞代码片段,替换为以下修复后的代码,核心是过滤注入参数、转义XSS相关特殊字符:
<?php
// 修复1:过滤SQL注入参数,aid、cid进行intval强转
$aid = intval($_POST['aid']);
$cid = intval($_POST['cid']);
// 修复2:转义评论内容,过滤XSS特殊字符,禁止恶意脚本
$content = htmlspecialchars($_POST['content'], ENT_QUOTES); // 转义特殊字符,防止XSS
$content = addslashes($content); // 过滤SQL注入特殊字符
// 修复3:修改SQL插入语句,适配过滤后的参数,消除注入风险
$sql = "INSERT INTO `#@__comment` (aid, cid, content, addtime) VALUES (".$aid.", ".$cid.", '".$content."', ".time().")";
$dsql->ExecuteNoneQuery($sql);
// 修复4:评论展示时,再次转义,双重防护XSS
$id = intval($_GET['id']);
$row = $dsql->GetOne("SELECT content FROM `#@__comment` WHERE id=".$id);
echo "评论内容:".htmlspecialchars($row['content'], ENT_QUOTES); // 转义后展示,防止XSS
?>
步骤3:额外加固(可选,提升安全性)
- 添加参数合法性校验:在获取所有参数后,添加判断逻辑,禁止空值、负数或非法内容,代码如下:
// 新增:参数合法性校验
if(empty(aid) \|\| aid <= 0 || empty(cid) \|\| cid <= 0 || empty($content)){
exit('非法请求,禁止提交空评论或无效参数');
}
- 限制评论内容长度:添加评论内容长度限制(如1-500字),禁止提交过长的恶意内容,代码如下:
if(strlen(content) \< 1 \|\| strlen(content) > 500){
exit('评论内容长度需在1-500字之间');
}
- 过滤敏感关键词:添加敏感词过滤逻辑,禁止提交包含恶意脚本、违法违规内容的评论,进一步防范XSS和恶意攻击。
步骤4:验证修复效果
- XSS验证:提交评论内容为 ,展示时恶意脚本被转义,不执行,修复生效;
- SQL注入验证:提交aid=1′ UNION SELECT 1,2,3--&cid=1,无注入现象,评论提交失败或提示非法请求,修复生效;
- 正常评论验证:提交合法评论内容,可正常存储和展示,说明功能未受影响。
四、注意事项
- 修复后需全面测试评论的提交、展示、删除(若有)等功能,确保无异常,同时确认评论内容中的特殊字符(如<、>)可正常显示(转义后不影响阅读);
- 若网站评论模块有二次开发(如评论审核、评论回复),需确认修改后的代码与二次开发内容无冲突,尤其是涉及评论内容处理的逻辑;
- 该漏洞为全版本通用漏洞,且属于复合型漏洞,危害较大,无论使用哪个版本的DedeCMS,均需优先修复;
- 建议定期清理评论区的异常评论,避免攻击者通过遗留的恶意评论触发漏洞。
本文由 流觞运维 整理https://www.lnmpweb.cn/archives/7495