freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

文件上传和解析漏洞的整理
2020-08-21 00:30:17

简述

自己学习,文件上传&解析漏洞的整理,大佬绕过

免责声明

不可对未授权的网站进行测试,仅可在靶场上练习,否则后果自负

文件上传概述

文件上传是个很强势的一个漏洞,你想想,如果可以上传文件,没有对文件进行过滤,那么我们是不是就可以上传木马病毒,那么木马可以干嘛,木马可以获取服务器的绝对权限,webshell,所以若网站有文件上传的功能,对用户所上传的文件做限制必须要谨慎谨慎再谨慎的

文件上传发生原理

有个鬼原理啊,无非就是在正常的上传功能的地方,有些人恶意上传了带有恶意代码的文件,而服务器又出现漏洞,可以解析包含恶意代码的文件,恶意代码中有获取webshell的权限,从而导致服务器的shell被恶意的人所控制

PHP文件上传常用的函数

一、获取前端所上传的文件信息

    1. $_FILES["file"]["name"] - 上传文件的名称
    2. $_FILES["file"]["type"] - 上传文件的类型
    3. $_FILES["file"]["size"] - 上传文件的大小,以字节计
    4. $_FILES["file"]["tmp_name"] - 存储在服务器的文件的临时副本的名称
    5. $_FILES["file"]["error"] - 由文件上传导致的错误代码

二、文件处理函数

    1. fopen() 函数用于在 PHP 中打开文件

    2. fclose() 函数用于关闭打开的文件

    3. feof() 函数检测是否已到达文件末尾(EOF)

    4. fgets() 函数用于从文件中逐行读取文件。

    5. fgetc() 函数用于从文件中逐字符地读取文件。

    6. is_uploaded_file() 函数判断指定的文件是否是通过 HTTP POST 上传的。
    7. move_uploaded_file() 函数将上传的文件移动到新位置。

    8. file_exists() 函数检查文件或目录是否存

    9. end() 函数将内部指针指向数组中的最后一个元素,并输出。

    10. explode() 函数使用一个字符串分割另一个字符串,并返回由字符串组成的数组。

    11. in_array() 函数搜索数组中是否存在指定的值。

文件上传防御方式与绕过

一、js前端验证:

  1. 判断方式:在浏览加载文件,但还未点击上传按钮时便弹出对话框,(进一步确定可以通过配置浏览器HTTP代理(没有流量经过代理就可以证明是客户端JavaScript检测))内容如:只允许传.jpg/.jpeg/.png后缀名的文件,而此时并没有发送数据包。
  2. 验证代码:
    function CheckFileType()
        {
            var objButton=document.getElementById("Button1");//上传按钮
            var objFileUpload=document.getElementById("FileUpload1");
            var objMSG=document.getElementById("msg");//显示提示信息用DIV
            var FileName=new String(objFileUpload.value);//文件名
            var extension=new String(FileName.substring(FileName.lastIndexOf(".")+1,FileName.length));//文件扩展名
    
            if(extension=="jpg"||extension=="JPG")//可以另行添加扩展名
            {
                objButton.disabled=false;//启用上传按钮
                objMSG.innerHTML="文件检测通过";
            }
            else
            {
                objButton.disabled=true;//禁用上传按钮
                objMSG.innerHTML="请选择正确的文件上传";
            }
        }
  3. 绕过方式:将需要上传的恶意代码文件类型改为允许上传的类型,例如将shell.asp改为shell.jpg上传,配置Burp Suite代理进行抓包,然后再将文件名shell.jpg改为shell.asp 上传页面,审查元素,修改JavaScript检测函数(具体方法:可以使用firbug之类的插件把它禁掉)

二、服务端MIME类型检测:

  1. MIME的作用:使客户端软件,区分不同种类的数据,例如web浏览器就是通过MIME类型来判断文件是GIF图片,还是可打印的PostScript文件。web服务器使用MIME来说明发送数据的种类, web客户端使用MIME来说明希望接收到的数据种类。
  2. MIME验证代码:
    <?php
        if($_FILES['file']['type'] != "image/gif")
        {
            echo "Sorry, we only allow uploading GIF images";
            exit;
        }
        $uploaddir = './';
        $uploadfile = $uploaddir . basename($_FILES['file']['name']);
        if (move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile))
        {
            echo "File is valid, and was successfully uploaded.\n";
        } else {
            echo "File uploading failed.\n";
        }
    ?>
  3. 绕过方法:配置Burp Suite代理进行抓包,将Content-Type修改为image/gif,或者其他允许的类型然后在对应目录生成shell.jpg

