欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

Wolf CMS 新旧两个版本中的文件上传漏洞分析

来源:本站整理 作者:佚名 时间:2017-07-04 TAG: 我要投稿

一、Wolfcms简介
Wolf CMS是一款内容管理系统(CMS),是在GNUGeneral Public License v3下发布的免费软件。Wolf CMS是由PHP语言编写,是Frog CMS的一个分支。在2010年Packet Publishing开源项目评奖的“Most Promising Open Source Project”分类中杀进了决赛。
软件的官网为:https://www.wolfcms.org/
二、Wolfcms 0.8.2中存在任意文件上传漏洞
2.1 Wolf CMS 0.8.2版本中漏洞概述
早在2015年4月,Wolf CMS就被发现其后台存在任意文件上传漏洞,攻击者可以利用这个漏洞上传恶意的PHP文件,最终的结果是系统被攻击者控制,可以执行任意的指令。此漏洞具体是出现在文件管理功能中,这个功能原本是提供一个接口让管理员管理文件。
在此版本的代码中,对于允许上传的文件类型没有做任何的限制。因此攻击者可以上传一个PHP shell文件,文件中的代码是恶意的,导致系统被完全控制。
2.2 Wolf CMS 0.8.2版本漏洞利用过程
在本地搭建了网站环境,复现了攻击过程,如下:
在“Files”选项卡中点击右下角的“Upload file”选项可以执行上传操作

选择要上传的一句话木马文件,本例中它的名字是“ma2.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的token,通过标签的方式防止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/'));
}
这段代码首先检查csrf_token这个变量是否在POST请求中被设置,如果被设置的话,那么将这个值赋值给$csrf_token,随后通过SecureToken::validateToken函数验证token的有效性,如果未通过验证,则打印警告信息,并且将浏览器重定向到‘plugin/file_manager/browse/’
如果POST请求中没有token被传递过来,则也执行类似的操作。接下来的操作是关键:
$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。
三、Wolfcms 0.8.3.1中存在任意文件上传漏洞
3.1 Wolf CMS 0.8.3.1版本中漏洞概述
最近由于工作原因,我需要挖一些Web漏洞。于是想起了Wolf CMS 0.8.2中的文件上传漏洞,也就是本文的第二部分介绍的。查看目前Wolf CMS的版本,已经发布了0.8.3.1版本。出于好奇,我查看了一下此文件上传漏洞是否已经被修补,结果是:系统对上传的文件后缀名做了黑名单检查,但是众所周知,这也并不安全,可被绕过。

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载