upload-labs
学习
upload-labs
是一个使用php
语言编写的,专门收集渗透测试和CTF
中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共20关,每一关都包含着不同上传方式。
学习资源
项目地址:下载
upload-labs-writeup
:查看
Upload-labs通关手册 :先知社区
li1m总结:writeup
前言
靶机包含漏洞类型分类
如何判断上传漏洞类型?
学习上传思路,docker搭建的靶场可能不能成功getshell
Pass-01
前端绕过,在前端js
判断函数中加上可以上传php
文件或者bp
抓包改后缀
1 | function checkFile() { |
Pass-02
代码
1 | $is_upload = false; |
仅仅判断content-type,于是修改content-type(image/jpeg
,image/png
,image/gif
)绕过
Pass-03
代码
1 | $is_upload = false; |
存在黑名单限制,利用Apache解析漏洞尝试用php3
,phtml
绕过
Apache有解析漏洞,文件在/etc/mime.types
。我在CetnOS上面安装的默认没有解析这几行:
1 | application/x-httpd-php phtml pht php |
添加一行phtml
作为测试,修改后记得service httpd restart
或者systemctl restart httpd.service
其他方法查看upload-labs-writeup
Pass-04
代码
1 | $is_upload = false; |
重写文件解析规则绕过。上传先上传一个名为.htaccess
文件,内容如下:
1 | <FilesMatch "03.jpg"> |
然后再上传一个03.jpg
,执行上传的03.jpg
脚本
Pass-05
代码
1 | $is_upload = false; |
文件名后缀大小写混合绕过。05.php
改成05.phP
然后上传
Pass-06
1 | $is_upload = false; |
黑名单,但是没有对后缀名进行去空处理,可在后缀名中加空绕过
Pass-07
代码
1 | $is_upload = false; |
黑名单,但是没有对后缀名进行去”.”处理,利用windows特性,会自动去掉后缀名中最后的”.”,可在后缀名中加”.”绕过
Pass-08
代码
1 | $is_upload = false; |
Windows文件流特性绕过,文件名改成08.php::$DATA
,上传成功后保存的文件名其实是08.php
Pass-09
代码
1 | $is_upload = false; |
黑名单过滤,注意第15行和之前不太一样,路径拼接的是处理后的文件名,上传文件名后加上点+空格+点,改为09.php. .
Pass-10
代码
1 | $is_upload = false; |
这里是将问题后缀名替换为空,于是可以利用双写绕过, 文件名改成10.pphphp
Pass-11
代码
1 | $is_upload = false; |
白名单判断,但是$img_path
直接拼接,因此可以利用%00截断绕过
post数据包
1 | POST /Pass-11/index.php?save_path=../upload/66.php%00 HTTP/1.1 |
注意以下两行1
2POST /Pass-11/index.php?save_path=../upload/66.php%00 HTTP/1.1
Content-Disposition: form-data; name="upload_file"; filename="66.jpg"
Pass-12
代码
1 | $is_upload = false; |
原理同Pass-11,上传路径0x00
绕过。利用Burpsuite
的Hex功能将save_path
改成../upload/12.php【二进制00】
形式
Pass-13
提示
本pass检查图标内容开头2个字节!
代码
1 | function getReailFileType($filename){ |
使用命令copy normal.jpg /b + shell.php /a webshell.jpg
,将php
一句话追加到jpg
图片末尾,代码不全的话,人工补充完整。形成一个包含Webshell
代码的新jpg`
图片,然后直接上传即可。 接下来利用的话,还需要结合文件包含漏洞。
Pass-14
提示
本pass使用getimagesize()
检查是否为图片文件!
代码
1 | function isImage($filename){ |
直接就可以利用图片马就可进行绕过
Pass-15
提示
本pass使用exif_imagetype()
检查是否为图片文件!
代码
1 | function isImage($filename){ |
添加GIF
图片的文件头绕过检查
Pass-16
提示
本pass重新渲染了图片!
代码
1 | $is_upload = false; |
判断了后缀名、content-type,以及利用imagecreatefromgif
判断是否为gif
图片,最后再做了一次二次渲染。程序没有对渲染异常进行处理,直接在正常png
图片内插入webshell
代码,然后上传
详细版参考:Pass-16
Pass-17
代码
1 | $is_upload = false; |
本关考察的是条件竞争
这里先将文件上传到服务器,然后通过rename修改名称,再通过unlink删除文件,因此可以通过条件竞争的方式在unlink之前,访问webshel
。
首先在burp中不断发送上传webshell
的数据包,不断访问上传后的文件名
python脚本
使用命令pip install hackhttp
安装hackhttp模块
1 | #!/usr/bin/env python |
Pass-18
代码
1 | //index.php |
本关对文件后缀名做了白名单判断,然后会一步一步检查文件大小、文件是否存在等等,将文件上传后,对文件重新命名,同样存在条件竞争的漏洞。可以不断利用burp发送上传图片马的数据包,由于条件竞争,程序会出现来不及rename的问题,从而上传成功
Pass-19
参考:先知社区writeup