web安全漏洞之文件上传

文件上传


 

            1什么是文件上传

 

 

 

文件上传就比如上传用户头像,上传图片,上传附件等。在服务端实现文件上传功能时,如果对用户上传的文件没有做好处理,就有可能导致十分严重的安全问题,比如被上传木马文件造成RCE(远程代码执行)

 

php文件上传的基本代码

 

```php

<?php

 

$file=$_FILES['file'];

 

move _uploaded_file($file[' tmp_name'],$file[ 'name']);

 

echo $file['name'];

```

 

 

 

PHP的文件上传,通常使用$_FILES配合move_uploaded_file实现。如果直接使用用户的文件名作为保存的文件名,直接保存在web可访问的目录中,就造成了任意文件上传漏洞。

 

                2 文件名截断绕过

 

 

 

 1.00截断

 

00截断是很早之前的一种绕过上传限制的方法,需要PHP版本小于5.4.39.

 

00截断是move_uploaded file函数的第二个参数dest,在处理字符时,如果该字符串中间有“\x00”字符,会发生截断。比如"1.php\x00.jpg",因为PHP本身的字符串是二进制安全的(字符串可以保存\x00字符),在php代码中检测扩展名会获取到".jpg",但是在移动后会变成“1.php”

 

这种文件上传的00截断还有一个限制是,从$_FILES['file']['name’]中取出的文件是不包含"\x00"的,也就是说只有下面的代码才有可能出现00截断的文件上传漏洞。

 

```php

<?php

 

$file = $_FILEs['file'];

 

$dir =$_POST['dir'];

 

move_uploaded_file($file['tmp_name'],$dir.'/'.$file['name']);

 

echo $file['name'];

```

 

2.转换字符集造成的截断

 

虽然$_FILES['file’]['name]不会出现"x00"字符,但是在进行字符集转换时仍有可能发生截断。PHP实现字符集转换常用iconv()函数,UTF-8单字节允许的字符范围为"\x00"-"\x7f",如果被转换的字符不在该范围内,会造成PHP_ICONV_ERR_ILLEGAL_SEQ异常,在PHP版本小于5.4时,出现该异常后,就不会继续处理后续字符,造成截断。

 

          3文件扩展名黑名单绕过

 

 

 

在上传文件时,通过检测上传文件的扩展名是否在黑名单中,如果在黑名单中则拒绝上传。这种黑名单检测主要有两种场景。

 

 1.上传文件重命名

 

代码对上传的文件扩展名进行了检测,如果在黑名单中就拒绝上传。并且将上传的文件名进行了重命名。在这种场景下,可以使用一些较为冷门但可以被解析的扩展名进行绕过。

 

比如PHP的php3、php5、phtml、pht等(但是有限制,受限于web服务器,要求服务器能认识)。ASP可识别的有cdx、cer、asa等。JSP可识别的jspx等

 

还可以利用一些操作系统的特性,比如windows中的"php::$DATA","PHP"

 

2.上传文件不重命名

 

在这种场景下,除了利用一些冷门但可以解析的扩展名之外,还可以通过上传".htaccess"或".user.ini"等配置文件实现绕过。

a.上传.htaccess

".htaccess"是Apache服务器分布式配置文件的默认名称。在Apache主配置文件中通过"AllowOverride"指令配置”.htaccess”文件中可以广用哪些指令。在Apache低于"2.3.8"的版本中默认为"AI”,在高版本中为"None"。

在Apache版本小于2.3.8时,可以尝试上传".htaccess",使用"SetHandler"指令使PHP解析其他扩展名的文件。

 

```

l <FilesHatch "a png">

 

2 setHandler application/x-httpd-php

 

3 </FilesMatch>

```

 

b.上传.userini

自PHP 5.3.0起支持基于每个目录的".htaccess"风格的INI文件,此类文件仅被CGI/FastCGl处理,默认文件名为".user.ini"。为了保证安全性,".user.ini"不能覆盖"php.ini"中的所有配置。在"https://www.php.net/manual/zh/ini.list.php“中可以査看所有的配置选项的配置范围。

在PHP INIPERDIR可配置的选项中,存在一个特殊配置"auto_prepend file"

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

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

相关文章

Qt/C++ 海康SDK开发示例Demo

*** 工业相机在机器视觉中起到关键作用&#xff0c;本文基于海康 SDK 详细解读了设备连接与控制的各个步骤。内容涵盖设备枚举、句柄创建、图像采集回调以及设备异常处理&#xff0c;帮助开发者快速理解如何通过代码控制相机&#xff0c;实时采集并处理图像数据。*** 1. 搜索并…

探索 Python 的新边疆:sh 库的革命性功能

文章目录 **探索 Python 的新边疆&#xff1a;sh 库的革命性功能**第一部分&#xff1a;背景介绍第二部分&#xff1a;sh 库是什么&#xff1f;第三部分&#xff1a;如何安装 sh 库&#xff1f;第四部分&#xff1a;简单库函数使用方法1. 执行 ls 命令2. 使用 grep 搜索文件内容…

深度学习——前向传播与反向传播、神经网络(前馈神经网络与反馈神经网络)、常见算法概要汇总

文章目录 &#x1f33a;深度学习面试八股汇总&#x1f33a;前向传播与反向传播前向传播&#xff08;Forward Propagation&#xff09;反向传播&#xff08;Back Propagation&#xff09;总结 神经网络简介结构类型前馈神经网络&#xff08;Feedforward Neural Network, FFNN&am…

MySQL 中的索引下推功能

看到索引&#xff0c;应该大家都可以联想到这个是和查询效率有关系的&#xff0c;既然有这个功能&#xff0c;那么那句古话说的好啊&#xff1a;存在即合理。那么这个就是说有了这个功能&#xff0c;可以提升查询效率。 什么是索引下推 我们先有一个大概的理解&#xff1a;在…

#渗透测试#SRC漏洞挖掘# 操作系统-Linux系统之基本命令、资源耗尽脚本编写

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

软考中级 软件设计师 上午考试内容笔记(个人向)Part.1

软考上午考试内容 1. 计算机系统 计算机硬件通过高/低电平来模拟1/0信息&#xff1b;【p进制】&#xff1a; K n K n − 1 . . . K 2 K 1 K 0 K − 1 K − 2... K − m K n r n . . . K 1 r 1 K 0 r 0 K − 1 r − 1 . . . K − m r − m K_nK_{n-1}...K_2K_1K_0K…

IDA*算法 Power Calculus————poj 3134

目录 闲聊 前言 DFS算法的无效搜索 BFS算法的空间浪费 IDDFS A*算法 IDA* Power Calculus 问题描述 输入 输出 问题分析 代码 闲聊 前几周在忙着数学竞赛&#xff0c;所以就没时间更新&#xff0c;高等数学&#xff0c;一生之敌&#xff0c;真不知道报名的时候我是怎么想…

基于python深度学习技术矩阵分解的推荐系统,通过学习隐含特征,实现推荐

实现了一个基于矩阵分解的推荐系统&#xff0c;用于预测用户对电影的评分。具体来说&#xff0c;该程序通过TensorFlow构建和训练一个模型&#xff0c;来学习用户和电影之间的隐含特征&#xff0c;并根据这些特征预测评分。以下是代码的主要功能和步骤的详细描述&#xff1a; …

C++高级编程(8)

八、标准IO库 1.输入输出流类 1)非格式化输入输出 2)put #include <iostream> #include <string> ​ using namespace std; int main() {string str "123456789";for (int i str.length() - 1; i > 0; i--) {cout.put(str[i]); //从最后一个字符开…

