用户
搜索
  • TA的每日心情
    奋斗
    2018-4-9 16:54
  • 签到天数: 187 天

    连续签到: 1 天

    [LV.7]常住居民III

    版主

    pypy

    Rank: 7Rank: 7Rank: 7

    30

    主题

    678

    帖子

    1906

    魔法币
    收听
    3
    粉丝
    28
    注册时间
    2015-11-12

    i春秋签约作者

    发表于 2016-12-3 11:01:20 119308
    本帖最后由 xiaoye 于 2016-12-3 13:22 编辑
        1.文章难易度 【★★★】
        2.文章知识点: php语法;php伪协议;ctf;
        3.文章作者:     xiaoye
        4.本文参与i春秋社区原创文章奖励计划,未经许可禁止转载!

    前言
    例行打卡,昨晚让一个bug弄得觉也没睡好。。果然我太菜。。本来是打算写XXE的,但是想起来了之前在一个群里讨论的ctf题目,当时那位小伙伴就说了下大概情形和大致思路,心挺痒,,但是那个题目应该是他们学校内网才能访问。没办法,那就根据他说的来自己写一道ctf题目喽。正好好久没写php了,练练手。

    一、题目的还原
    他大致是这么说的:有上传点,只能上传zip或者jpg/png/jpeg图片格式,上传后可以知道路径;有LFI(本地文件包含漏洞),但是包含的如果不是php文件就在后面再加上一个.php后缀;没有RFI(远程文件包含漏洞);
    好吧,听起来不是很难,我们分开写,先写上传点,限制为zip&&图片格式:
    indexdemo.html:
    [HTML] 纯文本查看 复制代码
    <html>
    <form method='POST' action='upload_filedemo.php' enctype='multipart/form-data'>
    <label for='file'>filename:</label>
    <input id='file' name='file' type='file' /><br>
    <input type='submit' name='submit' value='submit'/>
    </form>
    </html>


    upload_filedemo.php:
    [PHP] 纯文本查看 复制代码
    <?php
    if(isset($_POST['submit'])){
            //file information
            $uploaded_name = $_FILES['file']['name'];
            $uploaded_type = $_FILES['file']['type'];
            $uploaded_size = $_FILES['file']['size'];
        $uploaded_tmp = $_FILES['file']['tmp_name'];
            $uploaded_ext = substr($uploaded_name, strrpos($uploaded_name, '.') + 1);
            //where will we put file
            // //$now_path = dirname(_FILE_) . '/upload/';
            define('FILE_PATH', dirname(__FILE__));
            $target_path = FILE_PATH . '/upload/';
            $target_file = md5(uniqid().$uploaded_name) . '.' . $uploaded_ext;
            if(($uploaded_ext == 'zip' || $uploaded_ext == 'jpg' || $uploaded_ext == 'png') && ($uploaded_type == 'image/jpeg' || $uploaded_type == 'image/png' || $uploaded_type == 'application/zip')){
                    move_uploaded_file($uploaded_tmp, $target_path . $target_file);
                    echo 'stored in' . $target_path . $target_file;
            }
    } 
    ?>


    核心代码:
    [PHP] 纯文本查看 复制代码
    if(($uploaded_ext == 'zip' || $uploaded_ext == 'jpg' || $uploaded_ext == 'png') && ($uploaded_type == 'image/jpeg' || $uploaded_type == 'image/png' || $uploaded_type == 'application/zip')){
                    move_uploaded_file($uploaded_tmp, $target_path . $target_file);
                    echo 'stored in' . $target_path . $target_file;
            }

    采用了白名单,攻击者想利用的话就基本只有解析漏洞了,但是我这是apache高版本,暂时不用考虑这块;
    采用MIME验证,这块只是辅助,毕竟用户burp拦截下就可以改掉了;
    [PHP] 纯文本查看 复制代码
    $target_file = md5(uniqid().$uploaded_name) . '.' . $uploaded_ext;

    文件名是md5加密的,00截断截不了,而且我这儿php也是高版本的,不用考虑;
    这道题目的上传要求这样就基本满足了,送点福利,自己整理的:
                                                                         kk.PNG

    这里本来想采用php二次渲染防止图片马,但是。。这样肯定不行,这道题目是让拿shell再拿flag的,你不让传咋行。。哈哈,这是后话了。
    文件包含代码:
    zipphp.php:
    [PHP] 纯文本查看 复制代码
    <?php
    include('funct.php');
    $file = $_GET['file'];
    $ext = get_extension($file);
    $bz = check_extension($ext);
    if($bz){
            include($file);
    }else{
            include($file . '.php');
    }
    ?>

    funct.php:
    [PHP] 纯文本查看 复制代码
    <?php
    function get_extension($f){
            return pathinfo($f, PATHINFO_EXTENSION);
            //print pathinfo($f, PATHINFO_EXTENSION);
    }
    
    function check_extension($f){
            if($f == 'php'){
                    return true;
            }else{
                    //$f = $f . '.php';
                    return false;
            }
    }
    ?>

    核心代码:
    [PHP] 纯文本查看 复制代码
    function get_extension($f){                                     //获取文件后缀
            return pathinfo($f, PATHINFO_EXTENSION);
            //print pathinfo($f, PATHINFO_EXTENSION);
    }
    
    function check_extension($f){                  //检查文件后缀是否为php,是返回true,不是返回false
            if($f == 'php'){
                    return true;
            }else{
                    //$f = $f . '.php';
                    return false;
            }
    }
    

    然后再:
    [PHP] 纯文本查看 复制代码
    if($bz){                  //判断是否加.php后缀
    include($file);
    }else{
    include($file . '.php');
    }

    试验下喽:
                                                                                      kk1.PNG    

                                                                                     kk2.PNG   
    不是php 文件自动加上php后缀,平台bwapp里也有这个套路的。                                                     
    好了
    。。累死。。题目还原好了。。开始做题吧

    二、突破防御,getshell
    只有LFI没有RFL,那我们之前http://bbs.ichunqiu.com/thread-15871-1-1.html的RFI技巧就无效了,并且LFI限制很多,目前我们只能包含已经存在的php文件,不能上传php(废话。。能上传就不用包含了。。),我们能拿到手的都是一些鸡肋。。所以洗洗睡吧。。哈哈,joke
    php有很多伪协议:zip data php://filter php://......
    等等,我们能上传zip啊。。百度之,发现了一个技巧,利用zip伪协议:
    zip://目录/xx.zip%23zip里的文件

    哎,我们可以把php文件放到xx.zip中,然后利用伪协议读取,然后包含它啊,说的有点乱,看操作:
    写一个1.php:
    [PHP] 纯文本查看 复制代码
    <?php
    phpinfo();
    ?>

    打个压缩包1.zip,把1.php放上去,然后上传
                                                                   kk2.PNG
    然后利用伪协议读取:
                                                                    kk3.PNG    

    我擦勒,这就结束了!做题时间和写题时间不平衡啊。。。。。。就这样吧,你把1.php写入一句话木马就拿到shell了。。总结一下,这一道题:

    我们只能上传zip/图片格式------>上传zip,内含.php恶意文件------>文件包含中可用zip协议------>zip:/目录/xxx.zip%231.php可以访问到zip中的.php文件------>getshell

    其实这道题还有个技巧,我们把1.zip改成jpg也可以:
                                                                                kk4.PNG

    总结
    没啥要总结的了吧。。哈哈,欢迎交流  ,写的比较慌,有错误的地方海涵      
                   


    本帖被以下淘专辑推荐:

    http://blog.163.com/sy_butian/欢迎交流
    发表于 2016-12-8 17:04:07
    文章奖励介绍及评分标准:http://bbs.ichunqiu.com/thread-7869-1-1.html,如有疑问请加QQ:286894635!

    奖金点评
    50解题思路清晰,但是语言逻辑还是有一点杂乱,建议下次改进。

    Hacking the earth.My Blog:https://isbase.cc
    使用道具 举报 回复
    第一个沙发
    使用道具 举报 回复
    学习学习套路
    使用道具 举报 回复
    发表于 2016-12-6 23:47:50
    使用道具 举报 回复
    发表于 2016-12-7 09:38:00
    使用道具 举报 回复
    发表于 2016-12-8 10:13:10
    6666,大神膜拜,吸一吸。
    使用道具 举报 回复
    发表于 2016-12-8 16:32:35
    get 文件包含中可用zip协议------>zip:/目录/xxx.zip%231.php可以访问到zip中的.php文件
    使用道具 举报 回复
    发表于 2016-12-9 14:05:48
    膜拜大神
    使用道具 举报 回复
    发表于 2016-12-16 18:52:37
    phar也是可以的
    使用道具 举报 回复
    发表于 2016-12-17 08:56:58

    对的,可以
    http://blog.163.com/sy_butian/欢迎交流
    使用道具 举报 回复
    发表于 2018-9-29 17:50:05
    支持一下~
    使用道具 举报 回复
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册