• 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

  • 相关阅读:
    VS的代码分析工具
    时间管理-SMART原则
    时间管理-该怎样进行时间管理
    ASP.NET Identity V2
    SQL Server 事务隔离级别的查看及更改
    GAC(Global Assembly Cache)注册/卸载 dll
    基于小米即时消息云服务(MIMC)的Web IM
    Spring Boot MyBatis配置多种数据库
    解决easyui combobox赋值boolean类型的值时,经常出现的内容显示的value而不是text的bug
    thymeleaf-extras-db 0.0.1发布,select标签加载数据的新姿势
  • 原文地址:https://www.cnblogs.com/R3col/p/13171182.html
Copyright © 2020-2023  润新知