Web 文件治理器elFinder 的破绽链剖析

皇冠管理端登3网址皇冠管理端登3网址(www.9cx.net)实时更新发布最新最快最有效的皇冠管理端登3网址、皇冠管理端登3手机网址,包括新2登3手机网址,新2登3备用网址,皇冠登3最新网址,新2足球登3网址,新2网址大全。

应用程序与文件系统的交互始终是高度平安敏感的,由于较小的功效破绽很容易成为可行使破绽的泉源。这种考察在web文件治理器的情形下尤其准确,其作用是复制完整文件系统的功效并以透明的方式将其公然给客户端的浏览器。

elFinder 是一种盛行的 Web 文件治理器,常用于 CMS 和框架,例如 WordPress 插件 (wp-file-manager) 或 Symfony 包,以允许对内陆和远程文件举行简朴操作。在已往,elFinder一直是针对不平安设置或现实代码破绽的活跃攻击的一部门。因此,elFinder的宣布带有一个平安的默认设置,以防止攻击者举行任何恶意使用。

作为对普遍部署的开源项目的定期评估的一部门,研究职员在elFinder中发现了多个新的代码破绽。在以下关于web文件治理器常见代码破绽的案例研究中,研究职员发现了五个差其余破绽链,并演示了若何行使它们来获得对底层服务器及其数据的控制。研究职员还将讨论一些稍后由供应商实现的补丁,以展示若何在用户的代码中防止它们。

恶意影响

我们在开发分支上事情,提交 f9c906d。观察效果也在 2.1.57 版中获得证实;都影响默认设置(除非本文尚有说明)而且不需要事先认证。正如研究职员所提到的,行使这些破绽会让攻击者在安装elFinder的服务器上执行随便PHP代码,最终导致其受到攻击。

研究职员在这篇文章中讨论的发现均分配了 CVE-2021-32682,并乐成地行使了这些发现来获得代码执行:

删除随便文件;

移动随便文件;

PHP文件上传;

参数注入;

竞争条件(Race Condition);

所有这些破绽类在向用户公然文件系统的软件中都非经常见,而且可能影响到大量产物,而不仅仅是elFinder。

elFinder宣布了2.1.59版本,以解决研究职员认真披露的所有bug。毫无疑问,这些破绽也会被普遍行使,由于针对旧版本的破绽已经被公然宣布,而毗邻器文件名是试图损坏网站时要查找的路径汇编的一部门。因此,研究职员强烈建议所有用户立刻将elFinder升级到最新版本。

手艺细节

elFinder带有一个用PHP编写的后端(也称为毗邻器)和一个用HTML和JavaScript编写的前端。毗邻器是将前端代码的操作分配给右后端代码以实现文件系统特征的主要剧本。毗邻器可以设置为阻止危险操作,将上传限制为特定的 MIME 类型:默认安装中有两种差其余类型。研究职员在所谓的“最小”毗邻器中发现了破绽。它只允许镜像和纯文本上传,FTP是唯一支持的远程虚拟文件系统:这可能是最平安的,也是最有可能部署的。

为了更好地明白研究职员将用来演示发现的代码片断,研究职员将首先形貌elFinder的路由是若何事情的。与许多现代PHP应用程序一样,毗邻器(例如connector.minimal. PHP)是唯一的入口点。它声明设置指令和闭包,然后实例化elFinder(焦点)和elFinderConnector (elFinder和传输通道之间的接口,这里是HTTP)。

属性elFinder::$commands包罗了每个有用的操作和预期的参数:

php/elFinder.class.php

用户可以通过PATH_INFO、GET或POST向cmd参数提供所需的下令参数来挪用这些下令,在每个下令处置程序中,使用$args接见参数。

为了允许远程文件系统(FTP、Dropbox等)与内陆文件系统一起使用,elFinder实现了一个文件系统抽象层(elFinderVolumeDriver) ,所有驱动程序都在该层之上构建。然后文件通过它们的卷名(例如t1_是垃圾,l1_是默认的内陆卷)和url平安的名称Base64来引用。

首先深入研究一个随便文件删除破绽链,它由两个差其余破绽组成。

删除随便文件

PHP 焦点不提供运行后台线程或执行同步和历程间通讯的有用方式。 elFinder 试图通过大量使用暂且文件和请求后挂钩来平衡这一点。例如,用户可以通过挪用同名方式来中止正在举行的操作:

php/elFinder.class.php

