upload-labs文件上传漏洞(Pass-01~Pass-21)

2023-11-08

目录

pass-1(js前端绕过)

pass-2(MiMe绕过)

pass-3(黑名单绕过)

pass-04(.htaccess文件上传)

pass-05

pass-06(大小写绕过)

pass-07(空格绕过)

pass-08(windows特性加点绕过)

pass-09(::$DATA绕过)

pass-10(点空点绕过)

pass-11(双写绕过)

pass-12(GET请求00截断)

pass-13(POST请求00截断)

pass-14(头文件绕过、图片码绕过、文件包含)

pass-15(头文件绕过、图片码绕过、文件包含)

pass-16(头文件绕过、图片码绕过、文件包含)

pass-17(二次渲染)

pass-18(条件竞争)

pass-19(中间件解析漏洞&条件竞争)

pass-20(%00截断)

pass-21(MIME、数组、/绕过)


pass-1(js前端绕过)

源码:

由于是直接对上传的文件进行判断,只允许.jpg|.png|.gif,上传文件后,substring()函数会提取文件后缀名,由indexOf()处理返回指定的字符串值在字符串中首次出现的位置,然后进行比较,不符合或没有找到则返还 -1

从源码判断出只是在提交时,对后缀名进行检测然后上传至后台

1.上传一句话

<?php phpinfo();?>  

2.burpsuite抓包,修改后缀,将. jpg 改为.php

访问1.php

pass-2(MiMe绕过)

源码:

1.上传一句话

2.bp抓包,修改content-type

MiMe是什么?一串简单的字符串组成的初期标识了邮件e-mail的附件的类型,后来在html文件中可以使用属性表示,当文件上传后,content-type会标记文件类型,简单来说当我们上传一个1.php文件的时候,content-type会自动将我们这个文件类型标识为application/octet-stream,不匹配时上传失败,这里仅允许content-type为image/jpeg,image/png,image/gif属性的通过

将content-type标识的application/octet-stream修改为image/jpeg

上传后访问

MiMe常见的绕过格式

pass-3(黑名单绕过)

源码:

过滤大写绕过,过滤php、asp等为后缀的文件,只是对文件名进行了限制,但是上传文件后,会更改文件名为当前时间

1.上传一句话

2.bp抓包,更改文件后缀

注意:在phpstudy下apache服务下,默认配置文件无法解析以.pthml,.php5等等为后缀的文件,不更改的话服务器无法解析

修改步骤

进入phpstudy的根目录→找到apache文件夹→打开conf→更改httpd.conf配置文件

更改AllowOverride为All

修改默认值#AddType application/x-httpd-php

AddType application/x-httpd-php .php .phtml .php5 .pht

访问

pass-04(.htaccess文件上传)

源码:

过滤大小写绕过,phtml,php5等等

1.先上传.htaccess文件

2.再上传1.jpg

.htaccess文件全称Hypertext Access(超文本入口),提供了针对目录改变配置的方法,通过修改此配置文件,可以帮我们实现自定义错误页面、更改扩展名、使用其他文件作为index文件等等

先上传一个.htaccess文件

SetHandler application/x-httpd-php //所有上传的文件都会当成php来解析  

再上传一个1.jpg,被当成php解析

访问

pass-05

(注:更新后的upload-labs又在第四关后插入第五关,原第五关改为第六关,第六关改为第七关,第七关改为第八关,以此类推)

源码:

方法一:

过滤phtml,php5等等,禁止上传.htaccess文件

1.过滤不严谨,没有过滤Php1,上传1.Php1

方法二:

点绕过

上传文件:1.php. .

访问

pass-06(大小写绕过)

过滤phtml,php5等等,禁止上传.htaccess文件

1.过滤不严谨,没有对大小写严格过滤,上传1.Php

访问

pass-07(空格绕过)

源码:

没有对后缀去空处理,没有对大小写进行转换,因此可以在后缀名加空格绕过

1.上传一句话1.Php

2.bp抓包,在filename的文件名1.Php后增加一个空格

访问

pass-08(windows特性加点绕过)

源码:

没有对后缀名"."进行处理,利用windows特性,会自动去掉后缀名中最后的".",可在后缀名中加"."绕过