三、服务端文件扩展名检测

  1. 黑名单检测:黑名单的安全性比白名单低很多,服务器端,一般会有个专门的blacklist文件,里面会包含常见的危险脚本文件类型,例如:html | htm | php | php2 | hph3 | php4 | php5 | asp | aspx | ascx | jsp | cfm | cfc | bat | exe | com | dll | vbs | js | reg | cgi | htaccess | asis | sh |phtm | shtm |inc等等。黑名单扩展名过滤,限制不够全面:IIS默认支持解析.asp | .cdx | .asa | .cer等
  2. 验证代码
    <?php
        function getExt($filename){
            //sunstr - 返回字符串的子串
            //strripos — 计算指定字符串在目标字符串中最后一次出现的位置(不区分大小写)
            return substr($filename,strripos($filename,'.')+1);
        }
        if($_FILES["file"]["error"] > 0)
        {
            echo "Error: " . $_FILES["file"]["error"] . "<br />";
        }
        else{
            $black_file = explode("|","php|jsp|asp");//允许上传的文件类型组
            $new_upload_file_ext = strtolower(getExt($_FILES["file"]["name"])); //取得被.隔开的最后字符串
            if(in_array($new_upload_file_ext,$black_file))
            {
                echo "文件不合法";
                die();
            }
            else{
                $filename = time().".".$new_upload_file_ext;
                if(move_uploaded_file($_FILES['file']['tmp_name'],"upload/".$filename))
                {
                    echo "Upload Success";
                }
            }
        }
    ?>
  3. 绕过方法:不被允许的文件格式.php,但是可以上传文件名为shell.php_(下划线是空格),IIS支持,linux不支持,详细见下面的特殊文件名绕过描述;
  4. 白名单检测:仅允许指定的文件类型上传,比如仅与需上传jpg | gif | doc等类型的文件,其他全部禁止
  5. 绕过方法
    1. 文件名大小写绕过:用像 AsP,pHp 之类的文件名绕过黑名单检测

    2. 名单列表绕过:用黑名单里没有的名单进行攻击,比如黑名单里没有 asa 或 cer 之类

    3. 特殊文件名绕过:比如发送的 http 包里把文件名改成 test.asp. 或 test.asp_(下划线为空格),这种命名方式 在 windows 系统里是不被允许的,所以需要在 burp 之类里进行修改,然后绕过验证后,会 被 windows 系统自动去掉后面的点和空格,但要注意 Unix/Linux 系统没有这个特性

    4. 0x00截断:文件名后缀就一个%00字节,可以截断某些函数对文件名的判断。在许多语言函数中处理函数中,处理字符串中在扩展名检测这大部分都是 asp 的程序有这种漏洞,给个简单的伪代码

    5. 二次渲染

    6. 解析漏洞绕过

四、服务端文件内容检测

  1. 文件特征检测
    1. 绕过方法
    2. 文件幻术:也就是通过各个图片的特征头加在最前面,用来欺骗防御,然后后面加上webshell代码
    3. JPG : FF D8 FF E0 00 10 4A 46 49 46
      GIF : 47 49 46 38 39 61 (GIF89a)
      PNG: 89 50 4E 47
  2. 文件相关信息检测
    1. 绕过方法
    2. 伪造好文件头,然后在后面加一些正常的数据
  3. 当文件严格限制了信息和后缀的时候
    1. 绕过方法

    2. 二次渲染:通过对bp抓包查看上传的图片有哪个地方没有被渲染到,则在哪个地方添加代码

    3. 图片木马制作(图片木马需要配合解析漏洞来执行相应的代码)

      • Copy命令制作
        1. copy 1.jpg/b+1.asp/a 2.jpg(a表示ascii文件/b表示二进制形式)
      • Ps插入
        1. 用PS(photoshop)打开图片
        2. 文件→文件简介插入你需要的木马代码3.文件→保存(保存:覆盖源文件 你也可以另存为你想要的其它格式)
      • 图片属性版权填写webshell:需要找图片,有的图片无法填写