EMC Plus:大电流注入传导抗扰度

大电流注入 &#xff08;BCI&#xff09; 是一种传导射频抗扰度测试&#xff0c;利用电流注入探头将调制信号引入电缆。其目的是复制设备运行环境中预期的电磁干扰 &#xff08;EMI&#xff09; 条件。在这里&#xff0c;我将为您提供一个使用 Ansys EMC Plus 进行大电流注入传…

《Java核心技术 卷I》JFrame组件中显示信息

组件中显示信息 JFrame结构复杂&#xff0c;由四层窗格&#xff0c;其中根窗格、层级窗格和玻璃窗格人们并不太关心&#xff0c;他们要用来组织菜单栏和内容窗格以及实现观感&#xff0c;Swing程序员最关心的是内容窗格(content pane)&#xff0c;添加到窗体的所有组件都会自动…

0x00基础算法 -- 0x01 位运算

资料来源&#xff1a;算法竞赛进阶指南活动 - AcWing 1、进制表示 二进制表示&#xff1a;m位二进制中&#xff0c;通常称最低位为第0位&#xff0c;从右到左以此类推&#xff0c;最高位为第m-1位。 常用十六进制表示的数字&#xff1a; 32位补码int&#xff08;十进制&#xf…

算法求解(C#)-- 寻找包含目标字符串的最短子串算法

1. 引言 在字符串处理中&#xff0c;我们经常需要从一个较长的字符串中找到包含特定目标字符串的最短子串。这个问题在文本搜索、基因序列分析等领域有着广泛的应用。本文将介绍一种高效的算法来解决这个问题。 2. 问题描述 给定一个源字符串 source 和一个目标字符串 targe…

Linux之Chronyd 时间服务器配置(Chronod Time Server Configuration in Linux)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…

【Ant Design Pro】如何实现组件的状态保存umi-plugin-keep-alive插件的使用

都知道vuejs里面帮我们实现了一个内置的keep-alive组件&#xff0c;给我们缓存一些组件的状态带来了很大的便利。但是在react中没有自带的实现&#xff0c;可以借助社区的插件umi-plugin-keep-alive来实现这个功能。 实现效果对比 未使用插件&#xff0c;可以看到我们在页面跳…

【数据结构】二叉排序树和平衡二叉树

目录 1. 二叉搜索树&#xff08;BST&#xff09; 1.1 二叉搜索树的定义及特点 1.1.1 定义 1.1.2 特点 1.2 二叉排序树的构造&#xff08;创建&#xff09; 1.2.1 基本思想 1.2.2 算法 1.3 二叉排序树的删除 2. 平衡二叉树&#xff08;AVL&#xff09; 2.1 为什么要用…

C++四种类型转换

C语言提供了四种类型转换 const_cast: 可以去除掉常量属性的类型转换 //const_cast const int a 10; double* p1 (double*)&a;//类型和原来的类型可以不一致&#xff0c;但是不安全 int* p2 const_cast<int*>(&a);//类型和原本的类型必须匹配 //<>中必…

【SPIE出版,往届稳定EI检索】2024智能视觉与数据建模国际学术会议(ICIVD 2024,12月13-15日)

2024智能视觉与数据建模国际学术会议 2024 International Conference on Intelligent Vision and Data modeling (ICIVD 2024) 重要信息 会议官网&#xff1a;www.iccaid.net 2024 International Conference on Intelligent Vision and Data modeling (ICIVD 2024)www.iccaid…

大模型的思维链提示

文章目录 思维链提示的基本形式思维链提示的优化策略关于思维链的进一步讨论思维链提示是一种高级提示策略,旨在增强大语言模型在各类复杂推理任务上的表现。常见的推理任务包括算术推理、常识推理以及符号推理等多种任务。与上下文学习方法仅使用⟨输入,输出⟩二元组来构造提…

JavaScript day01 笔记

一、引入方式 JavaScript 程序不能独立运行&#xff0c;它需要被嵌入 HTML 中&#xff0c;然后浏览器才能执行 JavaScript 代码。通过 script 标签将 JavaScript 代码引入到 HTML 中 1️⃣内部 通过 script 标签包裹 JavaScript 代码&#xff08;一般就写在</script>的…