upload-Labs靶场“1-5”关通关教程

君衍.

  • 一、环境搭建
  • 二、第一关 前端JS检测后缀
    • 1、源码分析
    • 2、禁用浏览器JS上传
    • 3、burp抓包修改
  • 三、第二关 MIME头验证
    • 1、源码分析
    • 2、burp抓包绕过
  • 四、第三关 PHP3绕过
    • 1、源码分析
    • 2、PHP3绕过
  • 五、第四关 .htaccess重写绕过
    • 1、源码分析
    • 2、.htaccess复写
  • 六、第五关 黑名单大小写绕过
    • 1、源码分析
    • 2、大小写绕过上传

一、环境搭建

注意:本靶场使用php版本为5.2.17才可正常使用。
首先这个靶场用来学习和测试文件上传漏洞的靶场(Web安全实验场)。它提供了一系列的漏洞场景和挑战,让安全研究人员和开发者能够实践和测试文件上传漏洞相关的技术和解决方案。

文件上传漏洞是指应用程序在接收用户上传的文件时,未能充分验证或限制文件类型、大小、执行权限等导致的安全漏洞。攻击者可能通过滥用这一漏洞,上传包含恶意代码或有害内容的文件,从而危害服务器和应用程序的安全。

这个我们使用小皮来提供中间件,源码可以去github上进行下载:
https://github.com/c0ny1/upload-labs

在这里插入图片描述
使用Nginx或者Apache中间件即可。同时放入小皮的web目录里面进行访问即可。
在这里插入图片描述
即为www目录下面,然后进行访问查看是否完成环境的搭建。
在这里插入图片描述
看到如上界面我们即可完成环境的搭建。

二、第一关 前端JS检测后缀

首先我们这里我们首先构造一个一句话木马来供我们来测试,这里我们使用phpinfo函数来进行判断:
在这里插入图片描述
创建一个文件为1.php:

<?php phpinfo(); ?>

在这里插入图片描述
我们直接上传尝试:
在这里插入图片描述
这个我们可以看到回显结果为:该文件不允许上传,请上传.jpgl.png|.gif类型的文件,当前文件类型为: .php

在文件上传时,用户选择文件时,或者提交时,有些网站会对前端文件名进行验证,一般检测后缀名,是否为上传的格式。如果上传的格式不对,则弹出提示文字。此时数据包并没有提交到服务器,只是在客户端通过 js 文件进行校验,验证不通过则不会提交到服务器进行处理。

1、源码分析

下面我们来观察其中的源码进行分析:

function checkFile() {
    var file = document.getElementsByName('upload_file')[0].value;
    if (file == null || file == "") {
        alert("请选择要上传的文件!");
        return false;
    }
    //定义允许上传的文件类型
    var allow_ext = ".jpg|.png|.gif";
    //提取上传文件的类型
    var ext_name = file.substring(file.lastIndexOf("."));
    //判断上传文件类型是否允许上传
    if (allow_ext.indexOf(ext_name) == -1) {
        var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
        alert(errMsg);
        return false;
    }
}

我们这里只查看关键代码可以看到这里使用前端JS进行了检测。详细查看下源码:

