用户
搜索
  • TA的每日心情
    慵懒
    2018-12-29 08:22
  • 签到天数: 46 天

    连续签到: 1 天

    [LV.5]常住居民I

    i春秋-核心白帽

    行动比空谈更具有说服力!

    Rank: 4

    22

    主题

    395

    帖子

    384

    魔法币
    收听
    4
    粉丝
    3
    注册时间
    2016-6-26

    核心白帽积极活跃奖秦

    喧嚣如梦 i春秋-核心白帽 行动比空谈更具有说服力! 核心白帽 积极活跃奖 秦 楼主
    发表于 2017-9-2 01:47:28 787662
    本帖最后由 喧嚣如梦 于 2017-9-2 01:48 编辑

    文件上传漏洞演示脚本之MIME验证
    MIME的作用 : 使客户端软件,区分不同种类的数据,例如web浏览器就是通过MIME类型来判断文件是GIF图片,还是可打印的PostScript文件。


    web服务器使用MIME来说明发送数据的种类, web客户端使用MIME来说明希望接收到的数据种类。


    Tomcat的安装目录\conf\web.xml 中就定义了大量MIME类型 ,你可也去看一下。





    最近在做用表单上传文件,想在服务端验证上传文件的类型,只允许上传GIF,JPG,ZIP, 我们有两种方法, 第一:检查文件的扩展名, 第二:检查文件的MIME类型 。


    检查文件的扩展名的方法,很简单快捷, 但是  a.jsp 改名为 a.jpg能可以绕过检查上传了。


    检查文件的MIME类型的方法,在IE7与Firefox下有一点区别(见下表), 有不同浏览器上传表现不一致。Firefox下ZIP与EXE文件的MIME类型同为application/octet-stream。





    所以我决定 两种方法结合使用,先检查扩展名, 再检查MIME,不合格的文件不让上传。





    表中例出的是在服务器端(tomcat5.5)接收不同浏览器上传的文件时,取得的MIME类型





    用IE7上传        用Firefox3.0上传
    GIF        image/gif        image/gif
    JPG        image/pjpeg        image/jpeg
    ZIP        application/x-compressed        application/octet-stream
    JSP        text/html        text/html
    EXE        application/octet-stream        application/octet-stream









    常见MIME类型例表:





    序号        内容类型        文件扩展名        描述
    1        application/msword        doc        Microsoft Word
    2        application/octet-stream bin        dms lha lzh exe class        可执行程序
    3        application/pdf        pdf        Adobe Acrobat
    4        application/postscript        ai eps ps        PostScript
    5        appication/powerpoint        ppt        Microsoft Powerpoint
    6        appication/rtf        rtf        rtf 格式
    7        appication/x-compress        z        unix 压缩文件
    8        application/x-gzip        gz        gzip
    9        application/x-gtar        gtar        tar 文档 (gnu 格式 )
    10        application/x-shockwave-flash        swf        MacroMedia Flash
    11        application/x-tar        tar        tar(4.3BSD)
    12        application/zip        zip        winzip
    13        audio/basic        au snd        sun/next 声音文件
    14        audio/mpeg        mpeg mp2        Mpeg 声音文件
    15        audio/x-aiff        mid midi rmf        Midi 格式
    16        audio/x-pn-realaudio        ram ra        Real Audio 声音
    17        audio/x-pn-realaudio-plugin        rpm        Real Audio 插件
    18        audio/x-wav        wav        Microsoft Windows 声音
    19        image/cgm        cgm        计算机图形元文件
    20        image/gif        gif        COMPUSERVE GIF 图像
    21        image/jpeg        jpeg jpg jpe        JPEG 图像
    22        image/png        png        PNG 图像






    MIME上传验证演示代码:


    <?php
    /**
    * Created by Cracer
    * Name: upload2.php
    //文件上传漏洞演示脚本之MIME验证
    $uploaddir = 'uploads/';
    if (isset($_POST['submit'])) {
        if (file_exists($uploaddir)) {
            if (($_FILES['upfile']['type'] == 'image/gif') || ($_FILES['upfile']['type'] == 'image/jpeg') ||
                ($_FILES['upfile']['type'] == 'image/png') || ($_FILES['upfile']['type'] == 'image/bmp')
            ) {
                if (move_uploaded_file($_FILES['upfile']['tmp_name'], $uploaddir . '/' . $_FILES['upfile']['name'])) {
                    echo '文件上传成功,保存于:' . $uploaddir . $_FILES['upfile']['name'] . "\n";
                }
            } else {
                echo '文件类型不正确,请重新上传!' . "\n";
            }
        } else {
            exit($uploaddir . '文件夹不存在,请手工创建!');
        }
        //print_r($_FILES);
    }
    ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html;charset=gbk"/>
        <meta http-equiv="content-language" content="zh-CN"/>
        <title>文件上传漏洞演示脚本--MIME验证实例</title>
    <body>
    <h3>文件上传漏洞演示脚本--MIME验证实例</h3>


    <form action="" method="post" enctype="multipart/form-data" name="upload">
        请选择要上传的文件:<input type="file" name="upfile"/>
        <input type="submit" name="submit" value="上传"/>
    </form>
    </body>
    </html>



    MIME绕过方法:


    关于如何判断服务端是MIME验证,这个我们可以多上传几次来测试即可,那么如何绕过呢? 直接更改上传数据包中的Content-type即可。
    IMG_20170902_013908.png
    IMG_20170902_013924.png

    行动比空谈更具有说服力!
    发表于 2017-9-2 10:15:05
    使用道具 举报 回复
    发表于 2017-9-2 11:29:07
    注意排版。。。。
    一位特爱收藏Supreme的大哥哥....
    使用道具 举报 回复
    ,,,,,,,,,,,,,,,,,
    使用道具 举报 回复
    发表于 2017-9-2 16:23:58
    666,学到了。
    博客:[url=http://hacker.blue]http://hacker.blue[/url]
    使用道具 举报 回复
    有遇到的情况,得多测试根据返回来进行分析判断,感谢
    使用道具 举报 回复
    学习了,今后遇到相关的可以借鉴
    使用道具 举报 回复
    发表于 2017-9-5 11:36:08
    MINE类型。。。 还有这种上传类型的站点 也太LOW了吧。。。不如研究下白名单怎么绕过
    使用道具 举报 回复
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册