CVE-2023-41362 mybb模板注入漏洞分析
字数 1436 2025-08-20 18:17:58

MyBB模板注入漏洞(CVE-2023-41362)深入分析与利用

漏洞概述

MyBB是一款免费的开源论坛软件,使用PHP开发,支持用户自定义模板。在MyBB<1.8.36的版本中,存在模板注入漏洞(CVE-2023-41362),攻击者可以通过精心构造的模板内容绕过安全限制,最终导致远程代码执行。

漏洞位置

漏洞位于后台的模板编辑功能处,具体路径为:

/admin/index.php?module=style-templates&action=edit_template

漏洞分析

请求处理流程

  1. 请求通过/admin/index.php处理,module参数被"-"分割:

    • module=style-templates$run_module=style$action_file=templates
    • 最终包含/admin/modules/style/templates.php
  2. templates.php中,接收action参数执行编辑模板操作:

    • 先进行安全检查(check_template)
    • 通过后更新数据库中的模板内容
    • 访问模板时通过eval函数执行模板内容

漏洞利用途径

有两种可能的利用方案:

  1. 绕过check_template的限制注入恶意代码
  2. 通过SQL注入直接向数据库写入恶意模板代码

安全检查机制

check_template函数实现如下:

function check_template($template) {
    // 检查是否包含数据库配置信息
    if (preg_match('#\$config\database[database|hostname|password|table_prefix|username)i#', $template)) {
        return true;
    }
    
    // 检查系统调用(反引号)
    if (preg_match('#\$\s*\{#', $template)) {
        return true;
    }
    
    // 其他恶意行为检查
    if (preg_match("~s", preg_replace('~a-zA-Z_][a-zA-Z_0-9]a-zA-Z_][a-zA-Z_0-9]*|\
$$
\s*a-zA-Z_0-9]+\\2\
$$
\s*', '', $template))) {
        return true;
    }
    
    return false;
}

三个正则表达式的功能:

  1. 检测模板中是否包含数据库账号密码等敏感字段
  2. 检测类似"$(任意空白字符){"格式的恶意代码
  3. 将合法模板插值(如{$a}, {$a->bbb}, {$a[bbb]}, {$a[b][b][b]})替换为空后,检查是否仍包含恶意插值

正则回溯漏洞

PHP使用PCRE库实现正则表达式,属于NFA(非确定性有限状态自动机)引擎,存在回溯问题。

回溯示例

preg_match('/.*\d+/', '<d>A</d><d>123</d>');

这个匹配会导致多次回溯,回溯次数与数字部分长度成正比。

PHP为防止ReDoS攻击,设置了回溯次数上限:

  • preg_match超过上限返回false
  • preg_replace超过上限返回null

绕过安全检查

通过构造足够长的payload使正则处理达到回溯上限:

  1. 对于preg_replace

    • 构造形如{$a[0][0][0]...}的多维数组
    • 测试发现约5k字符即可使preg_replace返回null
  2. 对于preg_match

    • 需要约90w字符才能达到回溯上限
    • 不实用

有效payload构造

初始尝试:

{$system('whoami')}{$a[0][0][0]...}

但MyBB模板引擎无法直接解析{$system('whoami')}

改进方案:
观察默认模板调用方式,利用$lang对象:

{$lang->load((system('whoami')))}{$a[0][0][0]...}

完整利用步骤

  1. 登录后台,进入模板编辑界面
  2. 编辑任一模板(如"online"模板)
  3. 插入恶意payload:
    {$lang->load((system('whoami')))}{$a[0][0][0][0][0]...}
    
    其中[0][0][0]...部分需要足够长度(约5000字符)
  4. 保存模板
  5. 访问触发模板解析的页面,命令将被执行

漏洞修复

官方修复方案:

  1. 检查preg_match返回值不能为false
  2. 检查preg_replace返回值不能为null

升级到MyBB 1.8.36或更高版本可修复此漏洞。

防御建议

  1. 及时升级到最新版本
  2. 限制后台访问权限
  3. 对模板内容进行更严格的白名单过滤
  4. 考虑使用更安全的模板引擎替代方案

总结

该漏洞利用正则引擎的回溯特性绕过安全检查,展示了即使看似严格的安全机制也可能因实现细节而被绕过。开发人员应特别注意正则表达式的性能和安全影响,特别是在处理用户输入时。

MyBB模板注入漏洞(CVE-2023-41362)深入分析与利用 漏洞概述 MyBB是一款免费的开源论坛软件,使用PHP开发,支持用户自定义模板。在MyBB <1.8.36的版本中,存在模板注入漏洞(CVE-2023-41362),攻击者可以通过精心构造的模板内容绕过安全限制,最终导致远程代码执行。 漏洞位置 漏洞位于后台的模板编辑功能处,具体路径为: 漏洞分析 请求处理流程 请求通过 /admin/index.php 处理, module 参数被"-"分割: module=style-templates → $run_module=style 和 $action_file=templates 最终包含 /admin/modules/style/templates.php 在 templates.php 中,接收 action 参数执行编辑模板操作: 先进行安全检查( check_template ) 通过后更新数据库中的模板内容 访问模板时通过 eval 函数执行模板内容 漏洞利用途径 有两种可能的利用方案: 绕过 check_template 的限制注入恶意代码 通过SQL注入直接向数据库写入恶意模板代码 安全检查机制 check_template 函数实现如下: 三个正则表达式的功能: 检测模板中是否包含数据库账号密码等敏感字段 检测类似 "$(任意空白字符){" 格式的恶意代码 将合法模板插值(如 {$a} , {$a->bbb} , {$a[bbb]} , {$a[b][b][b]} )替换为空后,检查是否仍包含恶意插值 正则回溯漏洞 PHP使用PCRE库实现正则表达式,属于NFA(非确定性有限状态自动机)引擎,存在回溯问题。 回溯示例 : 这个匹配会导致多次回溯,回溯次数与数字部分长度成正比。 PHP为防止ReDoS攻击,设置了回溯次数上限: preg_match 超过上限返回 false preg_replace 超过上限返回 null 绕过安全检查 通过构造足够长的payload使正则处理达到回溯上限: 对于 preg_replace : 构造形如 {$a[0][0][0]...} 的多维数组 测试发现约5k字符即可使 preg_replace 返回 null 对于 preg_match : 需要约90w字符才能达到回溯上限 不实用 有效payload构造 初始尝试: 但MyBB模板引擎无法直接解析 {$system('whoami')} 。 改进方案: 观察默认模板调用方式,利用 $lang 对象: 完整利用步骤 登录后台,进入模板编辑界面 编辑任一模板(如"online"模板) 插入恶意payload: 其中 [0][0][0]... 部分需要足够长度(约5000字符) 保存模板 访问触发模板解析的页面,命令将被执行 漏洞修复 官方修复方案: 检查 preg_match 返回值不能为 false 检查 preg_replace 返回值不能为 null 升级到MyBB 1.8.36或更高版本可修复此漏洞。 防御建议 及时升级到最新版本 限制后台访问权限 对模板内容进行更严格的白名单过滤 考虑使用更安全的模板引擎替代方案 总结 该漏洞利用正则引擎的回溯特性绕过安全检查,展示了即使看似严格的安全机制也可能因实现细节而被绕过。开发人员应特别注意正则表达式的性能和安全影响,特别是在处理用户输入时。