MyBB <= 1.8.20: From Stored XSS to RCE
字数 1626 2025-08-27 12:33:23

MyBB <= 1.8.20: 从存储型XSS到RCE漏洞分析与利用教学

漏洞概述

本教学文档详细分析MyBB论坛软件1.8.20及之前版本中存在的两个关键安全漏洞:

  1. 存储型XSS漏洞:通过精心构造的[video] bbcode实现跨站脚本攻击
  2. RCE漏洞:通过管理员面板中的样式表文件创建功能实现远程代码执行

这两个漏洞可形成攻击链,攻击者仅需一个普通论坛账号,通过向管理员发送恶意私信,当管理员查看私信时即可完全接管服务器。

受影响版本

MyBB 1.8.20及之前所有版本

漏洞技术分析

第一部分:存储型XSS漏洞

MyBB渲染流程

MyBB解析和渲染主题、帖子、私信分为三个步骤:

  1. 转义处理:转义所有HTML标记和双引号
  2. 视频bbcode处理:将[video] mycodes转换为嵌入视频的<iframe>标签
  3. 其他bbcode处理:将所有其他mycode(如[url]、[quote]、[email])转换为HTML标记

漏洞成因

问题出在[video] bbcode与其他bbcode的不同处理方式上:

  1. [video] bbcode在第一步就被转换为<iframe>标签
  2. 转换过程中会调用urlcode()方法处理视频URL
  3. urlcode()方法允许通过URL编码绕过正则保护,注入其他bbcode

攻击向量构造

攻击者可构造如下恶意[video] bbcode:

[video]youtube.com/xyz[url]http://onload=evilCode()[/url][/video]

经过MyBB处理后,会生成以下恶意HTML:

<iframe src="youtube.com/xyz<a href="http://onload=evilCode(iframe>">

这导致:

  • iframe的src属性被注入的href属性和其引号关闭
  • onload事件处理程序被注入到<iframe>标签中
  • 当iframe加载时自动执行恶意JavaScript代码

关键代码分析

漏洞关键在于urlcode()方法的调用,它允许绕过正则保护并通过URL编码注入[url] bbcode。

第二部分:RCE漏洞

管理员面板漏洞

MyBB管理员可以在管理面板中:

  1. 管理活动主题的样式表
  2. 创建新的样式表文件并指定文件名

文件扩展名限制

代码中对文件扩展名有限制,只允许.css扩展名:

// 伪代码
if (!endsWith($filename, '.css')) {
    die("Invalid file extension");
}

数据库截断漏洞

关键点:

  1. 样式表文件名存储在MySQL的mybb_themestylesheets表中
  2. name列定义为varchar(30)
  3. 通过XML导入时未检查文件名长度
  4. MySQL默认会将超长字符串截断为30字符

攻击方法

攻击者可构造如下文件名:

aaaaaaaaaaaaaaaaaaaaa.php.css

(共34个字符)

处理过程:

  1. 通过.css扩展名检查
  2. 插入数据库时被截断为30字符:aaaaaaaaaaaaaaaaaaaaa.php
  3. 最终在文件系统中创建.php文件而非.css文件

漏洞利用链

完整攻击流程:

  1. 攻击者注册普通论坛账号
  2. 构造包含恶意[video] bbcode的私信发送给管理员
    • 恶意JS代码利用管理员权限创建恶意样式表文件
  3. 管理员查看私信时触发XSS
  4. XSS利用管理员会话创建PHP webshell
  5. 攻击者访问webshell获得服务器控制权

漏洞修复方案

MyBB在1.8.21版本中修复了这些漏洞,主要修复措施包括:

  1. 改进bbcode解析逻辑,防止bbcode嵌套注入
  2. 加强文件名验证,防止截断攻击
  3. 增加导入时的长度检查

防御建议

  1. 立即升级到MyBB 1.8.21或更高版本
  2. 限制普通用户使用[video] bbcode的权限
  3. 实施内容安全策略(CSP)缓解XSS影响
  4. 管理员应使用独立浏览器或会话管理前后台

