IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> 3-7 【实验】21-数组配合windows特性绕过+代码审计 -> 正文阅读

[PHP知识库]3-7 【实验】21-数组配合windows特性绕过+代码审计

今天我们来讲pass-20,我们先进行上传测试,我们抓个包

在这里插入图片描述

然后我们repeater直接点上传

在这里插入图片描述

它提示我们禁止上传该类型文件,在之前绕过的方法里面,我们可以在Content-Type那边改,image/jpeg,然后我们在上传

在这里插入图片描述

提示我们文件上传成功,但是它是一个jpg的图片,我们要上传一个php的文件,说明后台的一个文件校验是通过Content-Type来进行的

我们先去读一下后台的文件代码

在这里插入图片描述

$allow_type = array('image/jpeg','image/png','image/gif');

首先允许上传的文件类型

if(!in_array($_FILES['upload_file']['type'],$allow_type)){
                $msg = "禁止上传该类型文件!";
            }

如果我们的type没有在allow_type里面的话,就提示禁止上传该类型文件

$file = empty($_POST['save_name']) ? $_FILES['upload_file']['name'] : $_POST['save_name'];

如果说save_name为空,就用upload_file,如果说不为空,就用POST[‘save_name’],所以说,我们save_name肯定不为空的,所以说,它用的就是我们的save_name

if (!is_array($file)) {
                    $file = explode('.', strtolower($file));
                }

判断file是否为数组,,如果是数组的话,代码继续执行,如果不是数组,就把它转化为数组,最终我们的file肯定是数组的类型

explode就是把字符串用点进行分隔,比方说,a.b.c,它数组下标为0就是a,下标为1就是b,它把它做成长度为3的一个数组

正常来说,我们上传的文件是a.php,那file里面就是有两个元素,一个是a,一个是php,

$ext = end($file);

取我们数组的最后一个元素,就是相当于取我们的后缀名

$allow_suffix = array('jpg','png','gif');
if (!in_array($ext, $allow_suffix))
    $msg = "禁止上传该后缀文件!";
                }

如果说ext在array里面,那就走下面,如果不存在禁止上传,到这边,没有出什么问题

$file_name = reset($file) . '.' . $file[count($file) - 1];

关键在这段代码,首先这串代码,要生成保存的文件名,首先file数组,reset如果成功取数组的第一个,如果不成功,返回false,正常来说,我们的后缀名是a.php的话,这个时候reset($file)返回的应该是a,加个点,在加p一个点,就是a,p一个点,count取这个数组长度,正常来说,这个长度是2,2-1为1,下标为1,就是p,就是说,文件名点后缀名组成了这个a.php,这个-1,大家一定要注意,是从下表为1开始的,比如说,它数组元素有3个,那它的count就是3,但是你取最后一个数组,它的下标应该是2

把save_name做成数组,就不用分割了,数组里面的内容也可控,我们就能够绕过这段话,我们试一下

Content-Disposition: form-data; name="save_name"

upload-20.jpg
-----------------------------35832086831626

我们把这段话ctrl+c,ctrl+v,把save_name做成数组,数组下标为0,在我们reset的时候,下标为php,因为这边不写php,后边,没有机会了,因为file[count($file) - 1]写php是不行的,因为在end($file)有个校验,我们叫它yijuhua.php

在这里插入图片描述

这里我们要用到数组里面的一个表示方式

array(2){

[0]=>

string(6) "20.php"

[2]=>string(3) "jpg"

}

首先我们0的时候是20.php,当它是2的时候是jpg,也就是它长度是2,但它reset取的时候,肯定是取0,但如果我们是3个的时候,[count($file) - 1]就是2,取2,那它值是个jpg,这样子绕不过去

这个时候我们就要用到php的一个特性,我们在写的时候,只写0跟2,array(2)长度是2,[count($file) - 1]就是1,1没有呀,返回空,那就是2.php.空,就组成了新的扩展名

我们知道在windows里面,生成文件的时候,末尾的点是被抹掉的

这样就非常巧妙的绕过了后台的写法,我们在请求方法里面,save_name[2],文件名jpg

在这里插入图片描述

这样子我们就可以绕过所有的代码了,我们点go

在这里插入图片描述

上传成功,我们在浏览器里面访问一下

在这里插入图片描述

我们在菜刀里面连接一下

在这里插入图片描述

OK

我们在不看后台代码的情况下,很难分析到前台的利用方法,所以说,还是要以分析代码为主

其实这20个上传方式,只是我们文件上传的冰山一脚,上传的方式、种类的多少,关键在于我们开发人员写代码的花样有多多,不同的花样,肯定有不同的方式,所以说,我们还是要多关注代码,多积累经验,才能知道,我们有那些绕过方式,在我们渗透测试的时候,不断的去试错,按照我们的经验去尝试很多种绕过方法,然后最终进行绕过,上传

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2022-04-09 18:04:45  更:2022-04-09 18:05:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 6:17:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码