可以看到,[1]和[2]存在一个代码破绽:用户控制的参数在没有事先检查的情形下被毗邻到一个完整的路径中。对于[1],它最终会确立一个名称完全可控的空文件,而在[2]中,它可以用来删除随便文件。这两个破绽的SonarCloud破绽都是可用的:[1]和[2]。

由 [1] 天生的文件名将以 elfreq 为前缀,在路径遍历攻击中,若是路径中的任何足迹不存在或不是目录,POSIX系统将无法剖析路径。例如,剖析/tmp/i_do_not_exist/../或/ tmp / i_am_a_file / . ./将划分在ENOENT和ENOTDIR中运行失败。这个先决条件使得行使这两个破绽不能能按原样举行,而且需要另一个破绽,例如确立随便目录的能力。

然后攻击者可以查看下令mkdir并发现允许这种行为的原语,下面是它的顶层处置程序,泛起在它通过文件系统抽象层之前:

php/elFinder.class.php

elFinderVolumeDriver 中存在一个通用实现来处置应该确立的卷和路径。它将使用文件系统上的卷绝对路径作为第一个参数和目的名称作为第二个参数挪用 [1] 中特定于卷的实现:

php/elFinderVolumeDriver.class.php

它的界说如下:

php/elFinderVolumeLocalFileSystem.class.php

elFinderVolumeLocalFileSystem::_joinPath() 只是将两个值毗邻起来,导致路径遍历破绽。这提供了在内陆文件系统上确立随便空文件夹的原语。虽然自己不是破绽,但它将允许行使上述破绽。

同样值得注重的是,rm下令中泛起了完整路径公然,公然给定文件在内陆文件系统上的绝对路径:

php/elFinderVolumeDriver.class.php

这个破绽的影响很洪水平上取决于环境:它可能与其他的elFinder破绽连系在一起,用于在其他应用程序中触发有趣的行为(例如删除WordPress的wp-config.php文件以获得代码执行)或用于影响现有的平安措施(例如删除.htaccess文件)。

通过改善elFinderVolumeLocalFileSystem::_joinPath()的实现来断言最终路径不会在基路径之外,这个破绽已经被修复了。作为加固措施,还在代码库中添加了几个对basename()的挪用。

移动随便文件

新2代理网址

新2代理网址(www.22223388.com)实时更新发布最新最快最有效的新2网址和新2最新网址,包括新2手机网址,新2备用网址,皇冠最新网址,新2足球网址,新2网址大全。

相同的 elFinderVolumeLocalFileSystem::_joinPath() 方式用于其他操作,例如重命名:它连系了一个卷基本目录和一个用户提供的目的名称。因此,它很容易受到研究职员适才形貌的破绽的攻击。

在执行所有认真解码路径并确保允许目的扩展名的代码之后,elFinderVolumeLocalFileSystem::rename()的现实实现如下面的代码片断所示:

php/elFinderVolumeLocalFileSystem.class.php

虽然目的扩展名仍然受到 MIME 检查的严酷限制,但对于未经身份验证的攻击者来说,凭证环境,通过笼罩authorized_keys、composer.json 等文件,该原语足以在服务器上执行下令。这个破绽已经用研究职员之前讨论过的统一个补丁修复了。

上传 PHP 文件

对于大多数PHP应用程序来说,elFinder面临的最大威胁是攻击者可以将PHP剧本上传到服务器,由于没有任何器械(除了经由加固的web服务器设置)可以阻止他们直接接见它来执行它的内容。维护职员最初试图通过制作一个将危险的MIME类型与相关扩展关联起来的块列表来防御:

php/elFinderVolumeDriver.class.php

在Ubuntu 20.10上的Apache HTTP 2.4.46-1ubuntu1的测试环境中,默认设置声明 .phar 文件应该被视为 application/x-httpd-php ([1]) 并被注释为:

在Debian的稳固版本中也可以看到这种设置,虽然对文件的内容执行另一遍MIME类型检测,由于PHP注释器允许在注释文件的任何地方使用语句(例如PHP可以放在一些虚拟数据之后),因此也可以很容易被绕过。

修复很简朴:它声明 .phar 文件与默认情形下不允许的 MIME text/x-php 相关联。

参数注入

在elFinder云云壮大的默认功效中,用户可以选择多个文件,并使用zip、rar和7z等外部工具对它们举行压缩。该函数在名为archive的操作下被宣布:

php/elFinder.class.php

