upload-labs介绍

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

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

环境要求

配置项     配置     描述
操作系统     Window or Linux     推荐使用Windows,除了Pass-19必须在linux下,其余Pass都可以在Windows上运行
PHP版本     推荐5.2.17     其他版本可能会导致部分Pass无法突破
PHP组件     php_gd2,php_exif     部分Pass依赖这两个组件
中间件     设置Apache以moudel方式连接

Windows快速搭建

项目提供了一个Windows下,按照以上配置要求配置好的集成环境

下载地址:https://github.com/c0ny1/upload-labs/releases

集成环境绿色免安装,解压即可使用。

第一关

上传文件发现是js限制

禁用js上传,上传成功。

访问页面

第二关

查看提示,验证MIME。

上传抓包修改,将Content-Type:修改内容修改为 image/gif

第三关

查看提示,黑名单判断

上传php3或者phtml绕过

上传成功。

访问文件。

第四关

查看提示,黑名单但是几乎过滤所有有问题的后缀名。

但是没有过滤.htaccess,上传一个.htaccess内容 SetHandler application/x-httpd-php 这样所有文件都会解析为php。

然后随便上传个允许的后缀名

然后访问

第五关

查看提示发现禁止了.htaccess

查看源代码发现没有做大小写判断,使用大小写绕过。

上传phpinfo.phP

访问

第六关

查看提示,还是黑名单

查看源码发现没有对首尾去除空格。

上传抓包在文件后缀加个空格即可绕过

访问

 

第七关

查看源码还是黑名单没有对后缀名进行去.操作利用Windows特性会自动去掉后缀名中最后的.可在后缀名中加 . 绕过。

上传

访问

 

第八关

查看源代码,还是黑名单,但是没有对后缀名进行去”::$DATA”处理,利用windows特性,可在后缀名中加” ::$DATA”绕过:

上传

访问

第九关

查看源码

黑名单过滤,注意第15行和之前不太一样,路径拼接的是处理后的文件名,于是构造phpinfo.php. .

(点+空格+点),经过处理后,文件名变成phpinfo.php.,即可绕过。

访问

第十关

查看提示,双写绕过

上传

访问

第十一关

查看代码,看到是白名单判断,但是$img_path直接拼接,因此可以利用%00截断绕过:

上传

访问

第十二关

查看源码,和十一关不同的是这次的save_path是通过post传进来的,还是利用00截断,但这次需要在二进制中进行修改,因为post不会像get对%00进行自动解码。

上传

访问

 

第十三关

查看源码,本关要求上传图片马即可,查看代码:

通过读文件的前2个字节判断文件类型,因此直接上传图片马即可,制作方法:
copy 1.jpg /b + phpinfo.php  phpinfo.jpg

上传 接下来利用的话,还需要结合文件包含漏洞。

第十四关

本关还是要上传一个图片马

这里用getimagesize获取文件类型,还是直接就可以利用图片马就可进行绕过:

第十五关

这里用到php_exif模块来判断文件类型,还是直接就可以利用图片马就可进行绕过:

第十六关

上传一个图片马

本关综合判断了后缀名、content-type,以及利用imagecreatefromgif判断是否为gif图片,最后再做了一次二次渲染,绕过方法:

第十七关

查看代码

1.上传的文件会从临时路径被移动到一个永久路径(upload/文件名)

2.如果文件后缀格式是白名单内的(jpg、png、gif)格式,那么进行文件重命名(新文件名规则为:10~99随机数+现在时间+文件后缀)

3.如果上传的文件不属于白名单匹配的格式,那么会删除文件

绕过方式:

在后台对文件进行rename和unlink时会有一个时间差,利用这个中间间隙的时间去访问上传的webshell会有机会执行。

首先在burp中不断发送上传webshell的数据包:

然后不断在浏览器中访问,可以访问到:

 

第十八关

查看源码 本关对文件后缀名做了白名单判断,然后会一步一步检查文件大小、文件是否存在等等,将文件上传后,对文件重新命名,同样存在条件竞争的漏洞。可以不断利用burp发送上传图片马的数据包,由于条件竞争,程序会出现来不及rename的问题,从而上传成功:

这里我测试没有成功

第十九关

上传webshell,同时自定义保存名称,直接保存为php是不行的

查看代码:发现move_uploaded_file()函数中的img_path是由post参数save_name控制的,因此可以在save_name利用00截断绕过 记得要Url编码

 

Last modification:October 20, 2022
  • 本文作者:Juneha
  • 本文链接:https://blog.mo60.cn/index.php/archives/17.html
  • 版权声明:本博客所有文章除特别声明外,均默认采用 CC BY-NC-SA 4.0 许可协议。
  • 法律说明:
  • 文章声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由用户承担全部法律及连带责任,文章作者不承担任何法律及连带责任,本人坚决反对利用文章内容进行恶意攻击行为,推荐大家在了解技术原理的前提下,更好的维护个人信息安全、企业安全、国家安全,本文内容未隐讳任何个人、群体、公司。非文学作品,请勿过度理解,根据《计算机软件保护条例》第十七条,本站所有软件请仅用于学习研究用途。
如果觉得我的文章对你有用,请随意赞赏,可备注留下ID方便感谢