• CTFHub_技能树_文件上传


    文件上传

    无限制

    UPload_0_1

    直接上传一句话后门,使用蚁剑连接:

    UPload_0_2

    获得flag:

    UPload_0_3

    前端验证

    尝试直接上传后门,发现被拦截,经过判断为Javascript前端验证:

    UPload_1_1

    这里可以使用Firefox浏览器插件禁用页面js代码,或者使用burp suite绕过前端验证。

    这里展示如何使用burp suite绕过前端验证

    UPload_1_3

    先将文件名改为1.jpg,上传时通过burp suite将文件名修改为1.php,即可绕过验证。

    UPload_1_2

    使用蚁剑获得flag。

    .htaccess

    .heaccess是什么

    ​ .htaccess文件(或者"分布式配置文件")提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。

    ​ 概述来说,htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。

    ​ 简单来说,就是我上传了一个.htaccess文件到服务器,那么服务器之后就会将特定格式的文件以php格式解析。

    .htaccess漏洞利用

    //方法一
    SetHandler application/x-httpd-php  	//所有的文件当做php文件来解析
    //方法二
    AddType application/x-httpd-php .jpg	//.jpg文件当作php文件解析
    

    题解过程

    构造.htaccess文件并上传。

    UPload_2_1

    上传一句话后门,使用蚁剑类工具连接,获得flag:

    UPload_2_2

    MIME验证

    MIME是什么

    ​ 多用途互联网邮件扩展类型。它设计的最初目的是为了在发送电子邮件时附加多媒体数据,让邮件客户程序能根据其类型进行处理。然而当它被HTTP协议支持之后,它的意义就更为显著了。它使得HTTP传输的不仅是普通的文本,而变得丰富多彩。

    每个MIME类型由两部分组成,前面是数据的大类别,例如声音audio、图象image等,后面定义具体的种类。

    常见的MIME类型

    超文本标记语言文本 .html text/html
    普通文本 .txt text/plain
    GIF图形 .gif image/gif
    JPEG图形 .jpeg,.jpg image/jpeg
    

    ​ 服务端MIME类型检测是通过检查http包的Content-Type字段中的值来判断上传文件是否合法的。那就好办了,不管我上传什么类型的文件,我只要修改Content-Type字段来让检测通过就行了。

    题解过程

    上传php文件,提示:

    UPload_4_0

    查看源代码,发现没有前端验证,猜测为MIME验证。

    修改Content-Type

    UPload_4_1

    上传成功:

    UPload_4_2

    使用蚁剑连接,得到flag

    UPload_4_3

    文件头检测

    上传php文件,显示错误,提示如下:

    UPload_3_1

    修改MIME为jpg格式上传:

    UPload_3_2

    显示错误,提示如下:

    UPload_3_5

    猜测应该是对文件内容检测。

    制作图片马:

    copy 原图片.jpg/b + 后门.php/a 图片马.php
    b表示二进制文件
    a表示ASCII码文件
    

    UPload_3_3

    使用蚁剑连接,得到flag

    UPload_3_4

    00截断

    详细内容查看这篇文章

    00截断原理

    ​ 0x00是十六进制表示方法,是ascii码为0的字符,在有些函数处理时,会把这个字符当做结束符。这个可以用在对文件类型名的绕过上。

    00截断的利用方法

    我以前以为所谓00截断就是在文件名中加%00进行截断,但这种方式是不对的,为什么呢?比如攻击者构造文件名:admintony.php%00a.jpg,在提取后缀名的时候遇到%00则认为字符串结束了,那么他提取到的后缀名会是.php.php后缀又不允许上传所以上传失败了。

    ​ 应该在数据包中必须含有上传后文件的目录情况才可以用,比如数据包中存在path: uploads/,那么攻击者可以通过修改path的值来构造paylod: uploads/aa.php%00

    ​ 为什么修改path才可以,因为程序中检测的是文件的后缀名,如果后缀合法则拼接路径和文件名,那么攻击者修改了path以后的拼接结果为:uploads/aaa.php%00/2018051413370000.php,移动文件的时候会将文件保存为uploads/aaa.php,从而达到Getshell效果。

    题解过程

    上传php文件,进行测试

    UPload_5_1

    发现url中包含上传路径,猜测是文件名拼接在目录名后再进行后缀的验证。

    使用00截断,%00是被服务器解码为0x00发挥了截断作用

    UPload_5_2

    蚁剑,flag:

    UPload_5_3

    源码分析

    <?php
    header("Content-type: text/html;charset=utf-8");
    error_reporting(0);
    
    //设置上传目录
    define("UPLOAD_PATH", dirname(__FILE__) . "/upload/");
    define("UPLOAD_URL_PATH", str_replace($_SERVER['DOCUMENT_ROOT'], "", UPLOAD_PATH));
    
    if (!file_exists(UPLOAD_PATH)) {
        mkdir(UPLOAD_PATH, 0755);
    }
    
    if (!empty($_POST['submit'])) {
        $name = basename($_FILES['file']['name']);
        $info = pathinfo($name);
        $ext = $info['extension'];
        $whitelist = array("jpg", "png", "gif");
        if (in_array($ext, $whitelist)) {
            $des = $_GET['road'] . "/" . rand(10, 99) . date("YmdHis") . "." . $ext;
            if (move_uploaded_file($_FILES['file']['tmp_name'], $des)) {
                echo "<script>alert('上传成功')</script>";
            } else {
                echo "<script>alert('上传失败')</script>";
            }
        } else {
            echo "文件类型不匹配";
        }
    }
    
    ?>
    
    basename(path,suffix)  //函数返回路径中的文件名部分。
    
    参数 描述
    path 必需。规定要检查的路径。
    suffix 可选。规定文件扩展名。如果文件有 suffix,则不会输出这个扩展名。
    pathinfo() 	//返回一个关联数组包含有 path 的信息。
    
    <?php
    print_r(pathinfo("/testweb/test.txt"));
    ?>
    /*
    Array
    (
    [dirname] => /testweb
    [basename] => test.txt
    [extension] => txt
    )
    */
    

    将上传的文件统一重新命名,在这里发生了截断,实现了攻击。

    双写后缀

    $name = basename($_FILES['file']['name']);
    $blacklist = array("php", "php5", "php4", "php3", "phtml", "pht", "jsp", "jspa", "jspx", "jsw", "jsv", "jspf", "jtml", "asp", "aspx", "asa", "asax", "ascx", "ashx", "asmx", "cer", "swf", "htaccess", "ini");
    $name = str_ireplace($blacklist, "", $name);
    

    代码仅将黑名单替换为空白,只需要构造:.pphphp,就可以绕过。

    上传后门,蚁剑,flag

  • 相关阅读:
    20145203盖泽双 《Java程序设计》第6周学习总结
    20145203盖泽双实验一 Java开发环境的熟悉(Linux + Eclipse)
    20145203盖泽双 《Java程序设计》第五周学习总结
    20145203盖泽双 《Java程序设计》第四周学习总结
    20145203盖泽双《Java程序设计》第三周学习总结
    ## 20145203盖泽双 《Java程序设计》第二周学习总结
    总结同学们第一周作业出现的问题
    DOS命令行简单用法
    20145203 盖泽双《Java程序设计》第一周的学习总结
    20145216史婧瑶《Java程序设计》第二次实验报告
  • 原文地址:https://www.cnblogs.com/chalan630/p/12547844.html
Copyright © 2020-2023  润新知