upload-labs

pass-01前端js绕过

之前我先拿了一张png图片试了一下,后面想上传php文件受到了禁止

既然前端判断文件类型,那不如在上面填一个|.php

理论上说应该是可以了呀

那换个方法,抓个包试试

把后缀png改成php

pass-02MIME验证

数据包啊,那先抓一个再说(貌似只是判断content-type),那就改一下文件名后缀

pass-03黑名单绕过

服务器端做了一个黑名单过滤,过滤了 asp、aspx、php、jsp,那看来得改一下文件名了

绕过方法

不允许上传.asp,.aspx,.php,.jsp后缀文件,但是可以上传其他任意后缀。比如说:.phtml .phps .php5 .pht,但如果上传的是.php5这种类型文件的话,如果想要被当成php执行的话,需要有个前提条件,即Apache的httpd.conf有如下配置代码

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

关于AddType命令的作用解释如下

AddType 指令
作用:在给定的文件扩展名与特定的内容类型之间建立映射
语法:AddType MIME-type extension [extension] …
AddType指令在给定的文件扩展名与特定的内容类型之间建立映射关系。MIME-type指明了包含extension扩展名的文件的媒体类型。
AddType 是与类型表相关的,描述的是扩展名与文件类型之间的关系。

修改后上传成功

pass-04黑名单绕过-.htaccess

刚才的方法,在这里就不太行了,可以看到,黑名单里php、php5等这种后缀全部不允许上传,但并没有限制.htaccsess文件。

故可以上传.htaccsess文件绕过

此处黑名单没有过滤.htaccess后缀,故此处也可上传.htaccess文件进行绕过。
注: .htaccess文件生效前提条件为1.mod_rewrite模块开启。2.AllowOverride All

.htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能IIS平台上不存在该文件,该文件默认开启,启用和关闭在httpd.conf文件中配置。

构造.htaccess文件,内容如下:AddType application/x-httpd-php .jpg
这里代码的意思可以让 .jpg后缀名文件格式的文件名以php格式解析,因此达到了可执行的效果。所以我们可以把要上传的php文件的后缀名改为.jpg格式从而绕过

**1 . 如何让的本地APACHE器.htaccess
**如何让的本地APACHE器".htaccess"呢?其实只要简朴修改一下apache的httpd.conf设置就让APACHE.htaccess了,来看看操作

打开httpd.conf(在那里? APACHE目录的CONF目录里面),用文本编纂器打开后,查找
(1)
Options FollowSymLinks
AllowOverride None

改为
Options FollowSymLinks
AllowOverride All

**(2)去掉下面的注释
**LoadModule rewrite_module modules/mod_rewrite.so

就了

然后我这边的httpd.conf中并没有这几个设置

那要不直接写入文件试一下?

成功了

pass-05黑名单验证,.user.ini.

这边的源代码不仅将.htaccess加入黑名单,并且还进行全部转小写

本关可以利用ini配置文件进行上传,先上传以auto_prepend_file=1.jpg为内容的.user.ini文件(所有的php文件都自动包含1.jpg文件。.user.ini相当于一个用户自定义的php.ini)然后再上传一句话的脚本,命名为1.jpg。访问即可。

然后

奇怪,不行诶

应该是要,上传成功后,蚁剑连接,但是要注意,题目提示上传目录存在php文件(readme.php)所以蚁剑连接的时候要把文件名改成readme.php

查了一下,这边解析失败应该是版本问题了这边是phpstudy2018

有人说把aphache改成nginx就行,我试试

连接成功

pass-06黑名单验证-大小写绕过

这边没有对大小写进行检查,和pass-04相似,利用大小写混写绕过,先上传php文件然后进行抓包,改成大写即可

pass-07黑名单验证–空格绕过

从源码中可以看到,服务器端对文件后缀名仅仅是进行了去除末尾的”.”以及小写转换操作。但是并没有进行去除空格的操作,(windows系统中会将文件扩展名后的空格做空处理,防止文件被当成另一种不可识别的文件类型。故可利用这个特性来绕过这一关的黑名单)直接上传,抓包,加空格,访问

pass-08黑名单验证–点号绕过

看看和pass-07的区别在哪里?这边对文件名的处理,少了尾部的点号去除,那就加个点

注:Win下xx.jpg[空格] 或xx.jpg.这两类文件都是不允许存在的,若这样命名,windows会默认除去空格或点****

pass-09::$DATA绕过

这边少了去除字符串::$DATA

那什么是$ DATA

NTFS文件系统包括对备用数据流的支持。这不是众所周知的功能,主要包括提供与Macintosh文件系统中的文件的兼容性。备用数据流允许文件包含多个数据流。每个文件至少有一个数据流。在Windows中,此默认数据流称为:$ DATA。

简单讲就是在php+windows的情况下:如果文件名+”::$DATA”会把::$DATA之后的数据当成文件流处理,不会检测后缀名.且保持”::$DATA”之前的文件名。

注:仅windows适用喔

好了,可以去抓包了

pass-10黑名单-单次处理

这边只去除一次点号,一次空格,那么通过抓包,把后缀加上. .即可

pass-11黑名单-双写绕过

这个代码相比之前陌生了很多,总的来说就是利用str_ireplace对黑名单里的文件后缀名进行了替换,换成空字符,使用了str_ireplace函数,即不区分大小写,故大小写绕过不适用。

