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命令的作用解释如下
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 |
|
绕过explode()
函数:传入数组,绕过白名单,由于取的是数组最后一个,所以传入数组的最后一个要为jpg|png|gif
,然后拼接文件名,取reset()
第一个,即索引为0,和索引count()-1
(数组内元素个数-1)。所以索引0应为.php
,索引3为jpg
(索引1之后即可),这样数组元素个数为2,拼接的就是索引0和索引1即.php
和空,结果还是.php
不懂是不是因为用php7的缘故,我在后面加了/才成功,试了一下换成5的话是不用加/的
后记
这个赶在年末结束之前刷完,但是刷的不算特别认真,以后还得经常翻看
参考链接:
- 本文作者:Almond
- 本文链接:http://example.com/2021/01/31/upload-labs/index.html
- 版权声明:本博客所有文章均采用 BY-NC-SA 许可协议,转载请注明出处!