Upload-labs通关

发布于 2019-10-23  1.51k 次阅读


upload-labs是一个使用php语言编写的,专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共20关,每一关都包含着不同上传方式。

项目地址:https://github.com/c0ny1/upload-labs

phpstudy一键环境链接: https://pan.baidu.com/s/1eDGMI1DNbqAQ5rdOOJrw9w 提取码: qkjz

Upload-labs 第一关

查看提示,js本地文件验证

尝试删除onsubmit="return checkFile()"函数,在进行上传

Upload-labs 第二关

查看提示,MIME文件绕过

这里尝试进行对Content-Type进行修改

Upload-labs 第三关

查看提示,发现绕过的有常规的脚本文件

查看代码发现过滤了 点,大小写,空格,data

这里尝试php345绕过

Upload-labs 第四关

查看提示,发现php345不行了

查看源代码

这里可以尝试.htaccess文件

关于.htaccess文件这个有篇文章https://blog.csdn.net/yangpit/article/details/82260519

附上代码

Upload-labs 第五关

查看提示,发现.htaccess文件也不行了

查看源代码发现转换为小写的代码没有了

根据上面的我们可以尝试 .phP

Upload-labs 第六关

查看提示,发现禁止的还是之前的

查看源代码发现首尾去空的没有了

这里尝试加空格进行绕过

Upload-labs 第七关

查看提示,发现已经封死了。。。。

查看源代码,发现删除点的语句没有了

这里就可以用点的特性了

Upload-labs 第八关

查看提示,还是绕过的常规的

查看源代码发现去除::$DATA文件的语句没有了

这里可以尝试加入::$DATA

关于 ::$DATA (php 在window的时候如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名.且保持"::$DATA"之前的文件名 )

Upload-labs 第九关

查看提示发现还是封死。。。。。。

这里发现文件不一样,路径拼接的是处理后的文件名。

于是构造 fox.php. . (点+空格+点),尝试进行绕过

Upload-labs 第十关

查看提示,发现应该是过滤后缀

查看源代码,这里是将问题后缀名替换为空也就是php.php会变成php. 但是这里只过滤一次

这里需要注意写法,拿phphpp和pphphp作比较

其实前几关都能用Apache的解析漏洞,fox.php.7z

Upload-labs 第十一关

查看提示,这里发现路径可控

查看源代码发现$_GET['save_path'] get传输save_path是可以控制的

控制路径这里可以使用抓包测试一下

所有可以尝试00截断进行测试(因为get传输的不用转换)

Upload-labs 第十二关

查看提示,发现还是可以控制路径

查看源代码,发现$_POST['save_path'] 这次是post传输save_path是可以控制的

抓包看一下

发现post传输路径这里也是可以控制的,然后还是可以尝试00截断 注意:(post需要转换)

Upload-labs 第十三关

查看提示,发现是判断文件头

以gif文件头为例,进行绕过上传

尝试包含

Upload-labs 第十四关

查看提示,getimagesize()检查是否文件图片文件

getimagesize() 函数用于获取图像尺寸,这里可以用图片马进行绕过。

Upload-labs 第十五关

查看提示,发现使用exif_imagetype()检查是否为图片文件

这里exif_imagetype() 此函数是php内置函数,用来获取图片类型。 这里同样可以用图片马绕过

Upload-labs 第十六关

查看提示,发现图片用了二次渲染

查看源代码

发现这关判断了 后缀名,content-type,以及利用imagecreatefromgif判断是否为gif图片,最后再做了一次二次渲染

介绍一下关于二次渲染一句话的制作方法

首先正常图片一句话木马

上传成功过后把文件下载进行对比

这里看到后面的一句话被吃掉了,对比前面的代码这里比较代码没有变化的两个地方进行插入木马。(这点是真的比较坑了)

尝试链接,发现并不行

下载图片进行查询发现没有php代码

这里我们重新在对比进行插入代码

重新保存上传,连接成功

Upload-labs 第十七关

查看提示,让查看源代码。

可以看到文件先经过保存,然后判断后缀名是否在白名单中,如果不在则删除,我们可以利用这个时间差进行上传。

先使用命令pip install hackhttp安装hackhttp模块,在运行脚本

Upload-labs 第十八关

查看源代码,发现可以利用上传重命名竞争+Apache解析漏洞

上传名字为fox.php.7z的文件,快速重复提交该数据包,会提示文件已经被上传,但没有被重命名

Upload-labs 第十九关

查看提示,用post传输,

查看源代码

这里发现move_uploaded_file()函数中的img_path是由post参数save_name控制的,因此可以在save_name利用00截断绕过 抓包测试

Upload-labs 第二十关

查看提示,代码审计

查看源代码

可以发现$file_name经过reset($file) . '.' . $file[count($file) - 1];处理

这里发现如果上传的为数组,就会跳过$file = explode('.', strtolower($file));
并且后缀有白名单过滤

而最终的文件名后缀取的是$file[count($file) - 1],
因此我们可以让$file为数组。$file[0]为fox.php/,也就是reset($file)
$file[2]为白名单中的jpg,此时end($file)等于jpg,$file[count($file) - 1]为空。
而 $file_name = reset($file) . '.' . $file[count($file) - 1];
也就是fox.php/.,最终move_uploaded_file会忽略掉/.
最终上传fox.php

修改代码

查看文件


只有站在顶端的人才能定义所谓的善恶。