那就利用抓包,把后缀改成.pphphp,即可

pass-12 00截断

可以发现,这里与之前代码相比,使用了白名单,只允许上传,jpg,png,gif三种格式文件。
但是在进行move_uploaded_file前。利用$_GET[‘save_path’]和随机时间函数拼接成文件存储路径传入,导致服务器最终存储的文件名可控。故可以利用这个点进行绕过。
这里利用的是00截断。即move_uploaded_file函数的底层实现类似于C语言,遇到0x00会截断,0x表示16进制,URL中%00解码成16进制就是0x00。

截断条件:
1、php版本小于5.3.4
2、php.ini的magic_quotes_gpc为OFF状态

先选择一个同名的图片文件抓包构造sava_path=/upload/1.php%00绕过,最后上传的为php文件

pass-13

和pass-12相似,抓包改路径就对了

pass-14图片马,文件包含利用

啊?什么?图片马?图片马=图片+木马?先整一只来好了。

https://www.cnblogs.com/lzkalislw/p/12877943.html可以看看这篇文章

不成功的原因是因为PHP版本不够高,这边是5.2.17

版本高一点即可成功

来看看代码,那个我们来冷静分析一下

来获取文件类型

通过读文件的前2个字节判断文件类型,因此直接上传图片马即可!

pass-15图片马,文件包含利用

听说上一关的马还能用,我试一下,嗯,真的可以

直接来看看源代码吧

函数与pass-14略有不同,但功能与作用都是一样的,这里不再赘述

pass-16 exif_imagetype()

来看个提示

exif_imagetype — 判断一个图像的类型**,读取一个图像的第一个字节并检查其签名。**

pass-17 二次渲染绕过

啥意思,先丢只图片马试一下

图片和之前长得不一样了

看看这两张图有什么区别

上图为原图,下图为上传之后的

之前的语句写的被渲染了,那现在考虑一下要怎么绕过渲染

三种图片方式的解决方案并不相同那分开来说

gif

关于绕过gif的二次渲染,我们只需要找到渲染前后没有变化的位置,然后将php代码写进去,就可以成功上传带有php代码的图片了.

jpg、png

至于具体详情可以看一下这篇文章:https://xz.aliyun.com/t/2657

pass-18 条件竞争

不难发现,这里是先move_uploaded_file函数将上传文件临时保存,再进行判断,如果不在白名单里则unlink删除,在的话就rename重命名,所以这里存在条件竞争。这边通过抓包实现重复上传和重复访问

条件竞争绕过存在一定概率,实践中如果一次不成功,可以多试几次

pass-19

这一关的话和前面的相似,可以尝试抓包解决,不过因为本关先检查文件后缀的缘故,采取图片马即可

有看到这种解法:也可将php文件后缀名更改为.php.7z,因为白名单中允许上传.7z的文件,但是apache又不能解析这个格式而会把该文件当php的格式解析。饶有兴趣尝试了一下

但是用蚁剑连接不上

pass-20

来看看源码,这回又是黑名单,只是禁用小写的文件名后缀,因此将文件名后缀大写即可绕过也可以在post save_name中在文件名后缀末添加空格即可通过。不过这关考的点应该是pathinfo

可以看到,这里img_path可控(通过post save_name),所以可以利用move_uploaded_file的\x00截断(save_name=1.php%00.jpg)绕过,但是上传是成功了,却连接不上,原因是我这里PHP版本过高,php5.3以下可用。
于是网上找找别人的答案,发现考点是:move_uploaded_file会忽略掉文件末尾的/.
所以可以构造save_path=1.php/.,这样file_ext值就为空,就能绕过黑名单,而move_uploaded_file函数忽略文件末尾的/.可以实现保存文件为.php

pass-21

现在是白名单数组绕过

但是我很想试一试图片马,然后我就去试了一下

不太行

分析一下代码:

先检查MIME类型(改Content-Type),然后判断save_name参数是否为空,为空就把文件名称赋值给$file,否则将save_name参数的值赋给它。然后判断$file是否是数组.不是就用explode()函数通过.号分割成数组,取最后一个后缀名,进行白名单验证。不符合就报错,符合就拼接数组的第一个和最后一个作为文件名,保存。

explode() 函数把字符串打散为数组。详情:explode()

1
reset(array &$array)//将数组的内部指针指向第一个单元Copy

绕过explode()函数:传入数组,绕过白名单,由于取的是数组最后一个,所以传入数组的最后一个要为jpg|png|gif,然后拼接文件名,取reset()第一个,即索引为0,和索引count()-1(数组内元素个数-1)。所以索引0应为.php,索引3为jpg(索引1之后即可),这样数组元素个数为2,拼接的就是索引0和索引1即.php和空,结果还是.php

不懂是不是因为用php7的缘故,我在后面加了/才成功,试了一下换成5的话是不用加/的

后记

这个赶在年末结束之前刷完,但是刷的不算特别认真,以后还得经常翻看

参考链接:

https://liquor-boop.github.io/2021/01/24/upload/#Pass-15-%E7%99%BD%E5%90%8D%E5%8D%95-%E5%9B%BE%E7%89%87%E9%A9%AC-getimagesize

https://www.jianshu.com/p/aabc1e7408d5来源:简书