WolfCMS0.8.2中存在任意文件上传漏洞
优采云 发布时间: 2021-05-12 19:25WolfCMS0.8.2中存在任意文件上传漏洞
一、狼cms简介
Wolf cms是一个内容管理系统(cms),是根据GNU通用公共许可证v3发行的免费软件。 Wolf cms用PHP语言编写,是Frog cms的一个分支。在2010年Packet Publishing开放源代码项目奖中,“最有前途的开放源代码项目”类别达到了决赛。
该软件的官方网站为:
二、 Wolf cms 0. 8. 2具有任意文件上传漏洞2. 1 Wolf cms 0. 8. 2版本的漏洞概述
早在2015年4月,Wolf cms被发现在其后端具有任意文件上传漏洞。攻击者可以利用此漏洞来上传恶意PHP文件。最终结果是系统由攻击者控制并且可以执行任意指令。该漏洞专门出现在文件管理功能中,该功能最初为管理员提供了一个界面来管理文件。
在此版本的代码中,对允许上传的文件类型没有限制。因此,攻击者可以上载一个PHP Shell文件,该文件中的代码是恶意的,从而导致对系统的完全控制。
2. 2 Wolf cms 0. 8. 2版本利用过程
网站环境是在本地构建的,其攻击过程如下所示:
在“文件”标签中,点击右下角的“上传文件”选项以执行上传操作
选择要上传的单句木马文件,在这种情况下,其名称为“ ma 2. php”
您可以看到此webshell文件已成功上传到网站。
系统还提供编辑文件的功能。在这里,我们可以检查刚刚上传的webshell的代码。
通过一个语句的*敏*感*词*木马客户端将该木马连接起来,发现它可以执行,从而证明攻击者可以利用此漏洞来完全控制它网站。
2. 3漏洞源代码分析
漏洞点出现在:/wolf/plugins/file_manager/FileManagerController.php
从302行到339行是实现上传功能的upload()函数。
首先,让我们一一解读代码的功能
if (!AuthUser::hasPermission('file_manager_upload')) {
Flash::set('error', __('You do not have sufficient permissions to upload a file.'));
redirect(get_url('plugin/file_manager/browse/'));
}
这是为了验证用户是否具有上传文件的权限,如果没有,则打印警告消息,然后将浏览器重定向到“ plugin / file_manager / browse /”位置。
下一步是检查CSRF令牌,以防止CSRF攻击通过标签发生。
if (isset($_POST['csrf_token']))
{
$csrf_token = $_POST['csrf_token'];
if (!SecureToken::validateToken($csrf_token, BASE_URL.'plugin/file_manager/upload')) {
Flash::set('error', __('Invalid CSRF token found!'));
redirect(get_url('plugin/file_manager/browse/'));
}
}
else {
Flash::set('error', __('No CSRF token found!'));
redirect(get_url('plugin/file_manager/browse/'));
}
此代码首先检查在POST请求中是否设置了变量csrf_token。如果已设置,则将此值分配给$ csrf_token,然后通过SecureToken :: validateToken函数验证令牌的有效性,如果验证失败,则会打印警告消息,并将浏览器重定向到'plugin / file_manager / browse /'
如果在POST请求中未传递令牌,则将执行类似的操作。下一步操作是关键:
$data = $_POST['upload'];
$path = str_replace('..', '', $data['path']);
$overwrite = isset($data['overwrite']) ? true : false;
路径中的切换字符“ ..”首先在此处删除。
$filename = preg_replace('/ /', '_', $_FILES['upload_file']['name']);
$filename = preg_replace('/[^a-z0-9_\-\.]/i', '', $filename);
然后删除文件名中的空格,仅保留从a到z的小写字母,数字0到9,下划线,破折号和点,并删除其余字符。
if (isset($_FILES)) {
$file = $this->_upload_file($filename, FILES_DIR . '/' . $path . '/', $_FILES['upload_file']['tmp_name'], $overwrite);
if ($file === false)
Flash::set('error', __('File has not been uploaded!'));
}
最后,执行upload_file函数以将文件上传到系统。在整个过程中,未对上传文件的类型进行安全检查,这导致攻击者上传了Webshell。
三、 Wolf cms 0. 8. 3. 1具有任何文件上传漏洞3. 1 Wolf cms 0. 8. 3. 1版本的概述中的漏洞
最近,由于工作原因,我需要挖掘一些Web漏洞。因此,我想到了Wolf cms 0. 8. 2中的文件上传漏洞,该漏洞将在本文的第二部分中介绍。检查Wolf cms的当前版本,版本0. 8. 3. 1已发布。出于好奇,我检查了此文件上传漏洞是否已得到修补,结果是系统已对上传文件的文件扩展名进行了黑名单检查,但是众所周知,这是不安全的,可以绕开
3. 2 Wolf cms 0. 8. 2版本利用过程
网站环境是在本地构建的,其攻击过程如下所示:
仍在“文件”选项卡右下角的“上传文件”处触发上传文件操作。
这次,我们的客户端环境在ubuntu下,因为在这里我们可以将webshell文件命名为“ ma 2. php”。 (请注意,文件名以点号结尾),并且在Windows系统下,不允许这样的命名。
由于服务器是在Windows操作系统中构建的,因此在上传此文件后,webshell文件名末尾的点将被自动删除。
检查此文件的源代码,我们可以看到我们上传的确实是单句木马。
仍然使用单句木马客户端进行连接,结果表明连接成功。事实证明,尽管采取了一些安全措施,仍可以绕过新版本。
2. 3漏洞源代码分析
漏洞点出现在:/wolf/plugins/file_manager/FileManagerController.php
从第310行到第354行是实现上传功能的upload()函数
我们可以看到大多数代码与先前的0. 8. 2版本一致,但在340至345行有所不同。
$ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
$ext_arr = array('php', 'php3', 'php4', 'inc');
if (in_array($ext, $ext_arr)) {
Flash::set('error', __('Not allowed to upload files with extension :ext', $ext));
redirect(get_url('plugin/file_manager/browse/'));
}
这部分代码首先删除用户上传的文件的后缀,然后将其转换为小写。
然后定义一个数组,其中定义了不允许上传的后缀。
检查用户上传的文件的后缀是否在数组中,如果是,则打印警报消息,然后将浏览器重定向到路径“ plugin / file_manager / browse /”。
我们上传的文件名为“ ma 2. php”。后缀名称不在黑名单数组中,因此允许上载。由于服务器是安装在Windows系统上的,最后一个点将被自动删除,因此这句话Trojan文件成为可执行文件。攻击成功了。
四、摘要
以上内容再次确认了众所周知的事实:文件后缀黑名单无法有效修复文件上传漏洞。一般来说,有效的防御方法是:
1.将文件上传目录设置为不可执行;
2.使用白名单而非黑名单来确定允许上传哪些类型的文件;
3.使用随机数重写文件名或文件路径。
4.如果上传图像文件,则可以执行第二次渲染。