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

一个任意文件上传漏洞的复现、分析、利用与防御建议

来源:本站整理 作者:佚名 时间:2019-08-26 TAG: 我要投稿

CMS Made Simple(CMSMS)是一个简单、便捷且易用的内容管理系统。前面一篇文章,我们讲述了关于其中一个基于时间的SQL注入漏洞的复现、分析及利用过程。本文详细讨论CMSMS中的另一个漏洞,也是Web安全中较为常见的一种漏洞类型。ShowTime2是CMSMS中比较常用的模块,主要用于上传水印图片。该模块在3.6.2及之前的版本中,存在一个任意文件上传漏洞,无法确保用户上传的水印文件具有标准的图像文件扩展名(gif、jpg、jpeg或png),因此攻击者可以利用该漏洞上传任意文件并且远程执行任意代码。
一 实验环境
1.渗透主机:kali-linux-2018.3-vm-i386
2.目标主机:Debian9.6 x64
3.软件版本:CMS Made Simple 2.2.8
4.插件版本:Showtime2-3.6.0
二 涉及工具
1.BurpSuite v1.7.36
2.Metasploit v4.17.3
3.Mozilla Firefox 60.6.2
三 漏洞复现
1.在showtime2模块中上传一张名为Hacker.jpg的水印图片,显示上传成功,结果如下:

2.尝试上传一个名为test123.php文件,页面中有告警信息,显示服务器未成功获取到图片的尺寸信息,此时上传成功与否无法确定,告警信息如下图所示:

3.通过如下url:
href=”http://192.168.188.155/cmsms/uploads/images/test123.php“>http://192.168.188.155/cmsms/uploads/images/test123.php
验证php文件是否上传成功,如果上传未成功,应当是如下图所示的内容:

4.从下图可以看出,虽然之前有告警信息,但是文件test123.php依旧上传成功(看来是我想多了,服务端获取图片尺寸的代码,仅仅用来获取图片尺寸了):

5.登录到目标服务器上查看,在如下路径中存在刚才上传的test123.php,如下图所示:

由此我们可以确定,在showtime2模块中存在任意文件上传漏洞。
在有些Web应用中上传图片时,可能会通过获取图片尺寸的方式来防止任意文件的上传,这种方式可以被绕过。在渗透主机中使用如下命令:
root@kali:~/Desktop#cat Hacker.jpg test123.php > Hacker123.php
将Hacker.jpg与test123.php拼接起来,然后再上传到showtime2模块,可以看到php文件上传成功,cmsms无告警,这样便成功绕过了图片尺寸检测,结果如下图所示:

四 漏洞分析
通过分析源代码,我们找到了任意文件上传漏洞的产生点,有关的问题源码如下图所示:
class showtime2_image{
  protected function __construct() {}
  public static function watermark_image($source_image, $dest_image, $create_bak=true){
        $gCms = cmsms();
        $config = $gCms->GetConfig();
        $mod = cms_utils::get_module('Showtime2');
        if ($mod->GetPreference('watermark_bak')=='1' && $create_bak){
          /*
          $fname = str_replace(substr($source_image, strrpos($source_image, '.')), "", $source_image);
          $fext = substr($source_image, strrpos($source_image, '.'));
          $fname = $fname.'_bak'.$fext;
          */
          copy($source_image,$source_image.'.bak');
        }
        $watermark_file = $mod->GetPreference('watermark_file');
        if ($watermark_file=='watermark.png'){
                $watermark_file = $config['root_path'].'/modules/Showtime2/images/watermark.png';
        }else{
                $watermark_file = $config['image_uploads_path'].'/'.$watermark_file;
        }
        if (!file_exists($watermark_file)) return false;
从上述源码中可以看出,在执行完copy函数之后,就直接指定了watermark_file的存储路径,这里没有对上传的文件做任何的校验和过滤,从而导致了任意文件上传漏洞的产生,这是极其危险的编码行为。

[1] [2] [3] [4]  下一页

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