文件上传复习(upload-labs 6-13关)

news/2024/11/19 17:34:29/

Pass-06(大小写绕过)

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

查看代码,发现又限制了好多后缀名

但是没有禁止phP 、Php,所以尝试将文件后缀大小写绕过限制

2005.Php

<?php
phpinfo();
?>

发现上传成功

注意:这里php版本选非nts版本的 才能成功

Pass-07(空格绕过黑名单)

$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",".ini");$file_name = $_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);//去除字符串::$DATAif (!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 . '文件夹不存在,请手工创建!';}
}

阅读代码发现  缺少了首尾去除空格的代码过滤  

利用PHP 和 Windows环境的叠加特性  windows系统自动删除文件名后缀的空格  绕过黑名单

所以我们上传.php文件进行抓包,然后在.php后面加上一个空格,这样我们上传的就是.php文件

然后直接放行

访问url,发现上传成功了

Pass-08(点绕过黑名单)

$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",".ini");$file_name = trim($_FILES['upload_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 . '文件夹不存在,请手工创建!';}

 查看代码,

和第七关同理 获取的最终文件后缀为“.” 不在黑名单里面

利用Windows系统保存文件的特性  会删除文件后缀名的xxx.php. 最后上传的文件还是xxx.php

所以直接抓包,然后在.php后面加上“.”

直接访问上传的文件的url,上传成功

Pass-09(::$DATA绕过黑名单)

查看代码,发现这一关黑名单没有对::$DATA 进 行 处 理  使用::$DATA 进行处理,可以使用::$DATA绕过黑名单

补充知识:php在window的时候如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持"::$DATA"之前的文件名

做法和前两关差不多,就是抓包后在.php文件后面加上“::$DATA”

但是访问url是发现报错回显:

注意访问路径中不含::$DATA

即可成功访问

在网址栏中删掉“::$DATA”后再进行访问,发现上传成功

Pass-10(点空格点绕过黑名单)

用.php. .绕过

我这里用 2005.php. .绕过

代码运行最后得到的后缀为"." 不在黑名单中 然而又用原来的2005.php. .来保存文件 由于windows在

文件命名中会自动删除.和空格 所以最终得到的是2005.php 因此绕过了黑名单限制

上传成功

Pass-11(双写php绕过黑名单)

现依旧是用上传的文件名来拼接路径并保存文件 没有对文件重命名

只是用了str_ireplace()函数来检测(此函数无视大小写) 如果文件名含有黑名单里面的字符串 就替换为空

但是只替换一次 并没有进行正则匹配或者是循环匹配敏感字符  因此只要双写php即可 因为是从左往右读的 所以替换为空后 还是php

所以pphphp、phphpp都可以尝试

这里我上传的是后缀为.pphphp文件,上传成功了

Pass-12(%00截断白名单)

本关提示:本pass上传路径可控!

代码漏洞点就在于 用$_GET['save_path']来组成上传的文件路径 而这个get传参是我们可以控制的地方

因此我们考虑用是否能进行截断 例如形成../upload/12.php/截断后面的(xxx.jpg)

这样就通过了白名单校验  并且保存成了php文件


这里就要用到0x00截断的知识

url中的%00(只要是这种%xx)的形式,webserver会把它当作十六进制处理,

然后把16进制的hex自动翻译成ascii码值“NULL”,实现了截断burpsuite中16进制编辑器将空格20改成了00。

本质上来说,都是利用0x00是字符串的结束标识符,进行截断处理。

只不过GET传参需要url编码成%00而已

原理:php的一些函数的底层是C语言,而move_uploaded_file就是其中之一,遇到0x00会截断,0x表示16进制,URL中%00解码成16进制就是0x00。

%00的使用是在路径上!

重要的话说三遍。如果在文件名上使用,就无法正常截断了。如:aaa.php%00bbb.jpg

 需要满足的条件

00截断的限制条件是PHP<5.3.29,且GPC关闭

因为当 magic_quotes_gpc 打开时,所有的 ' (单引号), " (双引号), \ (反斜线) and 空字符会自动转为含有反斜线的转义字符。

magic_quotes_gpc 着重偏向数据库方面,是为了防止sql注入,但magic_quotes_gpc开启还会对$_REQUEST, $_GET,$_POST,$_COOKIE 输入的内容进行过滤