时间线

  • 2019/04/29:漏洞报告给MyBB团队
  • 2019/04/29:MyBB确认漏洞
  • 2019/06/10:MyBB发布修复版本1.8.21

参考资源

MyBB <= 1.8.20: 从存储型XSS到RCE漏洞分析与利用教学 漏洞概述 本教学文档详细分析MyBB论坛软件1.8.20及之前版本中存在的两个关键安全漏洞: 存储型XSS漏洞 :通过精心构造的[ video ] bbcode实现跨站脚本攻击 RCE漏洞 :通过管理员面板中的样式表文件创建功能实现远程代码执行 这两个漏洞可形成攻击链,攻击者仅需一个普通论坛账号,通过向管理员发送恶意私信,当管理员查看私信时即可完全接管服务器。 受影响版本 MyBB 1.8.20及之前所有版本 漏洞技术分析 第一部分:存储型XSS漏洞 MyBB渲染流程 MyBB解析和渲染主题、帖子、私信分为三个步骤: 转义处理 :转义所有HTML标记和双引号 视频bbcode处理 :将[ video] mycodes转换为嵌入视频的 <iframe> 标签 其他bbcode处理 :将所有其他mycode(如[ url]、[ quote]、[ email ])转换为HTML标记 漏洞成因 问题出在[ video ] bbcode与其他bbcode的不同处理方式上: [ video] bbcode在第一步就被转换为 <iframe> 标签 转换过程中会调用 urlcode() 方法处理视频URL urlcode() 方法允许通过URL编码绕过正则保护,注入其他bbcode 攻击向量构造 攻击者可构造如下恶意[ video ] bbcode: 经过MyBB处理后,会生成以下恶意HTML: 这导致: iframe的src属性被注入的href属性和其引号关闭 onload事件处理程序被注入到 <iframe> 标签中 当iframe加载时自动执行恶意JavaScript代码 关键代码分析 漏洞关键在于 urlcode() 方法的调用,它允许绕过正则保护并通过URL编码注入[ url ] bbcode。 第二部分:RCE漏洞 管理员面板漏洞 MyBB管理员可以在管理面板中: 管理活动主题的样式表 创建新的样式表文件并指定文件名 文件扩展名限制 代码中对文件扩展名有限制,只允许.css扩展名: 数据库截断漏洞 关键点: 样式表文件名存储在MySQL的 mybb_themestylesheets 表中 name 列定义为varchar(30) 通过XML导入时未检查文件名长度 MySQL默认会将超长字符串截断为30字符 攻击方法 攻击者可构造如下文件名: (共34个字符) 处理过程: 通过.css扩展名检查 插入数据库时被截断为30字符: aaaaaaaaaaaaaaaaaaaaa.php 最终在文件系统中创建.php文件而非.css文件 漏洞利用链 完整攻击流程: 攻击者注册普通论坛账号 构造包含恶意[ video ] bbcode的私信发送给管理员 恶意JS代码利用管理员权限创建恶意样式表文件 管理员查看私信时触发XSS XSS利用管理员会话创建PHP webshell 攻击者访问webshell获得服务器控制权 漏洞修复方案 MyBB在1.8.21版本中修复了这些漏洞,主要修复措施包括: 改进bbcode解析逻辑,防止bbcode嵌套注入 加强文件名验证,防止截断攻击 增加导入时的长度检查 防御建议 立即升级到MyBB 1.8.21或更高版本 限制普通用户使用[ video ] bbcode的权限 实施内容安全策略(CSP)缓解XSS影响 管理员应使用独立浏览器或会话管理前后台 时间线 2019/04/29:漏洞报告给MyBB团队 2019/04/29:MyBB确认漏洞 2019/06/10:MyBB发布修复版本1.8.21 参考资源 利用视频演示: https://blog.ripstech.com/videos/mybb-stored-xss-to-rce.mp4 MyBB官方网站: https://mybb.com/