zoukankan      html  css  js  c++  java
  • 渗透之路基础 -- 文件上传

    具体还是要根据实战情况来判断分析,本文仅供思路学习和参考

    漏洞危害

    可以直接上传Shell,导致服务器getshell

    漏洞形成

    Web应用程序没有对上传文件的格式进行严格过滤 , 还有一部分是攻击者通过 Web服务器的解析漏洞来突破Web应用程序的防护;通常都会出现在,上传功能上

    文件上传格式及解析

    ​ 没有解析漏洞的情况下,格式代码必须要和文件格式一直,否则无法正常解析运行,如果存在解析漏洞的情况下,格式代码可以和不同格式相互解析

    ​ 之后也会发出关于解析漏洞的文章!

    漏洞防御

    可以针对文件名文件大小文件内容文件类型等进行防御

    1. 检查文件上传路径 ( 避免 0x00 截断、 IIS6.0 文件夹解析漏洞、目录遍历 )

    2. 文件扩展名检测 ( 避免服务器以非图片的文件格式解析文件 )

    3. 文件 MIME验证 ( 比如 GIF 图片 MIME为 image/gif,CSS 文件的 MIME为 text/css 等 ) 3. 文件内容检测 ( 避免图片中插入 webshell)

    4. 图片二次渲染 ( 最变态的上传漏洞防御方式 , 基本上完全避免了文件上传漏洞 )

    5. 文件重命名 ( 如随机字符串或时间戳等方式 , 防止攻击者得到 webshell 的路径 )

    注意:若攻击者上传了shell之后,肯定会通过某刀剑进行连接,所以尽量不要暴露文件路径,并且设置访问权限,以进一步防御

    文件上传验证及突破

    文件过滤,验证后缀:

    1. 文件头验证

    2. 文件类型验证

    3. 文件后缀验证

      绕过:

      1. 修改文件头,伪造文件属性
      2. 修改文件类型,伪造文件类型 MIME绕过
      3. 增加多重后缀,伪造文件后缀 命名绕过

      js 本地验证突破

      1. 复制js代码,创建本地文件删除相应验证代码后直接上传(无防盗链可用)

      2. %00 截断 shell.php%00.jpg => shell.php

        测试代码 upload.php

        <?php
        //文件上传漏洞演示脚本之js验证
        $uploaddir = 'uploads/';
        if (isset($_POST['submit'])) {
            if (file_exists($uploaddir)) {
                if (move_uploaded_file($_FILES['upfile']['tmp_name'], $uploaddir . '/' . $_FILES['upfile']['name'])) {
                    echo '文件上传成功,保存于:' . $uploaddir . $_FILES['upfile']['name'] . "
        ";
                }
            } 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>文件上传漏洞演示脚本--JS验证实例</title>
            <script type="text/javascript">
                function checkFile() {
                    var file = document.getElementsByName('upfile')[0].value;
                    if (file == null || file == "") {
                        alert("你还没有选择任何文件,不能上传!");
                        return false;
                    }
                    //定义允许上传的文件类型
                    var allow_ext = ".jpg|.jpeg|.png|.gif|.bmp|";
                    //提取上传文件的类型
                    var ext_name = file.substring(file.lastIndexOf("."));
                    //alert(ext_name);
                    //alert(ext_name + "|");
                    //判断上传文件类型是否允许上传
                    if (allow_ext.indexOf(ext_name + "|") == -1) {
                        var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
                        alert(errMsg);
                        return false;
                    }
                }
            </script>
        <body>
        <h3>文件上传漏洞演示脚本--JS验证实例</h3>
        
        <form action="" method="post" enctype="multipart/form-data" name="upload" onsubmit="return checkFile()">
            <input type="hidden" name="MAX_FILE_SIZE" value="204800"/>
            请选择要上传的文件:<input type="file" name="upfile"/>
            <input type="submit" name="submit" value="上传"/>
        </form>
        </body>
        </html>
        

      上传成功之后仍然是图片格式
    

      *这时候需要抓包修改*
    

      - 注意:直接通过burp抓包修改,可能上传的文件还是shell.php%00.jpg
      - 需要通过修改%00的URL编码格式:
        - 选中%00 右键选中 URL
        - 点击 URL-decode
        - %00 乱码则可以上传
    

    文件上传MIME验证突破

    ​ 测试页面 mime.php

    <?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'] . "
    ";
                }
            } else {
                echo '文件类型不正确,请重新上传!' . "
    ";
            }
        } 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>
    

    抓包修改 Content-Type

    序号 内容类型 文件扩展名 描述
    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 图像

    http://www.w3school.com.cn/media/media_mimeref.asp

    关于编辑器上传漏洞利用

    ​ 网站程序编辑器插件,eweb,fck,ce,cfinder,ck等

    ​ 利用图片路径判断编辑器类型

    .htaccess 文件上传漏洞

    ​ 只适用于Apache 通过配置文件来解析执行相应脚本

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

    直接访问是访问不到的

    通过修改.htaccess文件可直接访问

    可以将任意文件解析为PHP

    1. 如果存在上次.htaccess文件,可以直接利用规则解析
    2. 如果存在修改文件的权限,修改解析规则
    3. 拓展利用:权限维持
  • 相关阅读:
    02-MySQL的安装和管理
    01-pymysql模块的安装
    异常处理
    USACO 2015 Feb Censoring
    玄武密码(bzoj4327)(JSOI2012)
    浅谈AC自动机
    Equation
    JOI五子棋
    浅谈Tarjan
    年轮蛋糕JOI2014Final
  • 原文地址:https://www.cnblogs.com/r0ckysec/p/11527474.html
Copyright © 2011-2022 走看看