1.上传1.php

2.bp抓包,将后缀修改为1.php.

访问

pass-09(::$DATA绕过)

源码:

在window的时候如果文件名+'::$DATA'会把::$DATA之后的数据当成文件流处理,不会检测后缀名。且保留::$DATA之前的文件名。利用windows特性,可在后缀名中加::$DATA绕过

访问

pass-10(点空点绕过)

源码:

代码先去除文件名最后的'.',去除文件名前后的空格,第15行和之前不太一样,路径拼接的是处理后的文件名,导致可以利用1.php. .(点+空格+点)绕过

访问

pass-11(双写绕过)

源码:

str_ireplace函数:替换字符串中的一些字符(不区分大小写)。

语法:str_ireplace(find,replace,string)

find:规定查找的值。

replace:规定替换 find 中的值的值

string:规定被搜索的字符串

如:

        <?php echo str_ireplace("WORLD","Shanghai","Hello world!"); ?>

输出:

                Hello Shanghai!

1.双写绕过,上传一个1.pphphp

2.bp抓包

访问

pass-12(GET请求00截断)

源码:

入手点在substr函数,返回白名单后进行拼接,如果将后缀名改为.php再利用%00截断后面的内容,即可执行一句话

$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;

当以GET方式提交请求的时候,数据会在url内暴露出来,以?分割,多个参数之间用&连接

1.上传文件

2.bp抓包,添加%00

访问

注意:

截断条件:php版本小于5.3.4,magic_quotes_gpc为NO

更改php版本

勾选magic_quotes_gpc

pass-13(POST请求00截断)

源码:

