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

news2024/11/17 17:35:47

君衍.

  • 一、环境搭建
  • 二、第一关 前端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来进行上传。
在这里插入图片描述
然后复制图片链接进行访问,即可执行:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt槽函数不响应的原因总结

Qt专栏&#xff1a;http://t.csdnimg.cn/LE2Lx 目录 1.问题 2.原因 2.1.没有继承QObject&#xff0c;声明Q_OBJECT宏 2.2.信号槽参数不匹配 2.3.信号函数未声明为 signals 2.4.访问权限 2.5.注意connect的位置&#xff0c;信号在创建信号槽连接前使用&#xff0c;则无法…

C#使用iText7将多个PDF文档合并为单个文档

使用HtmlAgilityPack抓取并分析网页内容&#xff0c;然后再调用PuppeteerSharp将网页生成PDF文件&#xff0c;最终的成果如下图所示&#xff0c;得到将近120个pdf文档。能看&#xff0c;但是不方便&#xff0c;需要逐个打开文档才能看到所需的内容&#xff0c;最好能将这些文档…

java 企业培训管理系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目

一、源码特点 java 企业培训管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…

Vulnhub靶机:basic_pentesting_2

一、介绍 运行环境&#xff1a;Virtualbox 攻击机&#xff1a;kali&#xff08;10.0.2.4&#xff09; 靶机&#xff1a;basic_pentesting_2&#xff08;10.0.2.7&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://download.vulnhub.c…

未来已来:智慧餐饮点餐系统引领餐饮业的数字化转型

时下&#xff0c;智慧餐饮点餐系统正在引领着餐饮业迈向更高的位置。今天&#xff0c;小编将与大家共同探讨智慧餐饮点餐系统的发展趋势、优势以及对餐饮业的影响。 一、智慧餐饮点餐系统的发展趋势 智慧餐饮点餐系统的出现填补了这一空白&#xff0c;它通过引入数字化技术&a…

基于springboot+vue的医院资源管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

IDEA-DeBug理论与实践

文章目录 01_Debug简介和意义02_IDEA中的Debug步骤03_跳转到当前代码执行的行04_步过调试的使用05_步入调试的使用06_强制步入调试的使用07_步出调试的使用08_回退断点调试的使用09_运行到光标处10_计算表达式11_条件断点12_多线程调试 在软件开发中&#xff0c;IDEA&#xff0…

让燃油车再次破防 比亚迪汉唐荣耀双出击

相信很多读者朋友都还记得&#xff0c;就在不久前趣味科技曾经报道&#xff0c;2024龙年伊始比亚迪就打着“电比油低”的旗号&#xff0c;推出了价格仅为7.98万元起的秦PLUS、驱逐舰05荣耀版&#xff0c;向合资燃油车发起了大举进攻。 这两款“7”字头售价的车型上市&#xff0…

<网络安全>《60 概念讲解<第七课 网络模型OSI对应协议>》

1 OSI模型 OSI模型&#xff08;Open Systems Interconnection Model&#xff09;是一个由国际标准化组织&#xff08;ISO&#xff09;提出的概念模型&#xff0c;用于描述和标准化电信或计算系统的通信功能&#xff0c;以实现不同通信系统之间的互操作性。该模型将通信系统划分…

智能驾驶规划控制理论学习-基于采样的规划方法

目录 一、基于采样的规划方法概述 二、概率路图&#xff08;PRM&#xff09; 1、核心思想 2、实现流程 3、算法描述 4、节点连接处理 5、总结 三、快速搜索随机树&#xff08;RRT&#xff09; 1、核心思想 2、实现流程 3、总结 4、改进RRT算法 ①快速搜索随机图&a…

每日一类:QString类深入讲解

QString类是Qt框架中的一个核心组件&#xff0c;设计用于方便、高效地处理Unicode字符串。与标准C中的字符串处理方式相比&#xff0c;QString提供了更为丰富的API&#xff0c;支持国际化&#xff0c;并且内部使用UTF-16编码&#xff0c;能够处理世界上几乎所有的语言文字。 设…

Python图像形态学处理:腐蚀、膨胀、礼帽、黑帽……

文章目录 二值形态学灰度形态学 python图像处理教程&#xff1a;初步&#x1f4f7;插值变换 最基础的形态学操作有四个&#xff0c;分别是腐蚀、膨胀、开计算和闭计算&#xff0c;【scipy.ndimage】分别实现了二值数组和灰度数组的这四种运算。而针对灰度图像&#xff0c;【sc…

android路由表APP,携程Android面试题

大家应该看过很多分享面试成功的经验&#xff0c;但根据幸存者偏差的理论&#xff0c;也许多看看别人面试失败在哪里&#xff0c;对自己才更有帮助。 最近跟一个朋友聊天&#xff0c;他准备了几个月&#xff0c;刚刚参加完字节跳动面试&#xff0c;第二面结束后&#xff0c;嗯&…

(案例贴2) html+css 倒计时器

欢迎大家使用这个计时器噢 老哥直接附代码咯. timer.html <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">&l…

python 小游戏《2048》字符版非图形界面

参考链接&#xff1a; 闲谈2048小游戏和数组的旋转及翻转和转置 目录 2048 一、方阵类 二、随机插入1或2 三、 合并和递增 四、 判断和移动 五、 键盘控制 完整源代码 玩法过程 2048 上回说到2048小游戏中数组的各种旋转、翻转的方法&#xff0c;就是为代码编程作准…

非阻塞实现高效键盘扫描功能(STM32F4XX)

目录 概述 1 原理分析 1.1 技术背景 1.2 系统硬件 1.3 STM32 IO&#xff08;输入模式&#xff09;寄存器分析 1.3.1 输入IO的功能描述 1.3.2 输入配置 1.3.3 GPIO 寄存器&#xff08;输入模式相关&#xff09; 1.3.3.1 GPIO 端口模式寄存器 1.3.3.2 GPIO 端口上拉/下拉…

VUE3自定义文章排行榜的简单界面

文章目录 一、代码展示二、代码解读三、结果展示 一、代码展示 <template><div class"article-ranking"><div class"header"><h2 class"title">{{ title }}</h2></div><div class"ranking-list&qu…

单片机精进之路-9ds18b20温度传感器

ds18b20复位时序图&#xff0c;先将b20的数据引脚拉低至少480us&#xff0c;然后再将数据引脚拉高15-60us&#xff0c;再去将测传感器的数据引脚是不是变低电平并保持60-240us&#xff0c;如果是&#xff0c;则说明检测到温度传感器&#xff0c;并正常工作。需要在240us后才能检…

默频,主频,睿频

一、默频 默频就是跟在CPU型号后面的数字&#xff0c;如图中的CPU,默频是1.7GHZ 二、主频 可以理解为在运行中&#xff0c;电脑根据程序的需要进行调度&#xff0c;此时CPU的实际频率&#xff0c;在任务管理器中可以查看&#xff0c;如我的笔记本电脑在没有连接电源的情况下&…

云计算 2月21号 (linux文件及用户管理)

一、文件管理 1.1快捷键 编辑命令&#xff1a; Ctrl a &#xff1a;移到命令行首 Ctrl e &#xff1a;移到命令行尾 Ctrl u &#xff1a;从光标处删除至命令行首 Ctrl k &#xff1a;从光标处删除至命令行尾 Ctrl w &#xff1a;从光标处删除至字首 Ctrl d &#x…