# 定义了一个JS函数
function checkFile() {
	# 通过document.getElementsByName方法来获取名为upload_file元素
    var file = document.getElementsByName('upload_file')[0].value;
    # 判断用户是否进行了选择文件,如果没有选择,那么提示用户选择
    if (file == null || file == "") {
        alert("请选择要上传的文件!");
        return false;
    }
    //定义允许上传的文件类型
    var allow_ext = ".jpg|.png|.gif";
    //提取上传文件的类型
    var ext_name = file.substring(file.lastIndexOf("."));
    //判断上传文件类型是否允许上传
    if (allow_ext.indexOf(ext_name) == -1) {
        var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
        alert(errMsg);
        return false;
    }
}
  • var ext_name = file.substring(file.lastIndexOf("."));提取用户上传文件的后缀名。 使用lastIndexOf()方法找到文件名中最后一个.的位置,然后使用substring()方法获取该位置到字符串末尾的子字符串,即文件的后缀名。
  • if (allow_ext.indexOf(ext_name) == -1) {检查用户上传的文件后缀名是否在允许的文件类型列表中。 如果用户上传的文件后缀名不在允许的文件类型列表中(即indexOf()返回值为-1),则弹出提示框告知用户不允许上传该类型的文件,并返回false,表示文件不符合条件,上传操作终止。

在这里插入图片描述
在这里插入图片描述

2、禁用浏览器JS上传

这里我们可以看到是使用的是前端JS进行过滤的,所以我们可以禁用浏览器的JS解析,我这里使用的火狐浏览器。
这里我们在URL中输入:

about:config

在这里插入图片描述
在这里插入图片描述
然后搜索:

JavaScript.enabled

我们可以看到这里是true,也就是启用的状态,然后点击:
在这里插入图片描述
即为false即为禁用,这下我们继续尝试上传:
在这里插入图片描述
即可完成本关的文件上传。

3、burp抓包修改

首先我们使用它规定上传的文件类型进行上传,这里我使用jpg文件来绕过JS的过滤:
在这里插入图片描述
然后去上传,绕过JS过滤同时使用burp进行抓包:
在这里插入图片描述
这里我们需要注意抓包使用我们真实的IP地址而不是使用127.0.0.1进行抓包
在这里插入图片描述
这里我们即可看到我们上传的文件类型为jpg,然后我们在这里将文件类型改为php:
在这里插入图片描述
点击放通,即可看到我们上传成功:
在这里插入图片描述
在这里插入图片描述
我们在upload目录下即可进行执行,可见前端的过滤即可轻松绕过。

三、第二关 MIME头验证

我们同样使用1.php尝试去上传,即可看到:
在这里插入图片描述
这里我们看到输出:文件类型不正确,请重新上传。 同时我们点击提示可以看到
在这里插入图片描述
本pass在服务端对数据包的MIME进行检查!其实是对我们上传的内容进行了MIME验证,判断上传文件的MIME类型是不是我们的预期类型。

1、源码分析

if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name'];          
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '文件类型不正确,请重新上传!';
        }
    } else {
        $msg = UPLOAD_PATH.'文件夹不存在,请手工创建!';
    }
}

首先判断表单是否进行了提交if (isset($_POST['submit'])),然后判断服务器上是否存在指定的上传目录UPLOAD_PATHif (file_exists(UPLOAD_PATH)),再次进行判断上传文件的MIME类型是否被允许的图像类型即为jpeg、png、gif类型if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')),然后获取上传文件的临时文件路径,构建目标文件的路径,同时包含了上传目录以及上传文件的原始文件名,使用move_uploaded_file函数完成上传文件的移动,如果文件成功移动,则为true,否则$msg为上传出错。以及如果上传文件的MIME类型不在允许的图像类型中,那么将$msg设置为文件类型不正确,请重新上传。同时如果上传目录不存在,将$msg设置为文件夹不存在,手工创建。

其实就是判断HTTP请求中的content-Type头部参数是否在允许上传的类型当中。
这个参数描述了请求中发送的实体的MIME类型,对于文件上传来说,它描述了上传文件的MIME类型。在文件上传的HTTP请求中,Content-Type 头部参数告诉服务器正在上传的文件的类型是什么。
在这里插入图片描述

2、burp抓包绕过

这里我们可以来看下php文件上传之后类型为:
在这里插入图片描述
我们可以看到类型为:application/octet-stream这个文件类型是二进制流的默认类型,即为未知文件类型,所以这里也就无法上传成功,我们尝试将文件类型进行修改,改为image/jpeg即jpeg图片格式,查看是否可以成功绕过:
在这里插入图片描述
然后放通查看能否上传成功:
在这里插入图片描述
即可看到上传成功。当然我们一样可以上传s.jpg文件然后进行抓包修改为php类型,一样可以上传成功。

四、第三关 PHP3绕过

