OpenSNS后台文件上传漏铜分析

前言

  这几天正在想找个文件上传漏洞分析一波,以加深对文件上传漏洞的理解,正好看到FreeBuf的一片文章记对OpenSNS的一次代码审计,由于其只对漏洞进行复现,故在此进行代码层面的分析。

漏洞分析

  已知漏洞产生点:./Application/Admin/Controller/ThemeController.class.php    第170行

  OpenSNS后台文件上传漏铜分析_第1张图片

   跟入upload函数(./ThinkPHP/Library/Think/Upload.class.php  第128行):

  OpenSNS后台文件上传漏铜分析_第2张图片

  首先可以看到对所上传的文件进行了基本的检查,再往下看:

  OpenSNS后台文件上传漏铜分析_第3张图片

  此处就是对所上传文件的检测,可以看到,首先获取对上传的文件的属性集的一个资源列表。接下来使用dealFiles函数取出上传文件的数组:

  OpenSNS后台文件上传漏铜分析_第4张图片

  然后获取Content-Type的值为:application/zip

  获取所上传文件的后缀为:zip

  然后对所上传文件进行检测,使用check函数,此函数位于该文件303行:

    private function check($file)
    {
        /* 文件上传失败,捕获错误代码 */
        if ($file['error']) {
            $this->error($file['error']);
            return false;
        }

        /* 无效上传 */
        if (empty($file['name'])) {
            $this->error = '未知上传错误!';
        }

        /* 检查是否合法上传 */
        if (!is_uploaded_file($file['tmp_name'])) {
            $this->error = '非法上传文件!';
            return false;
        }

        /* 检查文件大小 */
        if (!$this->checkSize($file['size'])) {
            $this->error = '上传文件大小不符!';
            return false;
        }

        /* 检查文件Mime类型 */
        //TODO:FLASH上传的文件获取到的mime类型都为application/octet-stream
        if (!$this->checkMime($file['type'])) {
            $this->error = '上传文件MIME类型不允许!';
            return false;
        }

        /* 检查文件后缀 */
        if (!$this->checkExt($file['ext'])) {
            $this->error = '上传文件后缀不允许';
            return false;
        }

        /* 通过检测 */
        return true;
    }

  可以看到检测文件大小,Mime类型以及文件后缀。由于上传的zip文件在上传文件后缀白名单中,所以此处的检测全部通过。

  最后获取文件hash值并加入$file数组中。

  OpenSNS后台文件上传漏铜分析_第5张图片

  接下来调用回调函数,由于config数组中的callback的值为flase。所以$data的值为空。

  然后生成保存的文件名,跟入getSaveName函数,位于该文件402行:

  OpenSNS后台文件上传漏铜分析_第6张图片

  由于savaName的值为空。所以文件名保持不变。再往下:

  OpenSNS后台文件上传漏铜分析_第7张图片

  首先检测并创建子目录,跟入getSubPath函数,位于该文件427行:

  OpenSNS后台文件上传漏铜分析_第8张图片

  由于autoSub值为空,所以$subpath的值为空,所以$file['savePath']的值为空。然后对图像文件进行检测,由于上传的为zip文件,所以跳过。所以保存的文件的目录不变。再往下:

  OpenSNS后台文件上传漏铜分析_第9张图片

  开始保存文件,跟入save函数,位于./ThinkPHP/Library/Think/Upload/Driver/Local.class.php 72行:

  OpenSNS后台文件上传漏铜分析_第10张图片

  由于$replace的值为true,所以覆盖同名文件,然后移动文件成功,返回值为true。

  最后此函数返回$info:

  OpenSNS后台文件上传漏铜分析_第11张图片

  回到最初函数,跟入_unCompression函数,位于该文件,196行:

  OpenSNS后台文件上传漏铜分析_第12张图片

  最后跟入extract函数,此函数为提取zip文件中的文件,并未对所提取的文件进行任何检测,于是漏洞产生。(别问为什么不继续,因为这个函数看了头大。)

  至此漏洞分析完毕,总体来说比较简单,建议对解压的文件也调用函数对其检测。

转载于:https://www.cnblogs.com/Spec/p/11142766.html

你可能感兴趣的:(OpenSNS后台文件上传漏铜分析)