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文件中,具体涉及以下关键点:
- UC_APPID参数可控:通过后台设置可以修改
config_ucenter.php中的UC_APPID值 - 二次注入:转义一次的字符串被写入文件后,在PHP解析时成为未转义的原始内容
- SQL语句拼接:
note_exists()函数中直接使用UC_APPID拼接SQL语句
关键代码分析
- 注入点代码 (
uc_server/model/base.php198行):
function note_exists() {
$noteexists = $this->db->result_first("SELECT value FROM ".UC_DBTABLEPRE."vars WHERE name='noteexists".UC_APPID."'");
return $noteexists ? TRUE : FALSE;
}
- UC_APPID写入逻辑 (
source/admincp/admincp_setting.php2523行):
$configfile = str_replace("define('UC_APPID', '".addslashes(UC_APPID)."')",
"define('UC_APPID', '".$settingnew['uc']['appid']."')", $configfile);
- 文件写入操作:
$fp = fopen('./config/config_ucenter.php', 'w');
@fwrite($fp, trim($configfile));
@fclose($fp);
漏洞利用条件
- 需要后台管理员权限
- 服务器配置允许文件写入
- 数据库用户具有足够权限(如FILE权限)
漏洞验证方法
基本验证
构造特殊payload写入UC_APPID:
1' into outfile 'c:\wamp64\tmp\1.txt' -- a
报错注入验证
通过构造恶意UC_APPID值触发SQL报错,获取数据库信息。
漏洞利用步骤
- 登录Discuz!后台
- 访问UCenter设置页面
- 修改UCenter配置,在APPID字段插入恶意SQL代码
- 提交保存,触发配置文件重写
- 当系统执行
note_exists()函数时触发SQL注入
修复建议
-
官方修复:
- 升级到最新版本
- 应用官方安全补丁
-
临时修复方案:
- 修改
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为只读
- 修改
-
安全配置建议:
- 数据库用户使用最小权限原则
- 禁用数据库的FILE权限
- 定期审计配置文件
漏洞危害
- 获取数据库敏感信息
- 可能的服务器文件读写
- 在特定条件下可能导致服务器沦陷
技术总结
该漏洞是典型的二次注入漏洞,主要问题在于:
- 用户输入仅经过
addslashes转义后写入文件 - 从文件读取的值直接拼接到SQL语句中
- 后台缺乏严格的输入验证
此漏洞再次提醒我们:所有外部输入都必须视为不可信的,即使是从配置文件读取的值也应进行严格验证。