本人后面在小皮上重新创建了一个网站,然后将网站根目录放入靶场,
在这里插入图片描述
将该靶场的PHP版本更改为了5.2版本的来使用。
这里我无法下载PHP5.2的配置包,所以索性就在网上找了个php按在了虚拟机上,害
在这里插入图片描述
在这里插入图片描述
下面我们来看第三关:
在这里插入图片描述
在这里插入图片描述
可以看到提示:不允许上传.asp,.aspx,.php,.jsp后缀文件!

1、源码分析

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array('.asp','.aspx','.php','.jsp');
        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = deldot($file_name);//删除文件名末尾的点
        $file_ext = strrchr($file_name, '.');
        $file_ext = strtolower($file_ext); //转换为小写
        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
        $file_ext = trim($file_ext); //收尾去空
        if(!in_array($file_ext, $deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;            
            if (move_uploaded_file($temp_file,$img_path)) {
                 $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

添加注释来解读该代码:

$is_upload = false;
$msg = null;
// 检查是否有名为 submit 的表单提交
if (isset($_POST['submit'])) {
    // 检查上传目录是否存在
    if (file_exists(UPLOAD_PATH)) {
        // 定义不允许上传的文件后缀列表
        $deny_ext = array('.asp', '.aspx', '.php', '.jsp');
        // 获取上传文件的原始文件名并进行处理
        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = deldot($file_name); // 删除文件名末尾的点
        $file_ext = strrchr($file_name, '.'); // 获取文件的扩展名
        $file_ext = strtolower($file_ext); // 转换为小写
        $file_ext = str_ireplace('::$DATA', '', $file_ext); // 去除字符串::$DATA
        $file_ext = trim($file_ext); // 收尾去空
        // 如果上传的文件后缀不在禁止列表中
        if (!in_array($file_ext, $deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name']; // 获取上传文件的临时文件路径
            // 构建目标文件路径,包括上传目录、日期时间和随机数
            $img_path = UPLOAD_PATH . '/' . date("YmdHis") . rand(1000, 9999) . $file_ext;
            // 将上传的文件移动到目标路径
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true; // 标记上传成功
            } else {
                $msg = '上传出错!'; // 如果移动文件失败,设置错误消息
            }
        } else {
            $msg = '不允许上传 .asp, .aspx, .php, .jsp 后缀文件!'; // 如果文件后缀在禁止列表中,设置错误消息
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!'; // 如果上传目录不存在,设置错误消息
    }
}

首先,设置了 $is_upload$msg 两个变量,用于标记上传状态和存储错误消息。检查是否有名为 submit 的表单提交。检查上传目录是否存在,如果不存在则设置相应的错误消息。定义了不允许上传的文件后缀列表。获取上传文件的原始文件名,并对其进行处理,包括删除末尾的点、获取文件扩展名、转换为小写、去除特殊字符串、去除首尾空格。如果上传的文件后缀不在禁止列表中,则将文件移动到指定的上传目录,并生成一个新的文件名。如果移动文件失败,则设置相应的错误消息。如果上传的文件后缀在禁止列表中,则设置相应的错误消息。如果上传目录不存在,则设置相应的错误消息。

该源码就是添加了黑名单来进行验证,但是这里黑名单并不全,可以使用PHP3,4,5来进行绕过。
上传模块,有时候会写成黑名单限制,在上传文件的时获取后缀名,再把后缀名与程序中黑名单进行检测,如果后缀名在黑名单的列表内,文件将禁止文件上传。

2、PHP3绕过

如果在 apache 可以开启 application/x-httpd-phpAddType application/x-httpd-php .php .phtml .php3后缀名为 phtml 、php3 均被解析成 php 有的 apache 版本默认就会开启。
上传目标中间件可支持的环境的语言脚本即可,如.phtml、php3。上面经过源码的分析,我们就将1.php改为1.php3来进行上传:
在这里插入图片描述
点击上传我们即可发现上传成功。
在这里插入图片描述
这里我们通过查看器看到上传后文件的名称,然后我们去文件目录下执行:
在这里插入图片描述
可以看到成功被执行,注意,php版本需为5.2.17

五、第四关 .htaccess重写绕过

首先我们来查看提示:
在这里插入图片描述
我们看到这里过滤掉了很多后缀,但是没有进行过滤.htaccess,这里首先我们就需要认识.htaccess文件的作用:

.htaccess文件的作用:
htaccess文件时Apache服务中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮助我们实现:网页301重定向、自定义404错误页面,改变文件扩展名、允许/阻止特定的用户或者目录的访问,禁止目录列表,配置默认文档等功能
最常用的作用就是实现一个伪静态页面SetHandler application/x-http-php的意思是设置当前目录所有文件都使用php解析,一方面我们文件的后缀更改为html依然可以被当作php进行解析。另一方面,如果在上传目录不进行限制,一旦出现恶意上传.htaccess文件的行为,立刻就会引发安全隐患。无论上传任何文件,只要符合php语言代码规范,就会被当做PHP执行。

1、源码分析

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2","php1",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2","pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf");
        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = deldot($file_name);//删除文件名末尾的点
        $file_ext = strrchr($file_name, '.');
        $file_ext = strtolower($file_ext); //转换为小写
        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
        $file_ext = trim($file_ext); //收尾去空

        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 . '文件夹不存在,请手工创建!';
    }
}

添加注释解读代码:

$is_upload = false;
$msg = null;

if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        // 定义不允许上传的文件后缀列表
        $deny_ext = array(
            ".php", ".php5", ".php4", ".php3", ".php2", "php1",
            ".html", ".htm", ".phtml", ".pht", ".pHp", ".pHp5", ".pHp4", ".pHp3", ".pHp2", "pHp1",
            ".Html", ".Htm", ".pHtml",
            ".jsp", ".jspa", ".jspx", ".jsw", ".jsv", ".jspf", ".jtml", ".jSp", ".jSpx", ".jSpa", ".jSw", ".jSv", ".jSpf", ".jHtml",
            ".asp", ".aspx", ".asa", ".asax", ".ascx", ".ashx", ".asmx", ".cer", ".aSp", ".aSpx", ".aSa", ".aSax", ".aScx", ".aShx", ".aSmx", ".cEr",
            ".sWf", ".swf"
        );

        // 获取上传文件的原始文件名并进行处理
        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = deldot($file_name); // 删除文件名末尾的点
        $file_ext = strrchr($file_name, '.'); // 获取文件的扩展名
        $file_ext = strtolower($file_ext); // 转换为小写
        $file_ext = str_ireplace('::$DATA', '', $file_ext); // 去除字符串::$DATA
        $file_ext = trim($file_ext); // 收尾去空

        // 如果上传的文件后缀不在禁止列表中
        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 . '文件夹不存在,请手工创建!'; // 如果上传目录不存在,设置错误消息
    }
}