1597937094.png!small五、防御

  1. 将文件上传目录的所有用户执行权限全部取消
  2. 判断文件类型

    在判断文件类型时,可以结合使用MIME Type、后缀检查等方式。在文件类型检查中,强烈推荐白名单方式,黑名单的方式已经     无数次被证明是不可靠的。此外, 对于图片的处理,可以使用压缩函数或者resize函数,在处理图片的同时破坏图片中可能包含的     HTML代码,或者在使用白名单的时候,使用分割字符串(上传来的文件名),使用"."来分割,仅允许分割后,字符串只有两个,一 个是文件名,一个是文件扩展名。

  3. 使用随机数改写文件名和文件路径

    文件上传如果要执行代码,则需要用户能够访问到这个文件。在某些环境中,用户能上传,但不能访问。如果应用了随机数改写了文件名和路径,将极大地增加攻击的成本。再来就是像shell.php.rar和crossdomain.xml这种文件,都将因为重命名而无法攻击。

  4. 单独设置文件服务器的域名

    把网站服务器和文件服务器分开,但是要保证,文件服务器的安全级别很高,且保证上传文件是相对高的可靠,直接把上传的图片等文件存储在文件服务器,并在文件服务器把所有目录设置为可读可写不可执行

  5. 二次渲染

    原理:将上传的图片重新保存为一个新的图片,将里面可能含有的的可执行代码删除

解析漏洞

一、Apache解析漏洞:

  1. abc.php.xxx.xx.xx(那么这个文件会被apache容器解析成php文件,因为apache解析文件名的步骤是从文件末尾开始找文件后缀名,见到xx。不认识,之后继续向前找,xxx.也不认识,继续向前,当走到.php的时候,认识这个后缀,并解析这个后缀)
  2. .htaccess
  3. 若此文件中输入对应的代码,那么该文件目录下的所有文件将以php文件来执行

二、IIS6.0解析漏洞

  1. asp;1.jpg(会将1.jpg解析成asp文件格式)
  2. abc.asp;time.jpg(会将1.jpg解析成asp文件格式)
  3. abc.asp/time.jpg(abc.asp是个目录,iis6.0会将这个目录下的文件按照asp方式进行解析)

三、IIS 7.0&7.5畸形解析漏洞

  1. 默认fast-cgi开启状况下,在一个文件路径后面加上/xx.php会将原来的文件解析为php文件

四、Nginx解析漏洞

  1. 畸形解析漏洞
    • 默认fast-cgi开启状况下,在一个文件路径后面加上/xx.php会将原来的文件解析为php文件
  2. 空字节代码执行漏洞

    • 在fast-cgi关闭的情况下,nginx版本:0.5., 0.6., 0.7- 0.7.65, 0.8 -0.8.37,nginx在图片后附加php代码然后通过访问

      例如:xx.jpg%00.php

  3. 文件名逻辑漏洞(CVE-2013-4547)

    • 受影响的nginx版本: 0.8.41至1.4.3和1.5.7之前的1.5.x

      正常上传一个附加代码的图片"test.jpg",访问时后面+"空格"+"\0"+".php",即让图片作为php文件解析

      例如:/test.jpg \0.php

  4. 配置不当目录穿越

    • 如果绝对路径"/home/"的URL映射是网站目录"/files/",配置写成了"/files"
    • location /files { alias /home/; }
    • 就可以访问"/files../",穿越路径,访问到绝对路径根目录"/"下的文件列表

总体思维导图

链接:https://pan.baidu.com/s/1ogofZN7Ce7AhBul51KA2-Q 提取码:dkov

文件上传靶场地址

https://github.com/c0ny1/upload-labs

总结

安全是责任,是担当,是互联网的第一道保障。
# 渗透测试 # web安全 # 文件上传 # 解析漏洞
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者