zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    十进制,二进制,八进制,十六进制中的相互转换
    oracle中dual表的使用
    弹出窗口
    oracle中的函数
    [导入]几种所见所得的在线编辑器
    操作字符串
    设计模式初认识
    创建型模式之简单工厂模式
    MySQL批量检查表的脚本
    中英文单位对照
  • 原文地址:https://www.cnblogs.com/R3col/p/13171182.html
Copyright © 2011-2022 走看看