首先,设置了 $is_upload 和 $msg 两个变量,用于标记上传状态和存储错误消息。检查是否有名为 submit 的表单提交。检查上传目录是否存在,如果不存在则设置相应的错误消息。定义了不允许上传的文件后缀列表。获取上传文件的原始文件名,并对其进行处理,包括删除末尾的点、获取文件扩展名、转换为小写、去除特殊字符串、去除首尾空格。如果上传的文件后缀不在禁止列表中,则将文件移动到指定的上传目录。如果移动文件失败,则设置相应的错误消息。如果上传的文件后缀在禁止列表中,则设置相应的错误消息。如果上传目录不存在,则设置相应的错误消息。

在这里插入图片描述

2、.htaccess复写

上传模块,黑名单过滤了所有的能执行的后缀名,如果允许上传.htaccesshtaccess文件的作用是 可以帮我们实现包括:文件夹密码保护、用户自动重定向、自定义错误页面、改变你的文件扩展名、封禁特定 IP 地址的用户、只允许特定 IP 地址的用户、禁止目录列表,以及使用其他文件作为 index 文件等一些功能。

在 htaccess 里写入 SetHandler application/x-httpd-php 则可以文件重写成 php 文件。要 htaccess 的规则生效 则需要在 apache 开启 rewrite 重写模块,因为 apache是多数都开启这个模块,所以规则一般都生效。

我们在上传.htaccess的内容为:

