Bugku-文件包含2

文件包含2

题目描述

没有描述

解题过程

文件包含题目大多都是php环境的,

  • 所以先试试伪协议

    发现php://被ban了

    继续尝试,发现file://协议能用,但找了一下没有找到使用file://进行getshell或者读取源码的姿势

    除此之外没有什么收获

  • 用御剑扫一扫

    发现文件上传页面,经过测试,这里检测了后缀名和Content-Type字段

    上传一句话shell

    发现被过滤了<?php?>,只好寻找其他小马

    找到一个<script language=php>eval($_POST[shell])</script> 是可行的

    这个一句话shell是一个script标签,利用language属性可以指定脚本语言的特性,调用php解释器,运行php代码

    蚁剑连接,拿flag

  • 然后我顺手把两个页面的源码copy下来了

    index.php

    <?php
        if(!isset($_GET['file']))
        {
            header('Location: ./index.php?file=hello.php');
            exit();
        }
        @$file = $_GET["file"];
        if(isset($file))
        {
            if (preg_match('/php:\/\/|http|data|ftp|input|%00/i', $file) || strstr($file,"..") !== FALSE || strlen($file)>=70)
            {
                echo "<h1>NAIVE!!!</h1>";
            }
            else
            {
                include($file);
            }
        }
    ?>
    
    

    可以看到

    • ban掉了php://, http, data, ftp, input, %00和..
    • 限制了file参数长度小与70

    upload.php

    <?php
    //error_reporting(0);
    if(!empty($_FILES["file"]))
    {
        $allowedExts = array("gif", "jpeg", "jpg", "png");
        @$temp = explode(".", $_FILES["file"]["name"]);
        $extension = end($temp);
        if (((@$_FILES["file"]["type"] == "image/gif") || (@$_FILES["file"]["type"] == "image/jpeg")
        || (@$_FILES["file"]["type"] == "image/jpg") || (@$_FILES["file"]["type"] == "image/pjpeg")
        || (@$_FILES["file"]["type"] == "image/x-png") || (@$_FILES["file"]["type"] == "image/png"))
        && (@$_FILES["file"]["size"] < 102400) && in_array($extension, $allowedExts))
        {
            $filename = date('Ymdhis').rand(1000, 9999).'.'.$extension;
            if(move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $filename)){
    		$url="upload/".$filename;
    		$content = file_get_contents($url);
            $content = preg_replace('/<\?php|\?>/i', '_', $content);
            file_put_contents('upload/'.$filename, $content);
            echo "file upload successful!Save in:  " . "upload/" . $filename;
    
    	}else{
            	echo "upload failed!";
    	}
        }
        else
        {
            echo "upload failed! allow only jpg,png,gif,jpep";
        }
    }
    ?>
    
    

    可以看到

    • 限制了Contet-Type只能是gif, jpeg, jpg, pjpeg, x-png, png中的一个
    • 后缀名只能是gif, jpeg, jpg, png中的一个而且
    • filename是不可控的
    • 把文件内容里的<?php?>替换成了_

    因为这里的文件内容替换是在保存之后进行的,如果在文件名可控的情况下,可以进行竞争getshell,即在更改文件内容之前getshell。

参考

https://www.freebuf.com/column/148886.html

https://www.cnblogs.com/0yst3r-2046/p/11125806.html

posted @ 2020-06-21 01:25  R3col  阅读(776)  评论(0编辑  收藏  举报