Discuz! X系列全版本后台Sql注入漏洞
字数 1076 2025-08-26 22:11:40

Discuz! X系列全版本后台SQL注入漏洞分析报告

漏洞概述

Discuz! X系列全版本(截止到Discuz! X3.4 R20191201 UTF-8)存在一个后台SQL注入漏洞,该漏洞属于二次注入类型,允许攻击者在特定条件下执行任意SQL语句。

漏洞影响版本

  • Discuz! X全系列版本
  • 截止到Discuz! X3.4 R20191201 UTF-8

漏洞原理分析

漏洞根源

漏洞存在于uc_server/model/base.php文件中,具体涉及以下关键点:

  1. UC_APPID参数可控:通过后台设置可以修改config_ucenter.php中的UC_APPID
  2. 二次注入:转义一次的字符串被写入文件后,在PHP解析时成为未转义的原始内容
  3. SQL语句拼接note_exists()函数中直接使用UC_APPID拼接SQL语句

关键代码分析

  1. 注入点代码 (uc_server/model/base.php 198行):
function note_exists() {
    $noteexists = $this->db->result_first("SELECT value FROM ".UC_DBTABLEPRE."vars WHERE name='noteexists".UC_APPID."'");
    return $noteexists ? TRUE : FALSE;
}
  1. UC_APPID写入逻辑 (source/admincp/admincp_setting.php 2523行):
$configfile = str_replace("define('UC_APPID', '".addslashes(UC_APPID)."')", 
                         "define('UC_APPID', '".$settingnew['uc']['appid']."')", $configfile);
  1. 文件写入操作:
$fp = fopen('./config/config_ucenter.php', 'w');
@fwrite($fp, trim($configfile));
@fclose($fp);

漏洞利用条件

  1. 需要后台管理员权限
  2. 服务器配置允许文件写入
  3. 数据库用户具有足够权限(如FILE权限)

漏洞验证方法

基本验证

构造特殊payload写入UC_APPID

1' into outfile 'c:\wamp64\tmp\1.txt' -- a

报错注入验证

通过构造恶意UC_APPID值触发SQL报错,获取数据库信息。

漏洞利用步骤

  1. 登录Discuz!后台
  2. 访问UCenter设置页面
  3. 修改UCenter配置,在APPID字段插入恶意SQL代码
  4. 提交保存,触发配置文件重写
  5. 当系统执行note_exists()函数时触发SQL注入

修复建议

  1. 官方修复

    • 升级到最新版本
    • 应用官方安全补丁
  2. 临时修复方案

    • 修改base.php,对UC_APPID进行严格过滤:
    function note_exists() {
        $appid = intval(UC_APPID); // 强制转换为整数
        $noteexists = $this->db->result_first("SELECT value FROM ".UC_DBTABLEPRE."vars WHERE name='noteexists{$appid}'");
        return $noteexists ? TRUE : FALSE;
    }
    
    • 限制后台配置文件修改权限
    • 设置config_ucenter.php为只读
  3. 安全配置建议

    • 数据库用户使用最小权限原则
    • 禁用数据库的FILE权限
    • 定期审计配置文件

漏洞危害

  1. 获取数据库敏感信息
  2. 可能的服务器文件读写
  3. 在特定条件下可能导致服务器沦陷

技术总结

该漏洞是典型的二次注入漏洞,主要问题在于:

  1. 用户输入仅经过addslashes转义后写入文件
  2. 从文件读取的值直接拼接到SQL语句中
  3. 后台缺乏严格的输入验证

此漏洞再次提醒我们:所有外部输入都必须视为不可信的,即使是从配置文件读取的值也应进行严格验证。

Discuz ! X系列全版本后台SQL注入漏洞分析报告 漏洞概述 Discuz! X系列全版本(截止到Discuz ! X3.4 R20191201 UTF-8)存在一个后台SQL注入漏洞,该漏洞属于二次注入类型,允许攻击者在特定条件下执行任意SQL语句。 漏洞影响版本 Discuz ! X全系列版本 截止到Discuz ! X3.4 R20191201 UTF-8 漏洞原理分析 漏洞根源 漏洞存在于 uc_server/model/base.php 文件中,具体涉及以下关键点: UC_ APPID参数可控 :通过后台设置可以修改 config_ucenter.php 中的 UC_APPID 值 二次注入 :转义一次的字符串被写入文件后,在PHP解析时成为未转义的原始内容 SQL语句拼接 : note_exists() 函数中直接使用 UC_APPID 拼接SQL语句 关键代码分析 注入点代码 ( uc_server/model/base.php 198行): UC_ APPID写入逻辑 ( source/admincp/admincp_setting.php 2523行): 文件写入操作 : 漏洞利用条件 需要后台管理员权限 服务器配置允许文件写入 数据库用户具有足够权限(如FILE权限) 漏洞验证方法 基本验证 构造特殊payload写入 UC_APPID : 报错注入验证 通过构造恶意 UC_APPID 值触发SQL报错,获取数据库信息。 漏洞利用步骤 登录Discuz !后台 访问UCenter设置页面 修改UCenter配置,在APPID字段插入恶意SQL代码 提交保存,触发配置文件重写 当系统执行 note_exists() 函数时触发SQL注入 修复建议 官方修复 : 升级到最新版本 应用官方安全补丁 临时修复方案 : 修改 base.php ,对 UC_APPID 进行严格过滤: 限制后台配置文件修改权限 设置 config_ucenter.php 为只读 安全配置建议 : 数据库用户使用最小权限原则 禁用数据库的FILE权限 定期审计配置文件 漏洞危害 获取数据库敏感信息 可能的服务器文件读写 在特定条件下可能导致服务器沦陷 技术总结 该漏洞是典型的二次注入漏洞,主要问题在于: 用户输入仅经过 addslashes 转义后写入文件 从文件读取的值直接拼接到SQL语句中 后台缺乏严格的输入验证 此漏洞再次提醒我们:所有外部输入都必须视为不可信的,即使是从配置文件读取的值也应进行严格验证。