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
漏洞分析
请求处理流程
-
请求通过
/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函数实现如下:
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;
}
三个正则表达式的功能:
- 检测模板中是否包含数据库账号密码等敏感字段
- 检测类似
"$(任意空白字符){"格式的恶意代码 - 将合法模板插值(如
{$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超过上限返回falsepreg_replace超过上限返回null
绕过安全检查
通过构造足够长的payload使正则处理达到回溯上限:
-
对于
preg_replace:- 构造形如
{$a[0][0][0]...}的多维数组 - 测试发现约5k字符即可使
preg_replace返回null
- 构造形如
-
对于
preg_match:- 需要约90w字符才能达到回溯上限
- 不实用
有效payload构造
初始尝试:
{$system('whoami')}{$a[0][0][0]...}
但MyBB模板引擎无法直接解析{$system('whoami')}。
改进方案:
观察默认模板调用方式,利用$lang对象:
{$lang->load((system('whoami')))}{$a[0][0][0]...}
完整利用步骤
- 登录后台,进入模板编辑界面
- 编辑任一模板(如"online"模板)
- 插入恶意payload:
其中{$lang->load((system('whoami')))}{$a[0][0][0][0][0]...}[0][0][0]...部分需要足够长度(约5000字符) - 保存模板
- 访问触发模板解析的页面,命令将被执行
漏洞修复
官方修复方案:
- 检查
preg_match返回值不能为false - 检查
preg_replace返回值不能为null
升级到MyBB 1.8.36或更高版本可修复此漏洞。
防御建议
- 及时升级到最新版本
- 限制后台访问权限
- 对模板内容进行更严格的白名单过滤
- 考虑使用更安全的模板引擎替代方案
总结
该漏洞利用正则引擎的回溯特性绕过安全检查,展示了即使看似严格的安全机制也可能因实现细节而被绕过。开发人员应特别注意正则表达式的性能和安全影响,特别是在处理用户输入时。