请注重,纵然上传文件被阻止,用户也可以通过对现有文件挪用archive下令来确立压缩,该实现特定于正在使用的虚拟文件系统。研究职员只关注默认的下令行,由于它是由elFinderVolumeLocalFileSystem继续的,elFinderVolumeLocalFileSystem确立了完整的下令行([1]),并使用默认shell([2])执行它:

php/elFinderVolumeLocalFileSystem.class.php

$name 的值来自用户控制的参数 $_GET['name'],虽然使用escapeshellarg()准确地转义以防止使用下令替换序列,但程序将实验将此值剖析为标志 (--foo=bar),然后剖析为位置参数。还值得注重的是,在选择 ZIP压缩程序的情形下,用户的值以. ZIP作为后缀。

下令压缩包实现了一个完整性测试特征(-T),可以与-TT一起使用该特征来指定要运行的测试下令。在本例中,它为攻击者提供了一种使用此参数注入执行随便下令的方式。

为了能够行使此破绽,攻击者需要确立一个虚拟文件(例如a.txt),将其压缩以确立a.zip,然后以原始文件和压缩为目的挪用压缩操作,使用的名称如下: TmTT="$(id>out.txt)foooo"。

天生的下令行将是 zip -r9 -q '-TmTT="$(id>out.txt)foooo".zip' './a.zip' './a.txt',从而执行 id 并纪录其尺度输出到 out.txt,此文件将与 elFinder 界面中的其他文档一起使用。

当需要修复这个破绽时,压缩操作不能很好的运行。通常基于POSIX的方式,故不能在此处应用,由于zip将退出,并泛起以下破绽:

然后维护职员决议在压缩名称前加上 ./ 以防止任何参数注入的风险,他们还决议在统一个补丁中增强对其他压缩程序(7z、rar等)的挪用。

隔离和竞争条件

看看研究职员在这个案例研究中的最后发现,由于压缩文件无法上传,因此无法在默认设置中行使隔离特征中的此破绽,由于设计特点,该函数可能会导致未来的平安问题。

隔离的基本原理是压缩文件可能包罗不需要的文件(主要是PHP剧本) ,若是没有首先运行平安检查(例如,使用 MIME 验证),则不应在当前文件夹中提取这些文件。因此,elFinder选择将压缩文件提取到一个名为.quarantine的文件夹中,该文件夹位于files/文件夹下,elFinderVolumeLocalFileSystem::_extract()为每个压缩文件提取天生一个随机的目录名(位于[1]):

php/elFinderVolumeLocalFileSystem.class.php

这可以通过strace或inotify套件动态确认,例如这里有一个包罗PHP文件的压缩文件:

这个历程如下:

确立了一个名为 efbf975ccbac8727f434574610a0f1b6 的文件夹;

在 efbf975ccbac8727f434574610a0f1b6 中确立了一个名为 win.php 的文件;

数据被写入win.php;

win.php被删除;

efbf975ccbac8727f434574610a0f1b6被删除;

若是服务器被设置为列出目录,这个行为很容易被行使,由于可以在 MIME 验证步骤和删除它们之前接见危险文件(例如 .php)。然而,若是无法以这种方式找到随机目录名称,那么竞争条件窗口太小而无法思量使用暴力破解的攻击。

攻击者可能会发现复制操作可用于内部文件夹,例如 .quarantine,并复制任何文件,而不管其内容若何。虽然它自己是一个无害的函数破绽,但它可以与隔离函数链接在一起,以便在删除之前复制包罗研究职员提取的压缩文件夹。复制的文件夹在界面中可见,并允许攻击者绕过随机名称接见恶意剧本,最终允许执行随便代码。

作为修复措施,维护职员决议将.quarantine文件夹移到files/之外。elFinderVolumeLocalFileSystem抽象层不知道此文件夹之外的任何内容,从而防止对.quarantine执行任何意外操作。

总结

在这个案例研究中,研究职员研究了在web文件治理器中常见的要害代码破绽。本文的研究证实无害的破绽通常可以组合起来形成有害破绽链,好比获得随便代码执行。研究职员以为,纪录和讲述这些破绽是很主要的,以缓解破绽链,并削减类似破绽的风险。

本文翻译自:https://blog.sonarsource.com/elfinder-case-study-of-web-file-manager-vulnerabilities

2022世界杯欧洲区预选赛a组赛程www.9cx.net)实时更新比分2022世界杯欧洲区预选赛a组赛程数据,2022世界杯欧洲区预选赛a组赛程全程高清免费不卡顿,100%原生直播,2022世界杯欧洲区预选赛a组赛程这里都有。给你一个完美的观赛体验。

添加回复:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。