<FilesMatch "jpg">
SetHandler application/x-httpd-php
</FilesMatch>

在这里插入图片描述
首先上传.htaccess文件,再上传恶意的jpg
文件来访问图片从而执行脚本。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
然后复制图片的链接来访问:
在这里插入图片描述
即可完成文件上传。

六、第五关 黑名单大小写绕过

1、源码分析

$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",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = deldot($file_name);//删除文件名末尾的点
        $file_ext = strrchr($file_name, '.');
        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
        $file_ext = trim($file_ext); //首尾去空

        if (!in_array($file_ext, $deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '此文件类型不允许上传!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

添加注释解读代码:

$is_upload = false;
$msg = null;

if (isset($_POST['submit'])) { // 检查是否有名为 `submit` 的表单提交
    if (file_exists(UPLOAD_PATH)) { // 检查上传目录是否存在
        // 定义不允许上传的文件后缀列表
        $deny_ext = array(
            ".php", ".php5", ".php4", ".php3", ".php2", ".html", ".htm", ".phtml", ".pht", ".pHp", ".pHp5", ".pHp4", ".pHp3", ".pHp2", ".Html", ".Htm", ".pHtml",
            ".jsp", ".jspa", ".jspx", ".jsw", ".jsv", ".jspf", ".jtml", ".jSp", ".jSpx", ".jSpa", ".jSw", ".jSv", ".jSpf", ".jHtml",
            ".asp", ".aspx", ".asa", ".asax", ".ascx", ".ashx", ".asmx", ".cer", ".aSp", ".aSpx", ".aSa", ".aSax", ".aScx", ".aShx", ".aSmx", ".cEr",
            ".sWf", ".swf", ".htaccess"
        );

        // 获取上传文件的原始文件名并进行处理
        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = deldot($file_name); // 删除文件名末尾的点
        $file_ext = strrchr($file_name, '.'); // 获取文件的扩展名
        $file_ext = str_ireplace('::$DATA', '', $file_ext); // 去除字符串::$DATA
        $file_ext = trim($file_ext); // 去除首尾空格

        if (!in_array($file_ext, $deny_ext)) { // 如果上传的文件后缀不在禁止列表中
            $temp_file = $_FILES['upload_file']['tmp_name']; // 获取上传文件的临时文件路径
            // 构建目标文件路径,采用时间戳和随机数作为文件名以确保唯一性
            $img_path = UPLOAD_PATH . '/' . date("YmdHis") . rand(1000, 9999) . $file_ext;
            
            // 将上传的文件移动到目标路径
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true; // 标记上传成功
            } else {
                $msg = '上传出错!'; // 如果移动文件失败,设置错误消息
            }
        } else {
            $msg = '此文件类型不允许上传!'; // 如果文件后缀在禁止列表中,设置错误消息
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!'; // 如果上传目录不存在,设置错误消息
    }
}

首先,设置了 $is_upload 和 $msg 两个变量,用于标记上传状态和存储错误消息。检查是否有名为 submit 的表单提交。检查上传目录是否存在,如果不存在则设置相应的错误消息。定义了不允许上传的文件后缀列表,包括一些常见的可执行文件和脚本文件,以及 .htaccess 文件。获取上传文件的原始文件名,并对其进行处理,包括删除末尾的点、获取文件扩展名、去除特殊字符串、去除首尾空格。如果上传的文件后缀不在禁止列表中,则将文件移动到指定的上传目录,文件名采用时间戳和随机数以确保唯一性。如果移动文件失败,则设置相应的错误消息。如果上传的文件后缀在禁止列表中,则设置相应的错误消息。如果上传目录不存在,则设置相应的错误消息。

在这里插入图片描述

2、大小写绕过上传

我们仔细查看黑名单以及函数会发现忽略了以PHP、phP结尾的后缀名,同时php不区分大小写,所以这里我们直接可以使用大小写进行绕过,将1.php改为1.PHP来进行上传。
在这里插入图片描述
然后复制图片链接进行访问,即可执行:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/418528.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VPP学习之配置VXLAN隧道

VPP学习之配置VXLAN隧道 一、VXLAN技术 VXLAN&#xff08;Virtual eXtensible Local Area Network&#xff0c;虚拟扩展局域网&#xff09;&#xff0c;是由IETF定义的NVO3&#xff08;Network Virtualization over Layer 3&#xff09;标准技术之一&#xff0c;是对传统VLAN…

互动多媒体内容的魔法:如何让你的网页活起来

互动多媒体内容的魔法&#xff1a;如何让你的网页活起来 前言 在之前的文章中&#xff0c;我们探讨了网页结构中的基础介绍&#xff0c;本文将介绍如何通过简单的交互增强用户体验&#xff0c;包括图像大小的动态切换&#xff0c;以及音视频内容的播放控制来介绍网页多媒体的具…

测试:4核8G服务器并发数,支持多少人?

腾讯云4核8G服务器支持多少人在线访问&#xff1f;支持25人同时访问。实际上程序效率不同支持人数在线人数不同&#xff0c;公网带宽也是影响4核8G服务器并发数的一大因素&#xff0c;假设公网带宽太小&#xff0c;流量直接卡在入口&#xff0c;4核8G配置的CPU内存也会造成计算…

出现 ‘vue‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件的解决方法(图文界面)

目录 前言1. 问题所示2. 原理分析3. 解决方法前言 由于Java转全栈,对此前端的细节点都比他人更加注意,所以此处记录更有用的信息!(小白都能看懂) 1. 问题所示 出现如下问题: F:\vue_project>vue -version vue 不是内部或外部命令,也不是可运行的程序 或批处理文件…

网关kong记录接口处理请求和响应插件 tcp-log-with-body的安装

tcp-log-with-body 介绍 Kong的tcp-log-with-body插件是一个高效的工具&#xff0c;它能够转发Kong处理的请求和响应。这个插件非常适用于需要详细记录API请求和响应信息的情景&#xff0c;尤其是在调试和排查问题时。 软件环境说明 kong version 2.1.4 - 2.8.3 [可用亲测]C…

Windows Docker 部署 Redis

部署 Redis 打开 Docker Desktop&#xff0c;切换到 Linux 内核。然后在 PowerShell 执行下面命令&#xff0c;即可启动一个 redis 服务 docker run -d --name redis -p 6379:6379 redis-如果需要自启动&#xff0c;加 --restart always 参数即可。 连接 Redis 使用客户端连…

数据中心GPU集群高性能组网技术分析

数据中心GPU集群组网技术是指将多个GPU设备连接在一起&#xff0c;形成一个高性能计算的集群系统。通过集群组网技术&#xff0c;可以实现多个GPU设备之间的协同计算&#xff0c;提供更大规模的计算能力&#xff0c;适用于需要大规模并行计算的应用场景。 常用的组网技术&…

【Python笔记-设计模式】状态模式

一、说明 状态模式是一种行为设计模式&#xff0c;用于解决对象在不同状态下具有不同行为 (一) 解决问题 在对象行为根据对象状态而改变时&#xff0c;规避使用大量的条件语句来判断对象的状态&#xff0c;提高系统可维护性 (二) 使用场景 当对象的行为取决于其状态&#…

NPN型三极管与PNP型三极管基本原理

NPN型三极管与PNP型三极管基本原理 文章目录 NPN型三极管与PNP型三极管基本原理一、三极管二、结构三、工作原理四、基本应用五、总计 一、三极管 三极管是电子电路中最基本、最常见、重要的器件&#xff0c;其主要功能是对电流的放大和开关作用&#xff0c;从半导体结构上可以…

全国夜间灯光指数数据、GDP密度分布、人口密度分布、土地利用数据、降雨量数据

引言 DMSP/OLS的1992-2013年全球遥感影像&#xff0c;包括三种非辐射定标的夜间灯光影像。三种全年平均影像分别是&#xff1a;无云观测频数影像、平均灯光影像和稳定灯光影像。目前地理遥感生态网可提供全国稳定灯光影像免费下载。稳定灯光影像是标定夜间平均灯光强度的年度栅…

HCIA-HarmonyOS设备开发认证V2.0-习题

目录 习题一习题二&#xff08;待续...&#xff09;坚持就有收获 习题一 # HarmonyOS简介 1. 以下哪几项属于OpenHarmony的技术特性&#xff1f;&#xff08;&#xff09;A. 统一OS&#xff0c;弹性部署B. 一次开发&#xff0c;多端部署C. 硬件互助&#xff0c;资源共享2. Ope…

Ansible get_url模块 get_url模块用于将文件或软件从http、https或ftp下载到本地节点上

目录 常用参数&#xff1a;案例验证 常用参数&#xff1a; dest&#xff1a; 指定将文件下载的绝对路径—必须 url&#xff1a; 文件的下载地址&#xff08;网址&#xff09;—必须 url_username: 用于http基本认证的用户名 url_password&#xff1a; 用于http基本认证的密码 v…

Springboot解决模块化架构搭建打包错误找不到父工程

Springboot解决模块化架构搭建打包错误找不到父工程 一、情况一找不到父工程依赖1、解决办法 二、情况二子工程相互依赖提示"程序包xxx不存在" 一、情况一找不到父工程依赖 报错信息 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:…

最新精心整理Android面试题,Android未来路在何方

我们程序员经常迷茫于有太多东西要学&#xff0c;有些找不到方向、不知所措。 很多程序员都愿意说&#xff0c;我想变得更好&#xff0c;但是更好是什么却很模糊&#xff0c;同时我们又不知道该怎么样去做。我们的生命如此短暂&#xff0c;作为程序员的职业生涯可能会更短。所…

海量物理刚体 高性能物理引擎Unity Physics和Havok Physics的简单性能对比

之前的博客中我们为了绕过ECS架构&#xff0c;相当于单独用Batch Renderer Group实现了一个精简版的Entities Graphics&#xff0c;又使用Jobs版RVO2实现了10w人同屏避障移动。 万人同屏对抗割草 性能测试 PC 手机端 性能表现 弹幕游戏 海量单位同屏渲染 锁敌 避障 非ECS 那么有…

react 原理揭秘

1.目标 A. 能够知道setState()更新数据是异步的 B. 能够知道JSX语法的转化过程 C. 能够说出React组件的更新机制 D. 能够对组件进行性能优化 E. 能够说出虚拟DOM和Diff算法 2.目录 A. setState()的说明 B. JSX语法的转化过程 C. 组件更新机制 D. 组件性能优化 E. 虚拟DOM和D…

xss高级靶场

一、环境 XSS Game - Ma Spaghet! | PwnFunction 二、开始闯关 第一关 看看代码 试一下直接写 明显进来了为什么不执行看看官方文档吧 你不执行那我就更改单标签去使用呗 ?somebody<img%20src1%20onerror"alert(1)"> 防御&#xff1a; innerText 第二关…

云计算 2月26号 (进程管理和常用命令)

一、权限扩展 文件权限管理之&#xff1a; 隐藏权限防止root误删除 文件属性添加与查看 [rootlinux-server ~]# touch file1 file2 file3 1.查看文件属性 [rootlinux-server ~]# lsattr file1 file2 file3 ---------------- file1 ---------------- file2 ---------------- f…

AI时代的产品文案秘籍:如何用AI提升效率

人工智能写作工具&#xff1a;解放双手&#xff0c;创作不停歇 在当前人工智能技术飞速发展的背景下&#xff0c;越来越多的个体已经开始利用这一AI写作工具&#xff0c;以显著提高自己的工作效率。这不仅标志着人工智能服务于人类的宏伟时代的到来&#xff0c;更是人人可用的创…

ArmSoM Rockchip系列产品 通用教程 之 CAN 使用

CAN 使用 1. CAN 简介 CAN (controller Area Network)&#xff1a;控制器局域网络总线&#xff0c;是一种有效支持分布式控制或实时控制的串行通信网络。 目前世界上绝大多数汽车制造厂商都采用CAN总线来实现汽车内部控制系统之间的数据通信。 RK3568/RK3588的CAN驱动文件&a…