upload-labs
是一个使用php
语言编写的,专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共21关,每一关都包含着不同上传方式。
文件上传漏洞是指:
Web 服务器允许用户将文件上传至其文件系统,但这些文件可能并没有经过充分的验证,如文件名称、类型、内容或大小等。未能正确执行这些限制就意味着即使最基本的图像上传功能也可能用于上传任意具有潜在危险的文件,里面甚至包括远程代码执行的服务器端脚本文件。
上传文件的条件:
1.文件可以上传
2.知道上传文件路径
准备安装好以下工具:
upload-labs靶场
phpstudy2016
火狐浏览器
Burp Suite :抓包工具
蚁剑或菜刀 :webshell连接工具
方法一:浏览器禁用JS
谷歌:F12--设置里找到此选项选择禁用
火狐:F12--设置里找到此选项选择禁用
然后直接上传 .php文件,然后使用蚁剑或菜刀连接
方法二:使用burp抓包修改文件后缀上传
修改后,连击Forward,上传成功使用蚁剑或菜刀连接
方法一:使用burp抓包修改Content-Type,Content-Type的值改为image/png
方法二:使用burp抓包修改后缀
上传 .png文件
上传 .php文件,提示不允许上传,应该是设置了黑名单
方法一:修改文件后缀名为 .php1
上传成功
黑名单里没有限制 ".htaccess"
新建记事本,文件名".htaccess"输入以下内容保存。
SetHandler application/x-httpd-php
命令允许: 1.png图片可被当作php文件,执行图片里的php代码.
#1.png为图片马
先上传".htaccess"文件,然后再上传"1.png"。
前提条件:
AllowOverride All,默认配置为关闭None。
LoadModule rewrite_module modules/mod_rewrite.so #模块为开启状态
上传目录具有可执行权限。
phpstudy版本为5.2.17
apache服务器
这一关限制后缀名很严格,包括大小写和.htaccess文件
绕过:使用双写绕过
使用bp抓包,修改后缀。
上传成功
使用大写绕过
使用双写绕过,与pass-5一样
使用 .. 绕过
使用 ::$DATA 绕过
方法一:. . (点空格点)
方法二:双写绕过
使用双写绕过
使用burp抓包,修改后缀
提示只允许上传 .jpg .png .gif 类型文件
使用%00截断 绕过
%00截断前提条件:
(1)PHP版本小于5.3.4
(2)php.ini中magic_quotes_gpc = Off
#环境配置正确,但是没有上传成功
%00截断原理参考:WEB-00截断与%00截断 | wh1te
使用图片马绕过
图片马绕过:需要使用文件包含漏洞运行图片马中的恶意代码
生成图片马方法:
1.图片使用HxD打开,在结尾加上一句话木马,并保存
2.照片大小控制在100K 以内
上传成功
图片地址可以通过查看网页源代码,或者在图片上右键复制图像链接获得。
构造URL地址:
http://127.0.0.1/upload-labs/include.php?file=./upload/2420231207125031.jpg
使用蚁剑连接
本pass检查图标内容开头2个字节!
这一关需要上传三种图片马
生成图片马方法:
1.分别从网上下载三种格式的图片
2.用HxD打开,在结尾加上一句话木马 #三张图片都是在最后添加一句话马,并保存
三张图片上传成功
在本关页面 点击 “文件包含漏洞”,可以得到文件包含漏洞所在url和代码,从如下代码可知,图片马可以通过file参数包含。
图片地址可以通过查看网页源代码,或者在图片上右键复制图像链接获得。
http://127.0.0.1/upload-labs/include.php?file=./upload/4320231207010933.png
.jpg .png .gif 上传方式一样,都可以连接成功
本pass使用getimagesize()检查是否为图片文件!
这一关参考第14关
本pass使用exif_imagetype()检查是否为图片文件!
具体步骤参考第14关,三张图片都可以上传,蚁剑都可以连接
# 由于本关使用了exif_imagetype()函数,所以需要开启php_exif模块
小皮php_study,开启方法:
网站-->管理-->php扩展, exif 打上勾
本pass重新渲染了图片!
上传准备好的三张图片,发现蚁剑无法连接,使用HxD查看图片,发现上传的图片被渲染后,把php代码删除了。
将一句话木马插在其他位置,提示格式错误,应该是破坏了图片结构
#需要使用HxD对比上传前后的区别,将代码插入没有渲染的部分。
这里使用 .gif 图片
上传后的图片内容与原图片有很多改变,但是发现前半段内容和原图片是一样的
通过文件包含,使用蚁剑连接成功
这一关使用 条件竞争漏洞绕过
提示这一关需要代码审计
$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
$ext_arr = array('jpg','png','gif');
$file_name = $_FILES['upload_file']['name'];
$temp_file = $_FILES['upload_file']['tmp_name'];
$file_ext = substr($file_name,strrpos($file_name,".")+1);
$upload_file = UPLOAD_PATH . '/' . $file_name;
if(move_uploaded_file($temp_file, $upload_file)){
if(in_array($file_ext,$ext_arr)){
$img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext;
rename($upload_file, $img_path);
$is_upload = true;
}else{
$msg = "只允许上传.jpg|.png|.gif类型文件!";
unlink($upload_file);
}
}else{
$msg = '上传出错!';
}
}
服务器先通过move_uploaded_file函数把文件保存了,然后再去判断后缀名是否合法,合法就重命名,如果不合法再删除。重点在于,在多线程情况下,就有可能出现还没处理完,我们就访问了原文件,这样就会导致防护被绕过。
我们上传一个文件上去,后端会检验上传文件是否和要求的文件是否一致。如果不能达到要求就会删除文件,如果达成要求就会保留,那么当我们上传文件上去的时候,检测是否到达要求需要一定的时间,这个时间可长可短,但是我们确确实实在某一刻文件已经上传到了指定地址,并且访问到这个文件。这时候就会造成条件竞争。
move_uploaded_file()函数和unlink()函数:
条件竞争漏洞
条件竞争漏洞是一种服务器端的漏洞,由于服务器端在处理不同用户的请求时是并发进行的,因此,如果并发处理不当或相关操作逻辑顺序设计的不合理时,将会导致此类问题的发生。
上传文件源代码里没有校验上传的文件,文件直接上传,上传成功后才进行判断:如果文件格式符合要求,则重命名,如果文件格式不符合要求,将文件删除。
由于服务器并发处理(同时)多个请求,假如a用户上传了木马文件,由于代码执行需要时间,在此过程中b用户访问了a用户上传的文件,会有以下三种情况:
1.访问时间点在上传成功之前,没有此文件。
2.访问时间点在刚上传成功但还没有进行判断,该文件存在。
3.访问时间点在判断之后,文件被删除,没有此文件。
我们可以利用这个时间差进行攻击
这一关需要使用burp 设置两个流量包,一个持续上传木马的流量包,一个持续访问木马的流量包
1.创建一个cd.php的文件
内容如下:
$f= fopen ("test.php","w") ;
fputs ($f,'');
?>
#代码的作用就是,在访问到这个文件后,这个文件会在服务器的当前目录下创建一个test.php
的文件,内容为
2.上传php文件,使用burp抓包
#这个包是持续上传木马文件的流量包
3.将流量包发送至爆破模块
4.清空所有变量,不设置任何注入点
5.payloads设置中payload type选择null payloads,
Generate:设置为 6000 #这个数字可填大一些
6.修改线程数量
7.快速访问URL
http://127.0.0.1/upload-labs/upload/cd.php
使用burp抓包,发送至爆破模块,设置参数与前6个步骤 一致
#这个是持续访问木马文件的流量包
攻击成功后,在上传目录里会自动生成一句话马
#如果没有成功,就再试一遍
成功访问木马URL地址
参考:
https://www.cnblogs.com/vinslow/p/17053341.html
【文件上传绕过】——条件竞争漏洞_条件竞争上传漏洞-CSDN博客
这一关可以利用 apache解析漏洞+条件竞争 绕过
然而都没有绕过成功
最后使用图片马成功绕过
首先准备一张图片马,直接上传
上传后的地址:http://127.0.0.1/upload-labs/upload1702552082.jpg
图片已经重命名了,而且没有上传到upload目录,蚁剑无法连接
所以可以结合文件包含 绕过
http://127.0.0.1/upload-labs/include.php?file=./upload1702552082.jpg
成功绕过
直接上传php文件,保存名称:upload-19.php
使用burp抓包
修改后缀
#也可以使用大写绕过,末尾加空格绕过,末尾加点绕过
上传成功
这一关是CTF题
上传1.php文件,保存名称:uploud-20.php
使用burp抓包
修改参数
修改前:
修改后:
上传成功
参考:
upload-labs_pass21_CTF逻辑老饶了_upload-labs pass21-CSDN博客
upload-labs通关(Pass-16~Pass-21)_18题目 u = new myupload($_files['upload_file']['name-CSDN博客