$img_path = $_POST['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext; 

以POST方式提交请求的时,数据不会在url内暴露出来,会放置在http包的包体中,以二进制流的方式传输,所以需要在二进制中进行修改增加%00

注:有些人的bp是新版,界面上可能并没有找到可以直接修改二进制的Hex

首先做个标记

然后从右拉栏里找到

将2b修改为00即可

上传文件

访问

pass-14(头文件绕过、图片码绕过、文件包含)

源码:

ction getReailFileType($filename){ $file = fopen($filename, "rb"); $bin = fread($file, 2); fclose($file); $strInfo = @unpack("C2chars", $bin);

检测是否为真实图片格式,fread读取前两个字符的数量然后做检查

1.制作图片码,上传文件

2.bp抓包获取文件路径

3.利用文件包含漏洞执行

构造图片码

copy 1.jpg /b + 1.php /a ganyu.jpg

上传图片

利用文件包含访问

pass-15(头文件绕过、图片码绕过、文件包含)

源码:

getimagesize() 函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE

将测定 GIF,JPG,PNG等等 图像文件的大小并返回图像的尺寸以及文件类型

1.修改一句话,上传文件

2.bp抓包获取文件路径

3.利用文件包含漏洞访问

常见的文件头

截包,将1.php修改为1.jpg,修改content-type为image/jpeg,然后重放

如果直接访问图片,作为php进行解析,需要利用文件包含访问

payload:127.0.0.1/upload/include.php?file=upload/7220211007162015.gif

 

或者制作图片码代替头文件绕过

copy 1.jpg /b + 1.php /a ganyu.jpg

pass-16(头文件绕过、图片码绕过、文件包含)

源码:

php_exif模块来判断文件类型,方法与上面两题相同

注意:需要先启用php_exif模块

pass-17(二次渲染)

源码:

当上传一个文件的时候,首先$fileext会判断是否为jpg的同时,content-type是否为image/jpeg,然后使用move_uploaded_file进行处理,成功则执行二次渲染

1.利用windows下的画图工具,然后保存为一张gif格式的图片(其他格式有的显示上传失败)

2.上传后,保存上传的图片,与原图做比较,利用winhex写入一句话

3.利用bp抓包,获取上传文件路径

4.利用文件包含读取、解析

上传成功后,右击保存上传后的文件

利用winhex,对比原图和上传图片的区别,在相同的地方写入一句话并保存,然后再上传保存的文件  

访问

pass-18(条件竞争)

源码:

move_uploaded_file()函数将上传文件临时保存,再进行判断

不断上传文件,在文件还没被删除前去读取文件。

如果上传文件1.php内容为

<?php fputs(fopen('2.php','w'),'<?php phpinfo();?>');?>

在判断1.php的时候,服务器会解析写入一个内容为

<?php phpinfo();?>

的2.php文件。这时使用BurpSuite的Intruder不断上传1.php,浏览器不断访问1.php,即可造成条件解析漏洞

1.新建一个1.php文件,写入<?php fputs(fopen('ganyu.php','w'),'<?php phpinfo();?>');?>

2.上传文件,使用bp抓包爆破

3.f5刷新2.php

上传,设置爆破选项

Start attack

不断刷新浏览器页面后,访问生成的ganyu.php

pass-19(中间件解析漏洞&条件竞争)

源码:

利用Apache的解析漏洞,不管最后后缀是什么,构造以.php.xxx结尾,就会被Apache服务器解析成php文件,配合条件竞争访问2.php

注意:这里的路径缺失'/',上传的shell路径为../uploadxxx.php或自行修改源码

访问

pass-20(%00截断)

源码:

题目多出了一个写入保存名称,注意,与GET提交不同的是,POST方式请求的时,数据不会在url内暴露出来,会放置在http包的包体中,以二进制流的方式进行传输,所以需要在二进制中进行修改增加%00

上传2.php,在上传之前,写入保存名称为upload-19.php

给upload-19.php后写入+jpg(加号只是用作标记)

将+改为00,选择+号

然后从右拉栏里找到

将2b修改为00即可

上传

访问

pass-21(MIME、数组、/绕过)

源码:

检测content-type是否存在白名单

判断save_name是否为空定义$file变量

若file不为数组,则explode('.', strtolower($file))对file进行分割

将file变为一个数组,利用end函数将file数组的最后一个单位赋值给$ext

判断$ext是否匹配白名单

将file数组的第一个元素用点拼接最后一个元素,赋值给$file_name后上传

bp抓包

1.修改content-type

2.修改POST参数为数组类型,索引[0]为upload-21.php,索引[2]为jpg|png|gif,只要第二个索引不为1,$file[count($file) - 1]就等价于$file[2-1],值为空

访问

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

upload-labs文件上传漏洞(Pass-01~Pass-21) 的相关文章

随机推荐

  • 快速开发 jQuery 插件的 10 大技巧(转)

    1 把你的代码全部放在闭包里面 这是我用的最多的一条 但是有时候在闭包外面的方法会不能调用 不过你的插件的代码只为你自己的插件服务 所以不存在这个问题 你可以把所有的代码都放在闭包里面 而方法可能应该放在Prototype方法内部 我们后面
  • MySql进阶-间隙锁(gap-key)

    文章目录 Innodb锁算法 关闭Gap Lock Gap key 解决的问题 间隙锁影响 MVCC 核心原理 ReadView 可参考 快照读 当前读可参考 参考 InnoDB存储引擎 注意 gap key是innodb存储引擎来解决当前
  • RK3568虚拟机基础环境搭建之更新源、安装网络工具、串口调试、网络连接、文件传输、安装vscode和samba共享服务

    镜像下载 域名解析 时间同步请点击 阿里云开源镜像站 前言 开始搭建RK3568的基础虚拟机 具备基本的通用功能 主要包含了串口工具minicom 远程登陆ssh 远程传输filezilla 代码编辑工具vscode 虚拟机 文档对对虚拟机
  • a later version of node.js is already installed. Setup will now exit.

    背景 Window想要彻底删除node js安装包 并重新安装新的安装包 操作 彻底删除步骤可以参考 https www cnblogs com fighxp p 7410235 html 结果 在执行完上面步骤操作后 在重新安装时仍报 a
  • C/C++编程笔记:C++中的stringstream及其应用

    stringstream将字符串对象与流相关联 使您可以像从流中读取字符串一样 例如cin 基本方法是 clear 清除流 str 获取并设置其内容存在于流中的字符串对象 运算符 lt lt 将字符串添加到stringstream对象 运算
  • 超详细的集合(set)

    集合 1 定义 由一系列不重复的不可变类型变量组成的可变映射容器 相当于只有键没有值的字典 键则是集合的数据 集合是无序的 所以输入的次序与显示的次序可能不一致 2 基本操作 2 1集合的创建 1 创建空集合 创建空集合 不能直接用 因为系
  • springboot连接mybatis

  • Python数据类型之元组及字典

    元组 tuple 元组表现形式tuple 元组是一个不可变序列 使用 创建元素 元组不是空元组至少有一个 逗号 当元组不是空元组时括号可以省略 元组解包指将元组当中的每一个元素都赋值给一个变量 使用 创建的 my tuple 创建一个空的元
  • idea解决控制台中文乱码问题

    前言 IntelliJ IDEA 如果不进行配置的话 运行程序时控制台中文乱码问题会非常严重 严重影响我们对信息的获取和程序的跟踪 特总结以下 4 点用于解决控制台中文乱码问题 希望有助于大家 注意 下面根据我日常工作的经验总结 排序的先后
  • SpringBoot默认的JSON解析方案

    一 什么是JSON JSON JavaScript Object Notation 是一种基于JavaScript语法子集的开放标准数据交换格式 JSON是基于文本的 轻量级的 通常被认为易于读 写 好了 废话不多说 下面开始介绍如何在Sp
  • Java_.jar .war .ear 详解

    jar 全称 java archive 包含 class properties文件 是文件封装的最小单元 部署文件 application client xml 级别 小 war 全称 web archive 包含 Servlet JSP页
  • Tomcat和Weblogic的区别

    接触到两种Java的web服务器 做项目用的Tomcat 看视频看的是WebLogic Server WLS 都是web服务器 有什么区别和联系呢 一 先简单介绍一下这两种服务器 WebLogic是美国bea公司出品的一个applicati
  • webpack实战,手写loader和plugin

    序言 对于 webpack 来说 loader 和 plugin 可以算是需求程度最为广泛的配置项了 但是呢 单单止步于配置可能还不够 如果我们自己有时候想要 diy 一个需求 但是 webpack 又没有相关的 loader 和 plug
  • 移动端unet人像分割模型--1

    个人对移动端神经网络开发一直饶有兴致 去年腾讯开源了NCNN框架之后 一直都在关注 近期成功利用别人训练好的mtcnn和mobilefacenet模型制作了一个ios版本人脸识别swift版本demo 希望maskrcnn移植到ncnn 在
  • MySQL 数据库崩溃(crash)的常见原因和解决办法

    墨墨导读 本文来自墨天轮用户投稿 详述MySQL 数据库崩溃 crash 的常见原因和解决办法 希望对大家有帮助 数据技术嘉年华 十周年盛大开启 点我立即报名 大会以 自研 智能 新基建 云和数据促创新 生态融合新十年 为主题 相邀数据英雄
  • 使用Git Extensions简单入门Git

    前言 关于这个主题 之前我录了段视频教程 在本地看清晰度还可以 但传到优酷上就很不清晰了 即使是后来重制后还是一样不清晰 所以现在想整理成文字版 当然 大家还可以将我百度云上的视频下载下来观看 连同优酷的相关地址都附在文末了 正文 说到Gi
  • std::vector如何使用

    Vector被认为是一个容器 是因为它可以存放各种类型的对象 正因为这 有时候也被人叫动态数组 能够增加和压缩数据 为了使用vector 必须在头文件中包含如下代码 include
  • File , Folder 与 Directory

    Folder 和 Directory 在电脑上使用的区别 folder 文件夹 directory 目录 directory包含子目录 subdirectory 两着一般情况下可以混用 但是有些稍微的区别 Folder 里要么是子folde
  • JDBC详解

    前期准备 mysql下载安装 mysql下载链接 安装成功验证 cmd 命令行输入命令如下图 登录 远程连接别人的mysql 这里的 h127 0 0 1表示远程连接数据库所在计算机的ip 启动和关闭mysql服务 JDBC的概念和本质 概
  • upload-labs文件上传漏洞(Pass-01~Pass-21)

    目录 pass 1 js前端绕过 pass 2 MiMe绕过 pass 3 黑名单绕过 pass 04 htaccess文件上传 pass 05 pass 06 大小写绕过 pass 07 空格绕过 pass 08 windows特性加点绕