直接上传.php文件,使用%00截断,然后抓包修改filename后面的文件后缀“.php”,将其改为“.jpg”

然后放包访问url

但是发现上传出错

查阅资料得知

00截断的条件:

php版本小于5.3.29

magic_quotes_gpc = Off

查看phpinfo(),发现magic_quotes_gpc处于打开状态

在php.ini文件中将magic_quotes_gpc的状态改成off

然后再按照之前的方法进行尝试

上传成功,访问url

发现错误,根据错误提示修改后再进行访问

访问成功,说明我们上传的文件上传成功了

Pass-13(0x00截断白名单)

同第12关做法相同 只不过上传路径在$_POST数据中 不需要url编码

这里说一个小技巧 不需要修改hex值那么麻烦 只要在burp里面输入%00 然后进行url解码即可 得到就是0x00

然后访问url,上传成功


http://www.ppmy.cn/news/1443675.html

相关文章

Android系统apk商城下载安装及安装认证源码分析

最终调用函数&#xff1a; installPackageWithVerificationAndEncryption 打印日志&#xff0c;看看安装轨迹&#xff1a; 代码流程如下&#xff1a; 行05729调用来这里了&#xff1a; 发送MCS_BOUND: 进入startCopy&#xff1a; 调用handleReturnCode&#xff1a; …

Spring Boot的启动过程深入了解

深入了解Spring Boot的启动过程不仅需要理论上的理解,结合代码示例更能直观地展现其实现细节。以下是一系列代码示例,配合文字说明,帮助您更深入地理解Spring Boot的启动过程: 一、Spring Boot启动入口 import org.springframework.boot.SpringApplication; import org.s…

【AI】Deepstream入门(2)Ubuntu20.04安装Deepstream

1、安装GPU驱动 本人显卡型号:RTX4060 Laptop(笔记本专用显卡) 【AI】惠普暗夜精灵9安装Ubuntu20.04+nvidia驱动 2、安装cuda、cuDNN 【AI】Ubuntu20.04安装cuda、cuDNN 3、安装TensorRT 1)下载 下载地址:https://docs.nvidia.com/deeplearning/tensorrt/archives/i…

MemFire解决方案-物联网数据平台解决方案

方案背景 随着各种通讯、传感技术发展&#xff0c;数据通讯成本的急剧下降&#xff0c;数以万亿计的智能设备&#xff08;智能手环、智能电表、智能手机、各种传感器设备等&#xff09;接入网络&#xff0c;并源源不断的产生海量的实时数据。这些海量数据的价值挖掘&#xff0…

Java集合框架-Collection-List-vector(遗留类)

目录 一、vector层次结构图二、概述三、底层数据结构四、常用方法五、和ArrayList的对比 一、vector层次结构图 二、概述 Vector类是单列集合List接口的一个实现类。与ArrayList类似&#xff0c;Vector也实现了一个可以动态修改的数组&#xff0c;两者最本质的区别在于——Vec…

免费语音转文字:自建Whisper,贝锐花生壳3步远程访问

Whisper是OpenAI开发的自动语音识别系统&#xff08;语音转文字&#xff09;。 OpenAI称其英文语音辨识能力已达到人类水准&#xff0c;且支持其它98中语言的自动语音辨识&#xff0c;Whisper神经网络模型被训练来运行语音辨识与翻译任务。 此外&#xff0c;与其他需要联网运行…

FPGA 以太网概念简单学习

1 MAC和PHY 从硬件的角度来说&#xff0c;以太网接口电路主要由 MAC &#xff08; Media Access Control &#xff09;控制器和物理层接口 PHY&#xff08;Physical Layer &#xff0c; PHY &#xff09;两大部分构成。 MAC 指媒体访问控制子层协议&#xff0c;它和 PHY 接…

C语言经典例题-5

1.交换数组 将数组A中的内容和数组B中的内容进行交换。(数组大小一样) #include <stdio.h>void swap(int arr1[],int arr2[], int sz) {int tmp 0;for (int i 0;i < sz;i){tmp arr1[i];arr1[i] arr2[i];arr2[i] tmp;} }void print(int arr1[], int arr2[], int…